2013-05-07 69 views
4

使用Eclipse,TestNG和Selenium 2.32。Selenium WebDriver- FindElements返回不顯示的元素

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

代碼driver.findElements(By.xpath("//li[@role='option']"));返回其全部不顯示,以及所述元素。上面的'elementOption'現在包含了所有的元素,甚至包含了網頁中沒有顯示的元素。我們可以使用IsDisplayed以及findElement方法,該方法將只返回網頁中顯示的元素。是否有與IsDisplayed類似的東西,可以與findElements一起使用,它只會返回顯示的元素?

+1

能告訴我爲什麼你不想使用'isDisplayed'? – vidit 2013-05-07 03:32:23

+0

它不是我不想使用isDisplayed,但如何使用isDisplayed與findElements?在findElement中,我們可以使用它作爲driver.findElement.isDisplayed,但在findElements中,我沒有看到這個方法。請幫忙 – user2356679 2013-05-07 22:21:52

+0

感謝您的想法。 – user2356679 2013-05-10 00:37:12

回答

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(); 

不過,我是知道的擴展方法和LINQ唐在Java中不存在。所以你可能需要用同樣的邏輯創建你自己的靜態方法/類。

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

如果您試圖檢索的元素包含類似具有顯示值的樣式的屬性,那麼您可能需要更改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'))]"));