2013-11-22 167 views
4

我使用頁面對象映射在一個頁面中的元素,這樣的事情:硒CSS選擇器:可見不是一個有效的選擇

public class MyPage { 

    protected WebDriver driver; 

    @FindBy(css = "a[data-code=panel]:visible") 
    private WebElement cpaneladmin; 

    public MyPage(WebDriver driver) { 
     this.driver = driver; 
     PageFactory.initElements(this.driver, this); 
    } 
} 

問題是這樣的:visible CSS選擇器。另外,Selenium不支持它。有沒有辦法使用xpath或其他類型的CSS選擇器只選擇可見的元素?

感謝

+0

':visible'不是一個CSS選擇器,它是一個Sizzle選擇器。那是你的問題。 – Arran

回答

4
@FindBy(css = "a[data-code=panel]") 
private List<WebElement> cpaneladmin; 

然後遍歷元素,直到找到顯示的元素。

public WebElement FindDisplayed(WebElements elements) 
{ 
    foreach (WebElement element in elements) 
    { 
     if (element.isDisplayed()) // correct method: isDisplayed() 
      return element; 
    } 
} 
+0

謝謝,這個問題解決了! – caarlos0

1

This應該回答你的問題。

如果要驗證元素是否以另一種方式可見,請使用element.IsDisplayed()或使用ExpectedConditions。

+0

如果我有兩個匹配選擇器的元素,一個可見和其他隱藏,我該怎麼辦? – caarlos0

+0

這兩個元素碰巧具有可見或隱藏的css值嗎?那將是你如何區分的。你還嘗試過:啓用選擇器嗎? – NaviSaysListen

1

這可能會解決你的問題,

List<WebElement> list = driver.findElements(By.cssSelector("selector_that_matches_one__or_more_elements")); 
//do what ever you want with the elements in list 

上面的代碼將存儲所有可通過所提供的選擇位於可見的元素。
在代碼的開頭嘗試使用implicit wait,以使上述語句更有效。

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

當隱式地等待,findElements()方法將盡快有找到的集合中的多於0項返回,或將返回一個空列表如果超時(在上述情況下30秒)到達了。

相關問題