Selenium WebDriver- FindElements返回未显示的元素

时间:2013-05-07 03:26:04

标签: java selenium-webdriver

使用Eclipse,TestNG和Selenium 2.32。

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

代码driver.findElements(By.xpath("//li[@role='option']"));返回所有未显示的元素。以上&#39;元素选项&#39;现在包含所有元素,甚至包含未在网页中显示的元素。我们可以使用IsDisplayedfindElement方法,它只返回网页中显示的元素。是否有与IsDisplayed类似的内容可以与findElements一起使用,它只会返回显示的元素?

2 个答案:

答案 0 :(得分: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']"));

或者在致电FindElements时使用Linq:

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;
}

答案 1 :(得分: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'))]"));