Слушатель событий / Selenium, не успевает загрузится event listener

Всем ку. Подскажите с вопросом (я только начал изучать)
Вопрос : есть кнопка, при нажатии которой должны отправится некие данные.
Локаторами нахожу кнопку, но т.к в type не прописано что это кнопка использую .click но он тоже не работает.
Локализировал проблему - не успевает что-то прогрузится ( что-то из прослушивателей событий ). Я вписываю , после нахождения кнопки и передечи .click - Thread.sleep(4000) и кнопка уже жмакается.

Я понимаю, что решение через Thread.sleep - не решение.

        WebElement button2 = driver.findElement(By.xpath("//button[@class='btn btn-submit']"));
        button2.click();

таким способом, не успевает прогрузится какой-то event.
То есть : находит элемент, кликает по нём - но то, что приводит в работу кнопку ещё не успело загрузится.

Эта кнопка “Показать” на сайте https://playground.learnqa.ru/puzzle/triangle

Подскажите пожалуйста, как сделать " по нормальному "

Непосредственно в селениуме нет фичей на “подождать” загрузки страницы(может что-то появилось в версии 4+). В селениде эта фича уже встроена при переходе на страницу. Вариантов, на вскидку всего два:

  1. Через тредслип.
  2. Вбивать костыли типа того что описан здесь: javascript - Wait for network to be idle with selenium webdriver? - Stack Overflow

хм а как же
static ExpectedCondition<WebElement> elementToBeClickable​(By locator) An expectation for checking an element is visible and enabled such that you can click it.

https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html
это чисто селениум и было с назапамятных - например в два тринадцать было уже

работают с ним как всегда через генерик

WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector"));

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

поставьте точки останова где-нибудь и в дебаге посмотрите реально ли кнопка сразу кликабельна

Селениумовский elementToBeClickable на самом деле проверяет только “visible” и “enabled”, что, конечно, не даёт никаких гарантий, что элемент уже можно кликать.

Вопрос ещё остается открытым. Пока что работает с Thread.sleep. других вариантов не нашел

Ответ на самом деле прост.
Если и вправду обработчик клика привязывается ПОСЛЕ того, как элемент стал видимым, то это тупо бага в приложении. Регай багу, пусть исправляют.

Но часто такое бывает не из-за обработчика, а из-за того, что в момент клика кнопка куда-нибудь движется или меняет размер, или закрыта каким-нибудь другим элементом. В общем, всякой там анимации и прочей чертовщины. См. Flaky tests 2.0 - (Andrey Solntsev, Estonia) - YouTube

Судя по тому что я вижу кнопка никуда не улетает((
Похоже, что проблема именно та что описывает ТС:


Кнопка “показать” становится доступна сразу после загрузки triangle.html (1 кусок на скрине). Если клик придётся до окончания 3го куска (на самом деле ещё позже, поскольку js должен и загрузиться и отработать), когда подгрузится jquerry, и зарегает лиснер, то клик пройдёт, но не отработает.
Собственно как и говорилось ранее вариантов всего два, либо тредслип, что не айс, либо костыли на js. Если есть “валидный” способ, я тоже хотел бы его знать.

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

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

        object result = ExecuteJavaScript("return document.readyState == 'complete';");
        if (result is bool)
        {
            return (bool)result;
        }
        log.Debug($"ExecuteJavaScript(\"return document.readyState \") = {result}");
        return false;

код вырезал из метода, поэтому непонятные return :grinning:
ExecuteJavaScript - это обертка для селениумского javascript екзекьютора
Document.readyState
Если вы используете какую-нибудь самописную обертку над селениумом, удобно эту проверку обернуть в метод и добавить перед выполнениум определенных действий по умолчанию