我在jython中使用htmlunit并且无法选择下拉链接。我要去的页面有一个带有其他ajax链接的表,我可以点击它们并四处移动它看起来没问题,但我似乎无法弄清楚如何点击下拉菜单,允许更多的链接page(此下拉菜单影响ajax表,因此它不会重定向我或任何东西)。
这是我的代码:
selectField1 = page.getElementById("pageNumSelection")
options2 = selectField1.getOptions()
theOption3 = options2[4]
这得到了我想要的选项,我验证了它的正确性。所以我选择它:
MoreOnPage = selectField1.setSelectedAttribute(theOption3, True)
我被困在这里(不确定选择它是否有效,因为我没有收到任何消息,但我不知道下一步该做什么。如何刷新页面以查看更大的列表?点击链接所有你需要做的就是找到链接,然后选择linkNameVariable.click()到一个变量,它可以工作。但我不知道如何刷新下拉。当我尝试使用webclient创建一个xml基于select变量的页面,我仍然得到旧页面。
为了使它更容易一点,我使用了htmlunit脚本编写器并得到了一些应该可以工作的代码,但它的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 );
答案 0 :(得分:3)
查看HtmlForm getSelectedByName
HtmlSelect htmlSelect = form.getSelectByName(“stuff [1] .type”);
HtmlOption htmlOption = htmlSelect.getOption(3);
htmlOption.setSelected(真);
答案 1 :(得分:2)
确保调用WebClient.setJavaScriptEnabled。文档似乎表明它默认打开,但我认为这是错误的。
或者,您可以使用WebDriver,这是一个支持HtmlUnit和Selenium的框架。我个人觉得语法比HtmlUnit更容易处理。
答案 2 :(得分:1)
如果我理解正确,在选择框中选择一个选项会触发一个AJAX调用,一旦完成,就会修改页面的某些部分。
问题在于,由于AJAX根据定义是异步的,因此您无法真正知道呼叫何时结束以及何时可以再次检查页面以查找新内容。
HtmlUnit有一个名为NicelyResynchronizingAjaxController
的类,您可以将该实例传递给WebClient的setAjaxController
方法。如javadoc所示,使用此ajax控制器将自动使来自直接用户交互的异步调用同步而非异步。一旦调用了setSelectedAttribute方法,您就可以看到对原始页面所做的更改。
另一个选择是在选择完成后使用WebClient的waitForBackgrounfJavascript
方法,并在后台JavaScript结束或超时后检查页面。
答案 3 :(得分:0)
这不是问题的答案,因为我之前没有使用过很多HtmlUnit,但您可能希望查看Selenium,特别是Selenium RC。使用Selenium RC,您可以控制与本机浏览器中显示的页面的交互(例如Firefox)。它有Java和Python等开发人员API。
据我所知,HtmlUnit使用自己的javascript和网络浏览器渲染引擎,我想知道这是否有问题。