量角器非 angular 测试不遵守等待和睡眠,直到代码中出现错误

Protractor non angular tests do not obey waits and sleeps until there is an error in the code

我在一些非 angular 页面上使用 Protractor 和 Cucumber 进行自动化测试。我已将 browser.ignoreSynchronization 设置为 true。

当我 运行 一个场景时,只有第一行 browser.get(...) 被正确执行。我可以看到 URL 加载正常。以下所有步骤都没有执行(因为我在浏览器中没有看到它们 运行),但我看到所有的绿色和所有传递的结果。 None 代码中的等待和休眠对执行有任何影响。

但是如果代码某处有错误,假设在 scenario/stepdef 的最后一步我有错误的代码 browser.blah.something();然后我可以看到所有的睡眠和等待都被遵守了。

我不明白这是怎么回事!为什么这个错误代码会导致 Protractor 遵守超时?为什么会有这种奇怪的行为?任何的想法?也只是想知道为什么 browser.blah.something() 不会导致编译时错误(测试开始前的错误)?

这些错误很可能是语法或类型错误,这些错误是在执行之前解析的,而不是测试失败。

您的以下几行不起作用的原因有很多,除非您向我们展示代码,否则我们无法确定具体原因。

我的猜测是第一行后面的一堆代码是 promise。事实上, wait(http://www.protractortest.org/#/api?view=webdriver.WebDriver.prototype.wait) 本身 returns 一个 promise.

承诺 运行 异步而非同步,这正是您所期望的。

下面是可能发生的情况的一个简短示例:

-> 应用程序访问 url

-> 应用等待 5 秒(假设这是一个承诺)

-> 关闭应用程序

您可能希望应用程序访问 url 然后等待 5 秒然后关闭,但实际发生的是应用程序将访问 url 然后立即关闭。

为什么?因为等待 5 秒是在另一个线程上执行的,而主线程从不等待 5 秒完成(javascript 是单线程但是......你可以在某处阅读它)

为了解决这个问题,您可以将它们链接起来 (https://javascript.info/promise-chaining) 或使用 async/await,具体取决于您使用的 es 版本。

我不会深入研究承诺,因为这似乎不是这里的目标问题,但如果承诺是原因,这里有一个很好的 article 开始

并回答为什么 browser.something() 没有给出错误browser is actually ProtractorBrowser.prototype, I won't delve into it since it'll be a long answer but again, here's a great article

尝试执行以下操作

console.log(browser)
browser.something = "abc"
console.log(browser)

第二个日志应该显示一个新的 属性,'something',值为 "abc"

现在使用比较好

browser. waitForAngularEnabled(false)

而不是

browser.ignoreSynchronization = true

http://www.protractortest.org/#/api?view=ProtractorBrowser.prototype.waitForAngularEnabled

此外,尝试将其放入 beforeEach()

describe('my suite', ()=>{
    beforeEach(()=> {
        browser.waitForAngularEnabled(false)
    })
    it('my test', ()=> {
        ...
    })
})

我可以建议将其放入 配置文件的 onPrepare 部分或 beforeEach 块。所以它将在 运行 所有测试之前设置。

//Your protractor configuration file
let conf = {
// Some other options ...
    onPrepare: () => {
        browser.waitForAngularEnabled(false)
    }
}