以惯用方式组织javascript webdriver promise代码
Organise javascript webdriver promises code idiomatically
我通过量角器使用webdriver断言html表中特定行的内容。我有以下代码可以正常工作,但看起来很糟糕。我想要有关如何更好地用承诺习惯性地组织此代码的建议;特别是,我想更明显地说明此代码有 3 个部分:
- 查找页面上带有 td 的行,其中包含指定
matchText
- 检查是否只有一行匹配,并使用有用的调试信息处理错误情况
- 检查此匹配行中 tds 的文本内容是否符合预期
有没有办法我可以更好地组织它以使其更具可读性,也许通过链接承诺或其他东西?
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);
})
});
}
});
是的,您可以将 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) {
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);
});
如何使用 element
, element.all()
并让expect()
为我们解决承诺,并从引入方便toBeArrayOfSize()
匹配器的包中获得一些帮助jasmine-matchers
:
element.all(by.xpath("//td[text() = '" + matchText + "']/..")).then(function(trs) {
expect(trs).toBeArrayOfSize(1);
expect(trs[0].element(by.tagName('td')).getText()).toEqual(expectedContent);
});
最后,
我从@Bergi那里获得了链接承诺,从@alexce那里获得了元素 api(谢谢两位!)并提出了这个:
it('Matches tds', function() {
browser.get('index.html');
var textToMatch = 'TDs';
expect(
element.all(trsContainingTd(textToMatch)).then(extractTds)
).toEqual(
[['Expected', 'TDs', 'content']]
);
});
function trsContainingTd(matchText) {
return by.xpath("//td[text() = '" + matchText + "']/..");
}
function extractTds(trs) {
return protractor.promise.all(trs.map(function(tr) {
return tr.all(by.tagName('td')).getText();
}));
}
这对我来说有几个好处:
- 这是一个单一的期望
- 如果匹配行比预期多/少,它将打印出有用的调试
trsContainingTd
和extractTds
函数足够通用,可以在其他地方使用
相关文章:
- 使用promise和mongoose对文档进行排序
- 测试Angular Service解决错误回调中的promise
- Selenium WebDriver and JavaScript change
- Webdriver.io pageObject模式-通过传递参数来定义元素选择器
- 节点协同与生成器和Promise并行流量控制
- 根据是否解析了 Promise 从函数返回值
- 将一个方法转换为promise:Nodejs
- 函数在promise被解析后被调用,但Jasmine未通过测试.为什么?
- js promise没有正确关闭
- Angularjs使用“;这个“;promise内的关键字回调
- AngularJS和promise值在调用本地函数时的效果-未定义
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- 以同步方式获取Javascript Promise的值
- NodeJS和pg promise,捕获PostgreSQL异常
- AngularJS使用http进行promise处理
- Angular promise return"未定义的“;值.NET MVC
- Promise函数在.then之后未运行函数化
- 如何为javascript promise进行阻塞并返回解析结果
- 以惯用方式组织javascript webdriver promise代码
- Selenium Webdriver JavaScript: Promise似乎没有得到解决