4

我正在使用 Eclipse、TestNG 和 Selenium 2.32。

List <<f>WebElement> elementOption = driver.findElements(By.xpath("//li[@role='option']"));

该代码driver.findElements(By.xpath("//li[@role='option']"));还返回所有未显示的元素。上面的 'elementOption' 现在包含了所有元素,甚至是网页中没有显示的元素。我们可以使用IsDisplayedwithfindElement方法,它只返回网页中显示的元素。有没有类似的东西IsDisplayed可以用来findElements只返回显示的元素?

4

2 回答 2

2

在 C# 中,您可以像这样创建 WebDriver 扩展方法:

public static IList<IWebElement> FindDisplayedElements<T>(this T searchContext, By locator) where T : ISearchContext {
    IList<IWebElement> elements = searchContext.FindElements(locator);
    return elements.Where(e => e.Displayed).ToList();
}
// Usage: driver.FindDisplayedElements(By.xpath("//li[@role='option']"));

或者在调用时使用 Linq FindElements

IList<IWebElement> allOptions = driver.FindElements(By.xpath("//li[@role='option']")).Where(e => e.Displayed).ToList();

但是,我知道 Java 中不存在扩展方法和 Linq。因此,您可能需要使用相同的逻辑创建自己的静态方法/类。

// pseudo Java code with the same logic
public static List<WebElement> findDisplayedElements(WebDriver driver, By locator) {
    List <WebElement> elementOptions = driver.findElements(locator);
    List <WebElement> displayedOptions = new List<WebElement>();
    for (WebElement option : elementOptions) {
        if (option.isDisplayed()) {
            displayedOptions.add(option);
        }
    }
    return displayedOptions;
}
于 2013-05-07T03:44:12.953 回答
1

如果您尝试检索的元素包含具有显示值的样式等属性,那么您可能只需要更改 XPATH 以仅获取显示的元素。

List <WebElement> elementOption = driver.findElements(By.xpath("//li[@role='option'][contains(@style,'display: block;')]"));

或者

List <WebElement> elementOption = driver.findElements(By.xpath("//li[@role='option'][not(contains(@style,'display: none'))]"));
于 2016-12-08T12:15:12.220 回答