如何使用页面对象在 Nightwatch.js 中运行多个 chai 断言?

Posted

技术标签:

【中文标题】如何使用页面对象在 Nightwatch.js 中运行多个 chai 断言?【英文标题】:How to run multiple chai assertion in Nightwatch.js using page object? 【发布时间】:2019-06-17 09:06:01 【问题描述】:

在我的测试中,我需要在多个页面上验证相同的文本行。 我正在尝试使用 chai 断言,但无法使用页面对象运行多个 .expept 断言。

有两个 '.expect' 断言使测试失败并显示错误消息 Unknown property: "expect". Please consult docs at:http://nightwatchjs.org/api. 当我只用一个命令运行它时,它运行正常。

// Test file code

module.exports = 

    'Copy Test': client => 
    client.url('https://www.testsite.com/')
    client.page.search().checkText()
    client.end();
   ,
;
// Page object file code

let copyP = "Some test text"
let copyP2 = "Some text text 2"

module.exports = 
    elements: 
        p: 'CSS_selector',
        p2: 'CSS_selector',
    ,

    commands: [
        checkText: function() 
            return this 
            .expect.element('@p').text.to.equal( copyP, 'Text is ok')
            .expect.element('@p2').text.to.equal( copyP2, 'Text2 is ok')
        
    ]

【问题讨论】:

【参考方案1】:

是的,您详细说明的是正确和期望的行为

Chai 的断言,Nightwatch 的内置断言,或者大多数 其他断言库,工作方式相同!断言是破坏性的 语句意味着你的程序应该结束执行 失败/抛出异常),具有明确的范围和目的:评估 一种 predicate。 两个断言总是相互独立的。因此, 链接两个或多个断言没有逻辑上的案例关注, 现在有吗?

基本上,断言不支持回调函数,因此您不能将一个结果传递给另一个(它们没有内置逻辑来执行此操作)。

所以,你不能这样做……

browser.click('@someElem')
       .expect.element('@otherElem').to.be.visible
       .expect.element('@otherElem').text.to.equal('I<3Turtles', 'text check');

你不能这样做……

browser.click('@someElem')
       .expect.element('@otherElem').to.be.visible
       .setValue('@otherElem', 'I like turtles');

...既然我们已经解决了这些问题,让我们看看如何重构该命令:

commands: [
    checkText: function() 
        // Perform wrapper for extra safety! 
        this.api.perform((done) => 
            this.expect.element('@p').text.to.equal( copyP, 'Text is ok');
            this.expect.element('@p2').text.to.equal( copyP2, 'Text2 is ok');

            done();
        );
        return this;
    
]

【讨论】:

这行得通,感谢@iamdanchiv 的帮助。假设每个人一次只需要运行一个断言是很奇怪的。在我看来,最好在配置文件中的某个地方使断言可破坏或不可用。但应该有充分的理由说明它的工作方式。 嗯,是的,Nightwatch 支持类似的东西。如果您不想要经典的fail-fast 类型的断言,那么您可以查看verify statements here。这些在测试结束时作为集合失败,不会破坏程序和运行时。希望能帮助到你。干杯! 是的,我实际上使用了这些断言,特别是.containsText()但我发现了一个错误,如果您检查的副本缺少第一个字母,它不会失败。

以上是关于如何使用页面对象在 Nightwatch.js 中运行多个 chai 断言?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nightwatch.js 或 javascript 列出具有共同属性值的相同元素?

Nightwatch.js如何访问安全网站?

使用Nightwatch.js做基于浏览器的web应用自动测试

使用 nightwatch 检查 http 状态码

Nightwatch测试在Headless chrome模式下找不到元素

React 前端与 Django REST 后端的集成测试