Всем ку. Подскажите с вопросом (я только начал изучать)
Вопрос : есть кнопка, при нажатии которой должны отправится некие данные.
Локаторами нахожу кнопку, но т.к в type не прописано что это кнопка использую .click но он тоже не работает.
Локализировал проблему - не успевает что-то прогрузится ( что-то из прослушивателей событий ). Я вписываю , после нахождения кнопки и передечи .click - Thread.sleep(4000) и кнопка уже жмакается.
Я понимаю, что решение через Thread.sleep - не решение.
таким способом, не успевает прогрузится какой-то event.
То есть : находит элемент, кликает по нём - но то, что приводит в работу кнопку ещё не успело загрузится.
Непосредственно в селениуме нет фичей на “подождать” загрузки страницы(может что-то появилось в версии 4+). В селениде эта фича уже встроена при переходе на страницу. Вариантов, на вскидку всего два:
хм а как же static ExpectedCondition<WebElement>elementToBeClickable(By locator) An expectation for checking an element is visible and enabled such that you can click it.
В том и проблема, что элемент на сайте находится сразу, и сразу кликабельный, но только, видимо, скрипт не успевает прогружатся который отвечает за отправку на бек( моё предположение).
Пробовал разные таймауты - тест проходит, но не работает должным образом( не срабатывает клик(не нажимается кнопка))
Селениумовский elementToBeClickable на самом деле проверяет только “visible” и “enabled”, что, конечно, не даёт никаких гарантий, что элемент уже можно кликать.
Ответ на самом деле прост.
Если и вправду обработчик клика привязывается ПОСЛЕ того, как элемент стал видимым, то это тупо бага в приложении. Регай багу, пусть исправляют.
Но часто такое бывает не из-за обработчика, а из-за того, что в момент клика кнопка куда-нибудь движется или меняет размер, или закрыта каким-нибудь другим элементом. В общем, всякой там анимации и прочей чертовщины. См. https://www.youtube.com/watch?v=ibx8nVvt-Js
Кнопка “показать” становится доступна сразу после загрузки 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
ExecuteJavaScript - это обертка для селениумского javascript екзекьютора Document.readyState
Если вы используете какую-нибудь самописную обертку над селениумом, удобно эту проверку обернуть в метод и добавить перед выполнениум определенных действий по умолчанию
аналогичная ситуация, только в моем случае не клик по элементу, а getText. FindElement срабатывает успешно, но элемент видимо остается не интерактивным, в результате getText вытаскивает пустое значение.
Подскажите пожалуйста, как можно исправить ситуацию?