0

我有一个看起来像这样的夜班测试,我试图确认单击我的登录页面的“密码到文本”功能是否有效:

 '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包含 JS 控制的<i>元素,显示密码字段是type=texttype=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");

4

2 回答 2

0

您可以使用该方法更改属性值document.getElementById,然后对其进行验证,如果这对您有用 -

client.execute("document.getElementById('id_password')[0].type = 'text';")
client.assert.attributeEquals("#id_password", "type", "text");
于 2021-02-10T20:50:15.790 回答
0

首先,.execute()如果您可以使用内置方法,我看不出您使用的原因Nightwatch

我认为元素不具有交互性的原因是由于同步问题。

在实现了必要的值(在我们的例子中是密码)后,您的按钮变得可用,但由于测试运行得如此之快,浏览器仍然看到按钮处于该disabled状态,因此失败。

我建议使用.waitForElementVisible()byNightwatch并等待元素成为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
于 2021-02-26T17:48:07.583 回答