Nightwatch.js - 如何断言复选框未检查?

时间:2015-01-19 15:32:11

标签: selenium selenium-webdriver nightwatch.js

我正在使用nightwatch.js对应用程序进行端到端测试,但无法验证复选框的状态。

我正在使用attributeEquals()验证是否选中了复选框:

module.exports = {
  "Checkbox is checked" : function (client) {
    client
      .url(client.launch_url)
      .useCss()
      .waitForElementVisible("body", 1000)
      .verify.attributeEquals('#a_checkbox', 'checked', 'true') // quotes necessary
      .end();
  }
};

但我还需要确认复选框未选中

为此,我尝试再次使用attributeEquals(),并有各种期望:

module.exports = {
  "Checkbox is not checked" : function (client) {
    client
      .url(client.launch_url)
      .useCss()
      .waitForElementVisible("body", 1000)
      .verify.attributeEquals('#b_checkbox', 'checked', null)
      .verify.attributeEquals('#b_checkbox', 'checked', 'null')
      .verify.attributeEquals('#b_checkbox', 'checked', 'false')
      .verify.attributeEquals('#b_checkbox', 'checked', false)
      .verify.attributeEquals('#b_checkbox', 'checked', '')
      .end();
  }
};

但它们都失败了,并显示一条消息,指出checked属性不存在:

Running:  Checkbox is not checked

✔  Element <body> was visible after 68 milliseconds.
✖  Testing if attribute checked of <#b_checkbox> equals "null". Element does not have a checked attribute.  - expected "null" but got: null
✖  Testing if attribute checked of <#b_checkbox> equals "null". Element does not have a checked attribute.  - expected "null" but got: null
✖  Testing if attribute checked of <#b_checkbox> equals "false". Element does not have a checked attribute.  - expected "false" but got: null
✖  Testing if attribute checked of <#b_checkbox> equals "false". Element does not have a checked attribute.  - expected "false" but got: null
✖  Testing if attribute checked of <#b_checkbox> equals "". Element does not have a checked attribute.  - expected "" but got: null

该消息是正确的,没有checked属性,但缺少属性意味着未选中复选框,因此我希望测试通过。

如何实现这一目标?

如果那是重要的话,我正在使用夜班v0.5.36。

10 个答案:

答案 0 :(得分:9)

您可以尝试:browser.expect.element('#b_checkbox').to.not.be.selected;

答案 1 :(得分:4)

我是使用css断言完成的,例如:

module.exports = {
  "Checkbox is not checked" : function (client) {
    client
      .url(client.launch_url)
      .useCss()
      .waitForElementVisible("body", 1000)
      .verify.elementPresent('#b_checkbox')
      .verify.elementNotPresent('#b_checkbox:checked')
      .end();
  }
};

答案 2 :(得分:2)

我不是Nightwatch.js的专家。但这看起来很有希望。

module.exports = {
  tags: ['checkbox'],

  'Demo test select a checkbox' : function (client) {
    client
      .url('your-domain.tld')
      .verify.visible('input[id="your_checkbox"]', 'Checkbox is visible')
      .click('input[id="your_checkbox"]')
      .pause(1000)
      .element('id', 'your_checkbox', function(response) {
        client.assert.ok(response.value.ELEMENT, 'Checkbox response is OK');
        client.elementIdSelected(response.value.ELEMENT, function(result){
          client.verify.ok(result.value, 'Checkbox is selected');
        });
      })
      .end();
  }
};

请参阅此 Page

答案 3 :(得分:1)

我有类似的问题。我想检查一个复选框的状态。如果未选中它,我希望我的代码选择它,如果它已被选中,我希望代码取消选择它。这就是我通过遵循vinoth-s评论和他在答案中提到的链接来解决它的方法:

client.element('id', 'elements_css_id', (response) => {
  client.elementIdSelected(response.value.ELEMENT, (result) => {
    if(result.value == true) {
        client.click('elements_css_id');
    };
  });
});

答案 4 :(得分:1)

您可以尝试抓取并测试是否可见任何与您的ID匹配的复选框,并且也会进行检查。我使用cucumberjs执行此任务和页面对象,因此这将适用于我的项目。但是我觉得nightwatch独立会做类似的事情。

browser.assert.visible('#b_checkbox:checked');

未检查

browser.assert.visible('#b_checkbox:not(:checked)');

答案 5 :(得分:0)

你的考试没问题。我查看了错误并看到了一个简单的问题@ 测试&lt;#b_checkbox&gt;的属性是否已检查等于“null”。元素没有checked属性。 - 期望“null”但得到:null 您正在通过.assert.attributeEquals('#b_checkbox', 'checked', null)传递.assert.attributeEquals('#b_checkbox', 'checked', 'null') null作为字符串'null'

希望这是有道理的。

答案 6 :(得分:0)

如果没有属性

,您可以使用elementNotPresent

而不是使用它 .verify.attributeEquals('#b_checkbox', 'checked', 'null')

你可以用它 .assert.elementNotPresent('#b_checkbox[checked]')

答案 7 :(得分:0)

我用过这个:

client.expect.element('@your_checkbox_input').to.not.have.attribute('checked');

如果你想检查价值:

client.getAttribute('@your_checkbox_input', 'checked', result => {
    // do something
});

答案 8 :(得分:0)

这可能会让人感到困惑,因为已检查的元素和未检查的元素就像苹果和橙子。我将展示命令,然后解释......

检查是否已检查...

browser.assert.attributeEquals('<element>', 'checked', 'true');

检查是否未选中

browser.expect.element('<element>').to.not.be.selected;

为什么这不起作用?

browser.assert.attributesEquals('<element>','checked','false')

如果运行该命令,您将失败,结果显示

 "Element does not have a checked attribute."

转到控制台并查看html标记,并将选中的代码与未选中的代码进行比较。当标签被禁用时,您将获得类似......

的内容
<input ...    checked=checked />

如果未选中,则检查的标签会消失。

<input .../>

attributeEquals函数正在寻找&#34;已检查&#34;属性,当元素未被选中时不再存在,因此您会得到错误,即&#34;元素没有已检查的属性&#34;。由于此属性不再存在,因此您无法再使用函数attributeEquals。

答案 9 :(得分:0)

当我陷入负面测试时,我在nightwatch.js中没有像我想要的那样工作,我只是否定了自己的积极测试。由于验证不会导致测试失败,如果不是真的,我会使用肯定的断言。

这样的事情:

  "Checkbox is not checked" : function (client) {
    if !(client
      .url(client.launch_url)
      .useCss()
      .waitForElementVisible("body", 1000)
      .verify.attributeEquals('#a_checkbox', 'checked', 'true');){
      browser.expect.element('body').to.not.be.present;
    }