t.me/atinfo_chat Telegram группа по автоматизации тестирования

Selenide + Java, как создать условие наличия элемента?

locators
firefox
java
selenide
webdriver
Теги: #<Tag:0x00007fb2f56e8318> #<Tag:0x00007fb2f56e93d0> #<Tag:0x00007fb2f56efed8> #<Tag:0x00007fb2f56efd70> #<Tag:0x00007fb2f56efc30>

(Ксения Александровна) #1

Вопрос заключается в следующем: возможно ли создать условие формата “если (искомый элемент == false), то { нажатие на кнопку }”? Подойдёт как условие, так и цикл “до”, например: пока (искомый элемент == false) повторять { нажатие на кнопку }

Я попыталась вызвать условие с driver.findElement…, но, конечно же, это не помогло, строка выделяется как ошибочная.

Используется Selenide, веб-драйвер FirefoxDriver, язык Java. На странице есть кнопка, которая вызывает появление списочного элемента, список - это линки. Мне надо нажать на кнопку, выбрать гиперссылку из появляющегося списка. При запуске авто-теста нажатие на кнопку не всегда вызывает список. То есть визуально понятно, что произошло нажатие на кнопку - она видоизменяется, но при этом выпадающий список появляется в 1 из 5 попыток. С чем это связано - не понятно, ожидание элементов в коде есть.
Встаёт вопрос, можно ли сделать так, чтобы после нажатия на кнопку вызывалось условие проверки наличия выпадающего списка?
Кусок кода:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 5);

driver.findElement(By.xpath("//кнопка")).click(); // нажатие на кнопку 
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//первый элемент списка"))); // поиск первого элемента списка 
/*
Здесь требуется условие типа 
if (driver.findElement(By.xpath("//первый элемент списка")) == false {
driver.findElement(By.xpath("//кнопка")).click();
}

Если элемент списка не найден, то требуется повторное нажатие на кнопку
*/
driver.findElement(By.xpath("//первый элемент списка")).click(); // выбор первого элемента списка

Прописывала вручную двойное нажатие на кнопку, но иногда оно срабатывает с первого раза, и вторым кликом список закрывается.


(asolntsev) #2

Вы точно используете Selenide? Тут же чисто селениумовский код.
На селениде-то всё это было бы гораздо короче:

$x("//кнопка").click();
$x("//первый элемент списка").shouldBe(visible).click();

А если и это не поможет, советую не ифы городить, а разобраться, почему выпадающий список не появляется. Это ведь похоже на багу.

Либо клик попадает мимо кнопки: об этом подробнее здесь.


(Ксения Александровна) #3

Это мой первый опыт в автоматизированном тестировании, так что могу ошибаться.
При попытке использовать команды с $ у меня вызываются новые копии браузера, с чем это может быть связано? Инициализация идёт в начале теста командой System.setProperty("webdriver.gecko.driver", "//путь до файла geckodriver");
После этого запуск проекта - driver.get("...");

При первом же столкновении с $ в коде запускается новая копия браузера, в которой, полагаю, должны происходить остальные действия, но авторизация в новой копии не проходит, естественно, и тест падает с ошибкой.


(asolntsev) #4

Ну да, если вы до этого открыли свой браузер, то селениду надо сказать использовать его. Для этого есть команда setWebDriver() - её нужно вызвать ДО первого доллара.

См. https://ru.selenide.org/2019/12/03/advent-calendar-set-webdriver-vs-webdriver-provider/


(Рома Иовлев) #5

Или можно использовать JDI и написать просто

$("//кнопка").click();
$("//первый элемент списка").click();

JDI по умолчанию считает элемент найденным если он Visible
Поведение по умолчанию можно настроить как глобально (что считать что элемент найден), так и локально указав это в виде аннотации у элемента если для одного элемента нужна не такая проверка.
Как работать с элементом это его информация которую лучше описать в PageObject вместо указывания shouldBe(visible всюду где используется элемент)
Пример глобальной настройки (повторюсь в вашем случае она не нужна, так как по умолчанию > JDI ищет только Visible)

SearchStrategies.noValidation(); - как в Selenium
SearchStrategies.onlyVisible(); - только isDisplayed() - default
SearchStrategies.inView(); - элемент в области видимости пользователя - recommended

Для одного элемента

@UI("some-class-or-xpath") @GetVisible;
public UIElement myButton;

Можно использовать также аннотации:
@GetAny
@GetShowInView

https://jdi-docs.github.io/jdi-light/?java#jdi-annotations