概述

Nightwatch 提供内置的可扩展 assert/verify 库,作为包含相同方法的两个命名空间,用于对元素执行断言。

.assert

使用 .assert 命名空间,当断言失败时,测试将结束,因此跳过测试中的所有其他断言。

以下示例代码片段使用 assert 命名空间来断言页面上是否显示具有类 non_existing 的元素。如果断言失败,测试将结束

    browser.element.find('selector').assert.visible('.non_existing');
  

.verify

使用 .verify 命名空间,当断言失败时,测试会记录失败并继续执行测试中的其他断言。

以下示例代码片段使用 verify 命名空间来检查页面上是否显示具有类 non_existing 的元素。如果断言失败,将记录失败,测试将继续

browser.verify.visible('.non_existing');

基本断言

来自 Node.js assert 模块 的方法也适用于 .assert/.verify 命名空间,可以根据需要使用。

否定 (".not") 断言

从 Nightwatch 版本 1.3 开始,所有断言(包括自定义定义的断言)都具有 ".not" 对应项,可用于断言相反的条件。

诸如 elementNotPresentcssClassNotPresenthidden 等断言已过时且已弃用。

以下示例代码片段显示了 ".not" 断言

tests/sampleTest.js
describe('Demo .not assertion', function() {
  it('demo test', function(browser) {
    browser.init();
    
browser .element.find('.not_present') .assert.not.elementPresent();
browser .assert.not.urlContains('http://');
// ... }) })

自动重试

默认情况下,Nightwatch 会自动重试失败的断言,最长 5000 毫秒。这可以通过在 nightwatch.json 文件中 globals 对象中设置 retryAssertionTimeout(以毫秒为单位)属性来配置。查看 使用测试全局变量 以了解更多详细信息。

如果达到给定的超时时间,测试运行器将停止重试并将断言标记为失败。

以下示例代码片段显示了在配置文件中定义的 retryAssertionTimeout 属性

nightwatch.conf.js
{
  src_folders: ['tests'],
  
test_settings: { default: { launch_url: 'https://nightwatch.node.org.cn',
globals: { myGlobalVar: 'some value', retryAssertionTimeout: 5000 } } } }

期望断言

除了 assert 命名空间之外,Nightwatch API 还开箱即用地支持 BDD 风格的 expect 断言库,这极大地提高了断言的灵活性和可读性。

expect 断言使用来自 Chai 框架Expect API 的一个子集,目前可用于元素、cookie、页面标题和 URL。

示例

以下是一个使用各种 expect.element([...]) 断言的基本示例

tests/sampleTest.js
module.exports = {
  'Demo test Ecosia.org': function (browser) {
    browser.url('https://www.ecosia.org/');
    
// expect element header to be present in 1000ms expect(browser.element.find('header')).to.be.present.before(1000);
browser.end(); } };

期望特定元素计数

在此示例中,测试期望页面上存在指定数量的元素,使用 expect.elements([...]).count 断言

tests/sampleTest.js
module.exports = {
  'demo test ecosia.org'(browser) {
    browser
      .url('https://www.ecosia.org/')
      .expect(browser.element.findAll('section').count()).to.equal(5);
  },
  
after(browser) { browser.end(); } };

expect 接口为定义断言提供了更加灵活和流畅的语言,比现有的 assert 接口有了很大的改进。唯一的缺点是无法再链接断言。


有关可用 expect 断言的完整列表,请参阅 API 文档