2012-03-07 138 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 .......