javascript - 以惯用方式组织 javascript webdriver Promise 代码

标签 javascript angularjs webdriver promise protractor

我通过 Protractor 使用 webdriver 断言 html 表中特定行的内容。我有以下代码,它可以正常工作,但看起来很糟糕。我想要有关如何使用 Promise 更好地组织此代码的建议;特别是,我想更明显地表明此代码分为 3 个部分:

  1. 在页面上查找 td 包含指定 matchText 的行
  2. 检查是否只有一行匹配,并使用有用的调试信息处理错误情况
  3. 检查该匹配行中 td 的文本内容是否符合预期

有没有办法可以更好地组织它,使其更具可读性,也许可以通过链接 promise 或其他方式?

browser.findElements(by.xpath("//td[text() = '" + matchText + "']/..")).then(function(trs) {
  if (trs.length == 0) {
    throw 'Unable to find td element equal to ' + matchText
  } else if (trs.size > 1) {
    protractor.promise.all(trs.map(function(tr){return tr.getInnerHtml()})).then(function(trsInnerHtml) {
      throw 'Matched multiple td elements for ' + matchText + ':' + trsInnerHtml;
    })
  } else {
    trs[0].findElements(by.tagName('td')).then(function(tds) {
      protractor.promise.all(tds.map(function(td) {return td.getText()})).then(function(tdContent){
        expect(tdContent).toEqual(expectedContent);
      })
    });
  }
});

最佳答案

是的,您可以unwrap the promise callbacks从非抛出情况到链式版本:

browser.findElements(by.xpath("//td[text()='" + matchText + "']/..")).then(function(trs) {
  if (trs.length == 0) {
    throw 'Unable to find td element equal to ' + matchText
  } else if (trs.size > 1) {
    return protractor.promise.all(trs.map(function(tr) {
      return tr.getInnerHtml()
    })).then(function(trsInnerHtml) {
      throw 'Matched multiple td elements for ' + matchText + ':' + trsInnerHtml;
    });
  } else {
    return trs[0].findElements(by.tagName('td'));
  }
}).then(function(tds) {
  return protractor.promise.all(tds.map(function(td) {return td.getText()}));
}).then(function(tdContent){
  expect(tdContent).toEqual(expectedContent);
});

关于javascript - 以惯用方式组织 javascript webdriver Promise 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28972060/

相关文章:

javascript - 我似乎无法捕获我的物体的内在最大值(value)

javascript - 如何使用 Javascript 防止 anchor 标记的默认操作?

Angularjs 1.3 异步过滤器不起作用

angularjs - 如何通过 $http 将 angular-ui 的 typeahead 与服务器绑定(bind)以进行服务器端优化?

java - 尝试使用已编译的 JavaFX 应用程序运行 Webdriver

java - WebDriver 等待网站完全加载

python - [Selenium][geckodriver] 如何更改 firefox 配置文件首选项字段,如 "security.insecure_field_warning.contextual.enabled"

javascript - 如何检查动态生成的 radio 输入值

javascript - 向字符串中的每个空格添加一个空格,然后循环返回,直到满足长度

javascript - 我可以将 chrome 扩展应用程序嵌入到我的主要 AngularJS 应用程序中吗?