【问题标题】:Does Cucumber with Protractor need the callback?带量角器的黄瓜需要回调吗?
【发布时间】:2016-02-16 10:02:09
【问题描述】:

我试图了解 The WebDriver Control Flow 的确切工作原理。

根据链接文档 (https://github.com/angular/protractor/blob/master/docs/control-flow.md),jasmine 中不需要回调方法/调用:

Protractor 适配 Jasmine,以便每个规范自动等待,直到控制流为空才退出。

但是,我必须用黄瓜。我正在使用库protractor-cucumber-framework,如下所述:https://github.com/angular/protractor/blob/master/docs/frameworks.md#using-cucumber

它运行良好,但由于某种原因,当我跳过回调变量时,它会比我尝试使用它时运行得更好。例如,此代码失败:

this.Given(/^the login page is active$/, function (callback) {
  browser.get('/').then(callback);
});

出现错误...

TypeError: text.split 不是函数

[启动器] 进程退出,错误代码为 1

另一方面,这段代码可以按我的意愿工作,黄瓜/量角器似乎要等到页面加载完毕,然后再执行其他功能:

me.Given(/^the login page is active$/, function () {
  browser.get('/');
});

但我找不到任何文档确认我真的可以省略回调函数。

目前我尝试测试的页面不使用 Angular,因此我的配置文件中有以下代码:

onPrepare: function() {
  browser.ignoreSynchronization = true;
}

【问题讨论】:

    标签: javascript cucumber protractor


    【解决方案1】:

    Protractor 在下面使用 WebDriverJS。 WebDriverJS 使用了一个承诺管理器,它在其中对命令进行排队。这是他们的维基页面here的一些摘录@

    在内部,promise 管理器维护一个调用堆栈。每转一圈 在管理器的执行循环中,它将从中拉出一个任务来执行 最顶层帧的队列。计划内的任何命令 前一个命令的回调将被安排在一个新的帧中, 确保它们在之前安排的任何任务之前运行。结束 结果是,如果您的测试是写入行的,则带有所有回调 由函数字面量定义,命令应按顺序执行 它们在屏幕上垂直读取。例如,考虑 以下 WebDriverJS 测试用例:

    driver.get(MY_APP_URL);
    driver.getTitle().then(function(title) {
      if (title === 'Login page') {
        driver.findElement(webdriver.By.id('user')).sendKeys('bugs');
        driver.findElement(webdriver.By.id('pw')).sendKeys('bunny');
        driver.findElement(webdriver.By.id('login')).click();
      }
    });
    driver.findElement(webdriver.By.id('userPreferences')).click();
    

    可以使用 !WebDriver 的 Java API 重写此测试用例,如下所示:

    driver.get(MY_APP_URL);
    if ("Login Page".equals(driver.getTitle())) {
      driver.findElement(By.id("user")).sendKeys("bugs");
      driver.findElement(By.id("pw")).sendKeys("bunny");
      driver.findElement(By.id("login")).click();
    }
    driver.findElement(By.id("userPreferences")).click();
    

    现在回到您的问题,由于您在步骤中省略了 callback,因此 cucumber 将您的测试代码视为同步的。请参阅文档here。而且因为量角器/WebdriverJS 处理承诺管理器的方式如上所述,所以一切都按预期进行。

    至于您在使用callback 时遇到的错误,我不确定。我做的和你做的完全一样。见here。我正在使用黄瓜^0.9.2。可能是你的黄瓜版本有问题。

    在旁注中,我发现您可以返回 Promise 而不是使用回调来让 cucumber 知道您已完成执行。所以像这样的东西也可以(假设你使用的是^0.9.2)。我测试过了,

    me.Given(/^the login page is active$/, function () {
      return browser.get('/');
    });
    

    【讨论】:

    • 非常详细的概述,很棒的工作!
    • 谢谢,我有版本^0.9.4 - 我昨天刚刚设置了系统,所以它应该是最新的。我今天会写更多的测试并尝试返回承诺 - thx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2014-09-26
    • 2016-12-17
    • 1970-01-01
    • 2020-04-14
    • 2014-08-04
    • 2017-10-27
    相关资源
    最近更新 更多