Java 在htmlunit中选择下拉菜单

Java 在htmlunit中选择下拉菜单,java,jython,htmlunit,Java,Jython,Htmlunit,我在jython中使用htmlunit,在选择下拉链接时遇到问题。我将要访问的页面有一个包含其他ajax链接的表,我可以点击它们并四处移动,看起来还可以,但我似乎不知道如何点击一个下拉菜单,允许页面上有更多链接(这个下拉菜单会影响ajax表,所以它不会重定向我或其他任何东西) 这是我的密码: selectField1 = page.getElementById("pageNumSelection") options2 = selectField1.getOptions() theOpti

我在jython中使用htmlunit,在选择下拉链接时遇到问题。我将要访问的页面有一个包含其他ajax链接的表,我可以点击它们并四处移动,看起来还可以,但我似乎不知道如何点击一个下拉菜单,允许页面上有更多链接(这个下拉菜单会影响ajax表,所以它不会重定向我或其他任何东西)

这是我的密码:

    selectField1 = page.getElementById("pageNumSelection")
options2 = selectField1.getOptions()
theOption3 = options2[4]
这得到了我想要的选项,我验证了它的正确性。所以我选择它:

MoreOnPage = selectField1.setSelectedAttribute(theOption3, True)
我被困在这里(不确定选择它是否有效,因为我没有收到任何消息,但我不确定下一步该怎么做。如何刷新页面以查看更大的列表?单击链接时,您所要做的就是找到链接,然后选择linkNameVariable。单击()但我不知道如何刷新下拉列表。当我尝试使用webclient根据select变量创建xml页面时,仍然会得到旧页面

为了让它更简单,我使用了htmlunit scripter,得到了一些应该可以工作的代码,但它是java的,我不确定如何将它移植到jython。下面是:

 try
      {
           page = webClient.getPage( url );

           HtmlSelect selectField1 = (HtmlSelect) page.getElementById("pageNumSelection");
           List<HtmlOption> options2 = selectField1.getOptions();
           HtmlOption theOption3 = null;
           for(HtmlOption option: options2)
           {
                if(option.getText().equals("100") )
                {
                     theOption3 = option;
                     break;
                }
           }
           selectField1.setSelectedAttribute(theOption3, true );
试试看
{
page=webClient.getPage(url);
HtmlSelect selectField1=(HtmlSelect)page.getElementById(“pageNumSelection”);
List options 2=selectField1.getOptions();
HtmlOption选项3=null;
用于(HtmlOption选项:选项2)
{
if(option.getText()等于(“100”))
{
选项3=选项;
打破
}
}
选择字段1。设置所选属性(选项3,true);

这并不是问题的真正答案,因为我以前很少使用HtmlUnit,但您可能想看看,尤其是。使用Selenium RC,您可以控制与本机浏览器(例如Firefox)中显示的页面的交互。它有针对Java和Python的开发人员API

我知道HtmlUnit使用自己的javascript和web浏览器渲染引擎,我想知道这是否是一个问题。

确保调用了该引擎。文档似乎表明默认情况下它处于打开状态,但我认为这是错误的

或者,您可以使用,这是一个同时支持HtmlUnit和Selenium的框架。我个人觉得语法比HtmlUnit更容易处理。

看看HtmlForm

HtmlSelect HtmlSelect=form.getSelectByName(“stuff[1].type”)

HtmlOption HtmlOption=htmlSelect.getOption(3)

htmlOption.setSelected(true)


如果我理解正确,选择框中的选项会触发AJAX调用,一旦完成,就会修改页面的某些部分

这里的问题是,根据定义,AJAX是异步的,因此您无法真正知道调用何时完成以及何时可以再次检查页面以查找新内容

HtmlUnit有一个名为的类,您可以将它的实例传递给WebClient的方法。如javadoc中所示,使用此ajax控制器将自动使来自直接用户交互的异步调用同步而不是异步。一旦调用setSelectedAttribute方法,您将能够看到e更改为原始页面


另一种选择是在完成选择后使用WebClient的方法,并在后台JavaScript结束或达到超时后检查页面。

感谢Bennettweb的回复。我查看了Selenium,但它似乎不是无头的,我正在无头linux环境中运行它。您仍然可以在通过为linux headless环境指定要连接的虚拟显示器,在linux headless环境中使用headless模式。然后,您可以使用WebDriver,如其他一些答案中所述,连接到Firefox。