Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Selenide кликает по кнопке, но событие onClick() из js-скрипта не срабатывает

selenide
webdriver
Теги: #<Tag:0x00007f7b69ffee48> #<Tag:0x00007f7b69ffeb78>

(Ivan Trechyokas) #1
<div class="oauth-auth__forms__input-block">
    <input class="oauth-auth__forms__input oauth-auth__forms__input-forgot" name="password" id="password" data-test="oauth-auth-password" data-ref="oauth-auth-password" type="password">
    <span class="oauth-auth__forms__input-forgot-text" data-test="oauth-auth-forgot-link" data-ref="oauth-auth-forgot-link">forgot?</span>
</div>

Кликается по $("[data-test=oauth-auth-forgot-link]").shouldBe(enable).click(). - Селенид не ругается.

Если кликать мышкой - то отрабатвает, появляется форма ForgotPassword. Если кликать в коде - то всё отсаётся без изменений.

Пробовал делать различные клики, контекстный клик (правой кнопкой) открывает контекстное меню в другом месте. Разные селекторы тоже опробованы. Пробовал два браузера: firefox, chrome (остальные не нужны).

Не пробовал только через executeJS кликать, так как хотелось бы обойтись без подобных трюков.

JS событие по кнопке такое:

        $forgotButton.on("click", function() {

            $("[data-ref='oauth-auth-forgot-success']").hide();
            $("[data-ref='oauth-auth-forgot']").show();
            $errorBlock.hide();
            $allAuthForms.hide();
            $errorForgotBlock.hide();

            $forgotForm.show();
            checkWindowSize();
        });

Последняя функция отвечает за ресайз окна: window.resizeTo(X, Y);

UDP:
При нажатии на кнопку forgot? самой форме выставляется display: none, и отрисовывается новая форма.

UDP2:

jse.executeScript("document.getElementsByTagName('span')[0].click();");

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


(Евгений Салмин) #2

У selenide есть свойство clickViaJs, переменная boolean, в его com.codeborne.selenide.Configuration
Можно ее выставить в true перед кликом


(Roma Marinsky) #3

а разве css локатор по атрибуту не так должен выглядеть?
$("span[data-test='oauth-auth-forgot-link']")


(Ivan Trechyokas) #4

Во всех местах работает как я указал.

$("[data-test=oauth-auth-forgot-link]").shouldBe(enable).click()

Фронтенд таким же образом обращается к элементам в своём скрипте, за исключением кавычек у значения тэга ‘{value}’

 $("[data-ref='oauth-auth-forgot-success']").hide();

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


(Ivan Trechyokas) #5

В общем я обошёл эту проблему через JS-клик так как обнаружилось всего 3 кнопки, которые не отвечают на обычные клики.

JavascriptExecutor jse;
jse = (JavascriptExecutor)getWebDriver();
jse.executeScript("document.getElementById('oauth-auth-forgot-link').click();");

Значение clickViaJs не стал менять, так как в документации есть предупреждение и не хотелось исследовать как это может сказать в остальных случаях.

static boolean clickViaJs
ATTENTION! Automatic WebDriver waiting after click isn't working in case of using this feature.

(asolntsev) #6

И всё-таки ваш селектор неправильный.
Я бы попробовал такой вариант:

$("[data-test='oauth-auth-forgot-link']").shouldBe(enabled).click()

А ещё важно, где и в какой момент байндится этот обработчик:
$forgotButton.on("click", function() {
Вполне возможно, что он в неправильный момент байндится. И тогда результат зависит вовсе не от Selenide/Selenium/JS, а от скорости браузера и расположения звёзд.