2011-03-19 226 views
2

我在jython中使用htmlunit,并且无法选择下拉链接。我要去的网页有一个带有其他ajax链接的表格,我可以点击它们并移动,看起来没问题,但我似乎无法弄清楚如何点击一个允许更多链接的下拉菜单(这个pulldown会影响ajax表,所以它不会重定向我或任何东西)。在htmlunit中选择下拉菜单

这里是我的代码:

selectField1 = page.getElementById("pageNumSelection") 
options2 = selectField1.getOptions() 
theOption3 = options2[4] 

这得到我想要的选项,我验证其右。所以我选择它。

MoreOnPage = selectField1.setSelectedAttribute(theOption3, True) 

,我坚持在这里(不知道如果选择它工作与否,因为我没有得到任何消息,但我不知道下一步该怎么做我如何刷新该页面看到更大的列表?当点击链接时,你所要做的就是找到链接,然后选择linkNameVariable.click()到一个变量,它的工作原理,但我不知道如何刷新下拉。尝试使用Web客户端来创建基于选择变量的XML页面,我仍然得到旧的一页。

,使其更容易一点,我用的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); 

回答

3

看一看HtmlForm控件 getSelectedByName

HtmlSelect htmlSelect = form.getSelectByName( “东西[1] .TYPE”);

HtmlOption htmlOption = htmlSelect.getOption(3);

htmlOption.setSelected(true);

0

这是不是一个真正的问题的答案,因为我没有用之前的HtmlUnit很多,但你可能想看看Selenium,特别是Selenium RC。通过Selenium RC,您可以控制与本地浏览器中显示的页面的交互(例如Firefox)。它拥有Java和Python等开发者API。

据我所知,HtmlUnit使用自己的JavaScript和Web浏览器渲染引擎,我想知道这是否可能是一个问题。

+0

感谢您的回复Bennettweb。我研究了Selenium,但它似乎并没有头脑,我正在无头的Linux环境中运行它。 – Lostsoul 2011-03-24 03:37:51

+0

您仍然可以在您的linux无头环境中以无头模式运行Firefox,方法是指定要连接的虚拟显示器。然后,您可以使用WebDriver作为连接到Firefox的其他一些答案中的提及。 – 2013-02-27 11:11:06

2

确保WebClient.setJavaScriptEnabled被调用。该文件似乎表明,它默认情况下,但我认为这是错误的。

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

1

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

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

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

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