2011-03-19 231 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結束或達到超時時檢查他的頁面。