使用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;现在包含所有元素,甚至包含未在网页中显示的元素。我们可以使用IsDisplayed
和findElement
方法,它只返回网页中显示的元素。是否有与IsDisplayed
类似的内容可以与findElements
一起使用,它只会返回显示的元素?
答案 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'))]"));