【问题标题】:Protractor non angular tests do not obey waits and sleeps until there is an error in the code量角器非角度测试不服从等待和睡眠,直到代码出现错误
【发布时间】:2019-01-06 04:12:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果你能放一些代码会很有帮助。

标签: javascript angular automation protractor cucumber


【解决方案1】:

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

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

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

Promise 以异步方式而不是同步方式运行,这可能是您所期望的。

以下是可能发生的情况的简短示例:

-> 应用访问url

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

-> 关闭应用

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

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

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

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

并回答为什么 browser.something() 没有给出错误browser 实际上是 ProtractorBrowser.prototype,我不会深入研究它,因为它会是一个很长的答案,但是再次,这是一个很棒的article

尝试执行以下操作

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

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

【讨论】:

  • 感谢 kdyz。会试一试。正如你所说,它可能是异步承诺。
【解决方案2】:

现在最好用

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)
    }
}

【讨论】:

  • 感谢 Madhan,我实际上已经添加了 ignoreSynchronization 作为前钩子的一部分。我也尝试过使用 waitForAngularEnabled。结果还是一样。它不等待。我必须尝试kdyz在下面所说的。由于它是异步的,它在差异线程上完成并且它不等待。必须看看承诺链和异步等待。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多