У меня есть несколько попап форм в проекте, в которых код кнопку распознает в некоторых ранах(компилах) а в некоторых нет. Причем в произвольном порядке(и раны и формы).
Спасибо за совет, но дело не в этом.
Попап появляется с анимацией(код видимо нажимает на кнопку, когда она еще не стала кликабельной). Соотвесвенно нужен вейт, который будет ждать пока элемент станет кликабельным(такого функционала в селениде не нашел), но нашел метод для селениума:
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable())
но для него нужно явно вызывать драйвер(явно вызывать который в селениде я тоже не умею)
Предположу, что всё таки ошибка “Element not found” означает что он его честно не нашёл.
Есть цепочка локаторов $("[role=‘dialog’]").$(“button”)
Если искать одним локатором [role=‘dialog’] button, то кнопка найдётся.
Если отдельно, то (я предполагаю, не знаю как точно работает селенид) сначала мы найдём всё, что ищется по _[role=‘dialog’] _, выберем первый элемент и уже в его контексте будем искать button.
Чтобы это проверить открой попап и в js консоли набери
Спасибо, но как оказалось ошибка относилась к коду, который следовал за кнопкой(после того как скрипт кликал на кнопку, которая еще до конца не появилась, он пытался найти элемент за незакрывшейся формой - вот и ошибка). А дело действительно оказалось в анимации. Я поставил слип и все заработало.
Вопрос по прежнему остается открытым - как подождать кликабельность кнопки в селениде.
Попробуй найти какой-то элемент на форме или атрибут кнопки, который появляется/пропадает последним (по окончании анимации) и в тесте жди появления/пропадания этого элемента. Потом кликай свой элемент.
Condition elementToBeClickable лично мне никогда не помогал, но можешь ради эксперимента попробовать подождать - драйвер можно достать в селениде либо в WebDriverRunner, либо WebDriverProvider статический метод есть (точно не помню)
сделай через FluentWait клик на кнопку и затем проверку того, что должно отобразиться после кнопки, если проверка не пройдена, пробуй ещё раз кликнуть, если всё плохо упадёшь по таймауту.