2013-08-20 61 views
0

我有一個網站上的下拉列表,當點擊一個選項時,使用javascript導航到新的配置文件。問題是,我不認爲HtmlUnit的Option在下拉框中點擊選項,只選擇它,所以它不會導航到新頁面。我知道它正在找到正確的下拉元素,因爲我已經在網頁的源代碼中確認了它。我也使用getOption()和使用索引4的下拉框,所以getOption(4),但這可能是一個問題?我也嘗試了值和ID,但這似乎是唯一不會給我一個錯誤的方法。我還添加了一個Thread.sleep,以確保它有時間導航到下一個頁面,以防出現問題,但我認爲它沒有幫助。因此,爲了包裝起來,我需要它實際點擊其中一個選項才能導航,但click()似乎不起作用?HtmlUnit Java - HtmlOption未正確選擇選項

這裏是我的代碼的HtmlUnit:

public static void changeIntensity(String value) throws IOException { 
    try { 

     final WebClient webClient = new WebClient(BrowserVersion.CHROME); 
     DefaultCredentialsProvider creds = new DefaultCredentialsProvider(); 
     creds.addCredentials(Main.USERNAME, Main.PASSWORD); 
     webClient.setCredentialsProvider(creds); 
     final HtmlPage page = webClient.getPage("http://192.168.1.30/profiles.sht"); // nav to profiles 
     System.out.println("Logged into AquaController."); 
     HtmlSelect select = (HtmlSelect) page.getElementByName("profileSel"); // this is for sure correst, i checked in profiles.asp == also, i tried a diff one and it said out of range, so this is correct. 
     System.out.println("Selected profile dropdown box."); 
     HtmlOption option = select.getOption(4); // select blue 20 (its profule #12) - no use getOptionByText 
     select.setSelectedAttribute(option, true); 
     System.out.println("Selected option."); 
     System.out.println("Thread sleeping for 5"); 
     Thread.sleep(5000); 
     System.out.println("Thread done sleeping for 5"); 
     HtmlInput pMin = page.getElementByName("profileLMin"); // min intensity - name = 
     HtmlInput pMax = page.getElementByName("profileLMax"); // max intensity 
     pMin.click(); 
     pMin.setValueAttribute(value); 
     pMax.click(); 
     pMax.setValueAttribute(value); 
     HtmlElement updateProfile = page.getElementByName("Update"); 
     updateProfile.click(); 
     System.out.println("finished"); 
    } 
    catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

這裏是有關網站源:

<div id='title'> 
<br> 
<h2>Apex Profile Setup</h2> 
<br> 
</div> 
<script type="text/javascript"> 
leafHeight = 220; 
//if (window.addEventListener){ 
// window.addEventListener("load", autoInit, false); 
//} 
//else if (window.attachEvent){ 
// window.attachEvent("onload", autoInit); 
//} 

function autoInit() 
{ 
    var selector = document.getElementsByName("profileTypeSel"); 
    showLeaf(1, selector[0].selectedIndex+1); 
    init(); 
} 

function updatepSelect() { 
document.pSelect.submit("profiles.sht"); 
} 


<P> 
<form name="pSelect" method="post" action="profiles.sht">Profile:&nbsp; 
     <select class="tbflat" name="profileSel" onchange="updatepSelect();" ><option selected value="1">&nbsp;BlueUP (PF1)&nbsp;</option><option value="2">&nbsp;BluePK (PF2)&nbsp;</option><option value="3">&nbsp;BlueDN (PF3)&nbsp;</option><option value="4">&nbsp;Moon (PF4)&nbsp;</option><option value="5">&nbsp;WhiteUP (PF5)&nbsp;</option><option value="6">&nbsp;WhitePK (PF6)&nbsp;</option><option value="7">&nbsp;WhiteDN (PF7)&nbsp;</option><option value="8">&nbsp;WaveLFT (PF8)&nbsp;</option><option value="9">&nbsp;WaveRGT (PF9)&nbsp;</option><option value="10">&nbsp;CalmLFT (PF10)&nbsp;</option><option value="11">&nbsp;CalmRGT (PF11)&nbsp;</option><option value="12">&nbsp;Blue20 (PF12)&nbsp;</option><option value="13">&nbsp;White20 (PF13)&nbsp;</option><option value="14">&nbsp;Blue30 (PF14)&nbsp;</option><option value="15">&nbsp;White30 (PF15)&nbsp;</option><option value="16">&nbsp;Blue40 (PF16)&nbsp;</option><option value="17">&nbsp;White40 (PF17)&nbsp;</option><option value="18">&nbsp;Blue50 (PF18)&nbsp;</option><option value="19">&nbsp;White50 (PF19)&nbsp;</option><option value="20">&nbsp;Blue60 (PF20)&nbsp;</option><option value="21">&nbsp;White60 (PF21)&nbsp;</option><option value="22">&nbsp;Blue70 (PF22)&nbsp;</option><option value="23">&nbsp;White70 (PF23)&nbsp;</option><option value="24">&nbsp;Blue80 (PF24)&nbsp;</option><option value="25">&nbsp;White80 (PF25)&nbsp;</option><option value="26">&nbsp;Blue90 (PF26)&nbsp;</option><option value="27">&nbsp;White90 (PF27)&nbsp;</option><option value="28">&nbsp;Blue100 (PF28)&nbsp;</option><option value="29">&nbsp;White100 (PF29)&nbsp;</option><option value="30">&nbsp;PF30 (PF30)&nbsp;</option><option value="31">&nbsp;PFSDBlue (PF31)&nbsp;</option><option value="32">&nbsp;PFSDWhit (PF32)&nbsp;</option></select> 
    <input name="profileID" id="profileID" type="hidden" value="1"> 
    <input name="compact" type="hidden" id="compact" value="0"> 
    </form> 
     <form name="pUpdate" method="post" action="/profiles.sht"><table border="1"> 
      <input name="compact" type="hidden" id="compact" value="0"> 
      <tr><td><P>Profile Name&nbsp;</td> 
      <td><input class="tbflat" name="profileName" size="15" maxlength="25" tabindex="1" value="BlueUP"></td></tr> 
      <tr><td>Control Type &nbsp;</td> 
      <td><select class="tbflat" name="profileTypeSel" onChange="showLeaf(1, this.options[this.selectedIndex].value)"><option value="1">&nbsp;Pump&nbsp;</option><option selected value="2">&nbsp;Ramp&nbsp;</option><option value="3">&nbsp;Vortech&nbsp;</option><option value="4">&nbsp;Weather&nbsp;</option> 
      </select></td></tr> 
      <tr><td colspan="2"> 

回答

0

我不得不承認我不太看所有的代碼,但這裏有一些評論。

我相信HtmlUnit確實選擇了這個選項。通過「選擇」我的意思是它將表單的選擇字段設置爲選定的值。

現在,棘手的部分是,您已附加了一段javascript到onchange事件。當談到JS ... HtmlUnit是不可預知的。這取決於很多因素,但根據我的經驗,玩BrowserVersion的不同值有很大幫助。

此外,您應該考慮到您所說的click事件可能不會觸發onchange。我會嘗試手動啓動特定的方法。

調試提示:嘗試執行JS,你期望onchange事件在WebClient中觸發,看看它是否提供了預期的結果。