Поиск необходимого селектора на динамической странице
Имеется следующее: пишу автотест на прокликивание на демовой странице компании, в которой сейчас работаю.
Последовательность следующая: автотест заходит на сайт - вводит валидные логин и пароль - переходит по ссылке плиточного меню - выбирает предложенные заявления (данные заявления появляются по нажатию кнопки со стрелкой вниз, не через некоторое время после загрузки страницы, а именно по нажатию кнопки)

Написал код, по которому автотест доходит до этого места (выбор подтипа документа). и тут возник вопрос какую команду с селектором написать и какой прописать путь к этой кнопке.
В статическом состоянии класс данной кнопки

При динамическом состоянии класс кнопки меняется (то есть когда сам нажимаю на данную стрелку)

Прошу оказать помощь в правильном написании автотеста, при котором он сам нажмет на данную стрелочку вниз
Джава 11 Проект Мавен
import dev.failsafe.internal.util.Assert;
import org.checkerframework.checker.units.qual.C;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
public class TestOtpusk {
@Test
public void Test() {
System.setProperty("webdriver.chrome.driver", "/Users/User/Downloads/chromedriver.exe");
ChromeDriver driver = new ChromeDriver();
ChromeOptions option = new ChromeOptions();
driver.get("............................");
driver.findElement(By.id("username")).sendKeys("..........");
driver.findElement(By.id("password")).sendKeys("..........");
driver.findElement(By.cssSelector("button[type=\"submit\"]")).click();
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("headInput")));
driver.findElement(By.linkText("Создать заявление")).click();
}
Ответы (2 шт):
Вам всего лишь нужно подобрать селектор для данного элемента, то, что он слегка меняет class при наведении (скорее всего именно при наведении, а не клике, т.к. добавляется всё же 'hover') не должно нам помешать.
Например можно использовать xpath (это совершенно не обязательно, можно с тем же успехом использовать, например, css селекторы) для поиска вашего элемента:
wait.until(ExpectedConditions
.elementToBeClickable(By.xpath("//*[contains(@class, 'lookup-container')]"))
.click()
Или же можно заметить, что есть div ниже, который не меняется при наведении на стрелку и пытаться нажать на него:
wait.until(ExpectedConditions
.elementToBeClickable(By.xpath("//*[@class = 'lookup-button-container')]"))
.click()
ну или найти его, а потом просто подняться на уровень выше в наш первый элемент:
wait.until(ExpectedConditions
.elementToBeClickable(By.xpath("//*[@class = 'lookup-button-container')]/.."))
.click()
Возможно селекторы придётся немного подправить, т.к. доступа к странице нет и протестировать не было возможности, но на первый взгляд они должны подойти.
P.S.
Иногда, часто по неясным причинам, селениумный клик не хочет работать (т.е. страница на него просто не реагирует), тогда можно попробовать кликать через JS это может помочь:
WebElement element = как-то нахождим нужный элемент;
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);
Решил проблему немного другим способом. По дереву нашел уникальный айди и после него начал спускаться до нужного класса. Получилось так:
driver.findElement(By.cssSelector("[id=\"lkpDocumentCategory\"]>
[class=\"lookup-container\"]>[class=\"lookup-button-container\"]")).click();