javascript - Protractor :使用 Promise

标签 javascript protractor

我一直在玩 Protractor 和 promise ,我对得到的不同结果感到困惑。我有三个测试,基本上加载 www.angularjs.org 并等待“Home”链接。

describe('Sample tests', function() {

  it("test1", function(){
    browser.get("angularjs.org");
    browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home'))))
      .then(function() {
        console.log("element visible");
      })
  })

  it("test2", function() {
    browser.get("angularjs.org");
    fn1().then(function(){
      return browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home'))))
      .then(function() {
        console.log("element visible");
      })
    });

    function fn1() {
      return new Promise(function (fulfill, reject){
        fulfill();
      });
    }

  })

  it("test3", function() {
    browser.get("angularjs.org");
    fn1().then(function(){
       browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home'))))
      .then(function() {
        console.log("element visible");
      }, function(err) {
        console.log("error: " + err);
      })
    });

    function fn1() {
      return new Promise(function (fulfill, reject){
        browser.manage().addCookie("abc", "123")
          .then(function() {
            console.log("set cookie");
            fulfill();
          }, function(err){
            console.log("error in fn1: " + err);
          })
      });
    }
  })
})

test1传递并输出元素可见

test2 因异常而失败 等待 Protractor 与页面同步时出错:“[ng:test] http://errors.angularjs.org/1.5.8/ng/测试”错误:WAITING Protractor 与页面同步时出错:“window.angle 未定义。

test3 不打印elementvisible,并间歇性输出error: WebDriverError: no such session (Driver info: chromedriver=2.22.397929 (fb72fb249a903a0b1041ea71eb4c8b3fa0d9be5a),平台=Mac OS X 10.10.5 x86_64)

有趣的是,如果我将 browser.get("angularjs.org"); 移动到 beforeEach block ,test2 不会抛出错误并输出 元素可见,而 test1 和 test3 的行为相同,无论 browser.get("angularjs.org"); 的位置如何。

所以我的问题是

  1. 为什么将 browser.get("angularjs.org"); 放在 beforeEach block 中会使 test2 工作,为什么 的位置不起作用browser.get("angularjs.org"); 影响 test1 和 test3 吗?
  2. 为什么 test3 不输出 elementvisible

更新 我修复了 test3

  1. 从 fn1 返回浏览器 promise
  2. fn1().then( ... ) 中返回浏览器 promise
  3. 将一个额外的 then 子句链接到末尾 (fn1().then().then()) 并调用 done() .


  it("test3", function(done) {
    browser.get('https://www.angularjs.org')
    fn1()
      .then(function(){
          return browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home'))))
        .then(function() {
          console.log("element visible");
        }, function(err) {
          console.log("error: " + err);
        })
      })
      .then(function(){
        done();
      });

    function fn1() {
      return new Promise(function (fulfill, reject){
        return browser.manage().addCookie("abc", "123")
          .then(function() {
            console.log("set cookie");
            fulfill();
          }, function(err){
            console.log("error in fn1: " + err);
          })
      });
    }
  })

最佳答案

首先,如果你传递 browser.get('angularjs.org') 你应该得到一个 webdriver 异常 失败:目标 URL angularjs.org 格式不正确。你没有得到这个异常(exception)。我认为您使用的是旧版本的 Protractor。

当我将 url 更改为 browser.get('https://www.angularjs.org') 并运行您的规范(Firefox 浏览器)时,所有 3 个测试均通过并获得以下输出:

element visible  // 1st test output
..element visible  // 2nd test output
set cookie          
.element visible   // 3rd test output

3 specs, 0 failures
Finished in 8.661 seconds

正如您从上面的输出中看到的,所有三个测试都已按预期执行,并且相应地返回了 promise 。您的实现没有任何问题。

Protractor 的 API 完全是异步的并返回 Promise,每个任务都在 ControlFlow 中排队。为了了解任务如何排队以及控制流如何工作,请查看 webdriverJS control flow API doc

关于javascript - Protractor :使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39561783/

相关文章:

angularjs - 使用 Protractor 和 Azure AD 进行身份验证登录测试

javascript - Protractor 中可重用方法的回调/ promise

javascript - 选择相同的下拉选项时,更改事件上的 Jquery 未触发

javascript - React Component Prop 不会更新

javascript - 返回 iframe 的流 HTMLElement.querySelector

javascript - 使用 google chrome 控制台发送多条消息

javascript - 在哪里可以找到使用 Crockford 方法进行原型(prototype)继承的大型 JavaScript 项目的示例?

angularjs - 等待 Protractor 与页面同步 11 秒后超时

angular - e2e如何在 Angular Protractor 中测试登录成功案例

javascript - 单击 Protractor 中的表格单元格值