2012-03-07 171 views
8

我在我的網站上有一個選擇控件。我正在使用頁面對象與頁面進行交互。如果我做(我的同班同學下的第一個2線和我的方法selectByValueselenium webdriver select元素

@FindBy(id="foo") 
private Select foo; 

foo.selectByValue("myValue"); 

它失敗,一個空指針。我也試過沒有@FindBy

現在,如果我這樣做,在我的方法這一切工作正常,並選擇正確的項目

Select foo = new Select(sDriver.findElement(By.id("foo"))); 
foo.selectByValue("myValue"); 

這裏是該控件的實際網頁片斷(編輯以保護無辜者)

<select id="foo" name="service_name"> 
    <option selected="selected" value="one">one</option> 
    <option value="two">two</option> 
    <option value="three">three</option> 
</select> 

讓我說,我有一個解決我的問題我不明白爲什麼「正常」路徑無法正常工作。

回答

17

那是因爲Select類有這樣的構造:

Select(WebElement element) 

Javadoc

所以,如果你做這樣的事情:

@FindBy(id="foo") 
private WebElement wannabeSelect; 
Select realSelect = new Select(wannabeSelect); 
realSelect.selectByValue("myValue"); 

它應該工作。

順便說一句,我在「解決方法」中使用相同的方法,因爲我不想在需要選擇對象時投射新的WebElement對象。但不管怎麼說,在

sDriver.findElement(By.id("foo")); 

回報WebElement,所以這就是爲什麼它的工作。你也可以這樣做:

WebElement wannabeSelect = sDriver.findElement(By.id("foo")); 
Select foo = new Select(wannabeSelect); 
+0

啊這是有道理的,它只是看起來像它應該有工作,所以我從來沒有真的很深入。我的錯。謝謝 – ducati1212 2012-03-07 15:48:42

+0

注意:如果您在您的類中包含Select聲明並將其轉換到專用WebElement聲明的下面,那麼當類實例化時,您將獲得運行時錯誤;爲了避免這種情況,可以將Select聲明和類放入與屏幕控件進行交互的方法中。再次不理想,但它似乎工作。 – 2013-04-30 10:53:04

+0

使用這種方法,頁面對象應該在頁面完全加載並且該對象存在並且在驅動程序中可見後進行初始化。爲了讓它代理,請看看[我的實現](http://stackoverflow.com/questions/35931667/select-object-on-seleniums-pagefactory/36004572#36004572) – rrw 2016-03-17 00:45:16

2

有兩種方法可以選擇該選項的值:

一:

// Denotes option value - technical name 
select.selectByValue(fieldValue);  

二:

// Denotes option text that is actually visible to be selected 
select.selectByVisibleText(fieldValue); 
+0

和select.selectByIndex(intValue) – dmeehan 2014-09-02 08:46:47

1

我其他方式實現這是通過使用下面的方法爲我所有的onchange下拉列表框。通過ID和選擇和它的作品

public void onchangedropdownselection(String object, String value) { 
     driver.findElement(By.id(object)).sendKeys(value); 
     driver.findElement(By.id(object)).sendKeys(Keys.UP); 
     driver.findElement(By.id(object)).sendKeys(Keys.DOWN); 
    } 

這樣做上下我們initialzing腳本的onchange .......