Проблемы Nightwatch при нажатии на Div

У меня есть тест nightwatch, который выглядит так, где я пытаюсь подтвердить, что щелчок функции преобразования пароля в текст на моей странице входа в систему работает:

 'Test Password Visible': function (client) {
        client
            .url('http://127.0.0.1:8000/test')
            .waitForElementVisible('body', 1000)
            .assert.visible('#id_password')
            .assert.visible('#eye_button')
           .pause(1000)

        client.assert.attributeEquals("#id_password", "type", "password");

        client.execute(function () {
            document.querySelector('#eye_button').click()
            console.log('clicked')
        }, []);
        client.assert.attributeEquals("#id_password", "type", "text");
        
    },

#eye_button - это div, содержащий элемент <i>, управляемый JS, показывающий, является ли поле пароля type=text или type=password

Я новичок в Nightwatch, но, глядя на другие сообщения, это должно было позволить щелкнуть div, обратите внимание, что метод .click() не работал из-за того, что элемент не был интерактивным.

client.execute(function () {
            document.querySelector('#eye_button').click()
            console.log('clicked')
        }, []);

Однако это не так, и я даже не получаю console.log при запуске теста. Может ли кто-нибудь помочь мне указать правильное направление?

Строка, которая терпит неудачу, находится здесь, потому что (я предполагаю), что div не нажимается, и JS, который преобразует поле пароля, не вызывается:

client.assert.attributeEquals("#id_password", "type", "text");


person ViaTech    schedule 10.02.2021    source источник


Ответы (2)


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

client.execute("document.getElementById('id_password')[0].type = 'text';")
client.assert.attributeEquals("#id_password", "type", "text");
person Alapan Das    schedule 10.02.2021
comment
Однако это не будет тестированием той функциональности, которую я написал на странице ... - person ViaTech; 12.02.2021

Прежде всего, я не вижу причины, по которой вы используете .execute(), если вы можете использовать встроенные методы Nightwatch.

Я думаю, что причина того, что элемент не является интерактивным, заключается в проблемах с синхронизацией.

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

Я предлагаю использовать .waitForElementVisible() на Nightwatch и подождать, пока элемент не станет enabled.
Несмотря на то, что это один и тот же элемент, он имеет 2 разных состояния, поэтому вам нужно захватить оба.

Пример:

const buttonDisabled = 'button[class = "my_button"][disabled]';
const buttonEnabled = 'button[class = "my_button"][enabled]';
browser.waitForElementVisible(buttonDisabled);
browser.click(buttonDisabled);
browser.waitForElementVisible(buttonEnabled);
// your assertion here
person Vladislav Bulanov    schedule 26.02.2021