Selenium WebDriver 选择元素

11

我在我的网站上有一个选择控件。我正在使用页面对象与页面进行交互。如果我在我的类下面的前两行和我的方法中使用selectByValue,那么...

@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>

让我说一下,我有一种解决方法来解决我的问题,但是我不明白为什么“正常”的路径不起作用。

3个回答

25

这是因为 Select 类有以下构造函数:

Select(WebElement element)

请参见Javadoc

如果你做了这样的事情:

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

它应该能够工作。

顺便说一下,我在“解决方法”中使用的是与您相同的方法,因为当我需要Select对象时,我不想强制转换新的WebElement对象。但无论如何,

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

返回 WebElement ,这就是为什么它起作用的原因。你也可以这样做:

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

啊,那就说得通了。只是看起来应该可以工作,所以我从未深入挖掘。这是我的错。谢谢。 - ducati1212
注意:如果您在私有WebElement声明下方包含Select声明和转换,则在实例化类时会出现运行时错误;为避免此问题,您可以将Select声明和类放在与屏幕控件交互的方法中。再次强调,这并不是理想的解决方案,但似乎可以工作。 - Vince Bowdren
采用这种方法,页面对象应在页面完全加载后进行初始化,并且该对象在驱动程序中存在且可见。要将其代理,请查看我的实现 - rrw

2
有两种方法可以选择选项值:
一:

方式一:

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

第二个:

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

select.selectByIndex(intValue):选择.selectByIndex(intValue)。 - dmeehan

1
我实现此功能的另一种方法是对于所有我的onchange下拉选择框使用以下方法。传递id和选择即可。
public void onchangedropdownselection(String object, String value) {
        WebElement obj = driver.findElement(By.id(object));
        obj.sendKeys(value);
        obj.sendKeys(Keys.UP);
        obj.sendKeys(Keys.DOWN);
    }

通过上下移动,我们正在初始化onchange脚本......

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接