2013-11-22 1 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. По-видимому, Селен этого не поддерживает. Есть ли способ выбрать только видимые элементы с помощью 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 для видимости или скрытия? Это было бы так, как вы могли бы отличить. Вы также попробовали селектор: enabled? – 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 секунд в описанном выше случае) .

Смежные вопросы