как в List<WebElement> получить только видимые на странице элементы?

В Chrome можно сделать вот так $(’#flights-to .col1:visible’) и отобразятся только видимые элементы, а как такое можно сделать в selenium?

Во первых браузер не имеет значение, так-как твой пример это относится к библиотеки JQuery. А исходя из того что JQuery принимает только CSS локаторы, то, то что ты написал в кавычках примера это он и есть!

@FindBy(css = “#flights-to .col1:visible”)
public List airFrom;

но я просто в аннотацию не могу ведь вставить запись?

Тут не подскажу, работаю на другом фреймворке (Codeception) используется РНР.

Ты попробуй, а в целом это полноценно работающий css локатор который может не работать в ie8-9. И он не поддерживается selenium - да

А лучше перед .col1 ставь наименование тега, чаще всего это помогает

@FindBy(css = “#flights-to td.col1:visible”) вот с такой записью падает,

на http://www.w3schools.com/cssref/css_selectors.asp такой штуки как visible нет, я попробывал у себя :enabled, но тоже чёт не заработало… дичь какая-то, что-то в них более тонкое

Может у класса td.col1 есть ещё один класс который отвечает за видимость? Или может есть display=“true/block/bla-bla” или ещё какой-либо атрибут для видимых td
У вас что табличная вёрстка?))

на данной странице да) ) но это не критично просто мне стало интересно работает или нет такой способ.

хмм а в xpath есть такая штука: [not(@disabled)]
но не знаю как с классами там дела у xpath

Вот так:
@FindAll({@FindBy(how = How.CSS, using = “#flights-to .col1:visible”)})
public List airFrom;

Примерно так. Могут быть ошибки синтаксиса.

не работает ваш вариант, вроде как Selenide умеет так делать.

всегда интересовало,
зачем писать FindBy(how = How.CSS, using = “#flights-to .col1”)
если можно FindBy(css = “#flights-to .col1”)

@pauloo89
У меня не было такой потребности ранее, но сейчас решил опробовать Selenide подход к этой проблеме:

    @Test
    public void someTest(){
        Selenide.open("http://google.ru");
        
        String[] textsAll = $$(By.xpath("//span"))
                .getTexts();
        String[] textsVisible = $$(By.xpath("//span"))
                .filter(Condition.visible)
                .getTexts();
        
        System.out.println("All: " + Joiner.on(",").join(textsAll));
        System.out.println("Visible: " + Joiner.on(",").join(textsVisible));
    }

Вроде все достаточно коротко и понятно =)

я и забыл про фильтры у селенида, никогда не использовал ещё)

Привычка :slight_smile:

Что именно не работает? Дайте ссылку на страницу и покажите, какие элементы нужно найти.
Например, вот такая аннотация находит список доменов на странице mail.ru

@FindAll( {@FindBy(how = How.XPATH, using = “//select[@id=‘mailbox__login__domain’]/option”)} ) public List<WebElement> domainDropdownOptions;

Есть подозрение, что ошибка в css тогда.

selenium падает если в css селектор добавить :visible.

Я делаю поиск авиабилетов, и отображаются все результаты, (второй скрин), затем я ставлю галочку только прямые рейсы при этом на странице результатов становится 5, а поиск выдает все элементы в том числе и те которые не видно(первыйскрин), я добавляю :visible. и он показывает только видимые элементы(третий скрин).
Но если локатору в Selemiun просто добавить :visible, то селениум ругается на неправильный локатор



Вы можете отфильтровать список средствами джава, и никаких Селенидов вам для этого не нужно:

list.stream()
    .filter(WebElement::isDisplayed)
    .collect(Collectors.toList())
2 лайка