【问题标题】:Synchronization inside the 'it' Block in protractor量角器中“it”块内的同步
【发布时间】:2016-05-25 01:47:58
【问题描述】:

您好,实际上我在代码的“it”块中面临同步问题。下面的 sn-p 描述了这个问题。

 it('Some Download Operation',function()
 {
    console.log("before");
    myobj.clickOnDownloadBtn();
    console.log("after download click");
    browser.driver.sleep(5000);
    var enter = browser.actions().sendKeys(protractor.Key.ENTER);
    enter.perform();
    console.log("after enter btn");
});

我得到如下输出:

before
after download click
after enter btn
//Then the  click on PO Object's 'myobj.clickOnDownloadBtn()' operation.

请尽快让我知道问题和解决方案。

【问题讨论】:

  • 为什么不用settimeout?
  • 无效@AmitSoni

标签: javascript angularjs protractor


【解决方案1】:

你必须添加 then 函数,像这样:

 it('Some Download Operation',function()
 {

    myobj.clickOnDownloadBtn().then (function() {
    console.log("after enter btn");
    console.log("after download click");
    });

    browser.driver.sleep(5000);
    var enter = browser.actions().sendKeys(protractor.Key.ENTER);
    enter.perform().then (function() {
    console.log("after enter btn");
    });

});

【讨论】:

  • 干得好!顺便说一句,在“为什么”这会在单独的答案中起作用。
  • 感谢您的鼓励,alecxe;)我们正在从您的示例中学习;)
  • 感谢 alecxe 和 Emna :)
  • 但是 Enter 键操作不起作用...从转义/下载文件... :(
  • @balu 对我来说听起来像是一个单独的问题。考虑创建一个单独的问题并通过接受 Emna 的回答来解决此主题。谢谢!
【解决方案2】:

详细说明为什么@Emna 的解决方案会有所帮助:

Protractor 完全是异步,并且基于 Promise 的概念 - 你不能期望你的代码从上到下以阻塞的方式工作。在 Protractor 中,Control Flow 机制充当 WebDriver 承诺的队列

从代码的角度来看:

console.log("before");
myobj.clickOnDownloadBtn();
console.log("after download click");
browser.driver.sleep(5000);
var enter = browser.actions().sendKeys(protractor.Key.ENTER);
enter.perform();
console.log("after enter btn");

在这里,一切都将从上到下执行,但console.log() 调用将立即执行,因为它们是同步的。像 myobj.clickOnDownloadBtn()browser.driver.sleep(5000)enter.perform() 这样的调用返回承诺,不会立即执行,而是放在控制流上。这就是您在页面上执行任何操作之前看到console.log 结果的原因。

相关主题:

【讨论】:

  • 感谢@alecxe的解释
猜你喜欢
  • 2020-02-26
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多