javascript - Protractor 中的 Promise 是如何解决的?
问题描述
我有个疑问,上面写着:查找web元素是异步的,不管是单个元素还是集合,所以结果是一个promise。所以如果是这种情况,下面的代码片段是如何工作的:
describe('the contact list', () => {
it('with filter: should find existing ' +
'contact "Craig Service"', () => {
let tbody = element(by.tagName('tbody'));
let trs = tbody.all(by.tagName('tr'));
let craigService = trs.filter(elem => {
return elem.all(by.tagName('td')).get(1).getText()
.then(text => {
return text === 'Craig Service';
});
});
是不是 trs 需要使用 then().. 来解决,在我们移动到下一行使用过滤器函数 (craigService) 之前?如果这是由 Protractor promise -manager 处理的,我们是否可以使用相同的策略来使用 gettext().. 获取元素的文本..然后在不使用 then().. 的情况下使用它?
解决方案
如果这是由 Protractor promise -manager 处理的
量角器承诺管理器(AKA SELENIUM_PROMISE_MANAGER)从量角器 6 开始被删除。所以忘了它
查找 Web 元素是异步的
用我自己的话来说,以操作为目的查找 Web 元素(click()
等getText()
)是异步的,因此会返回一个需要解决的 Promise。但是你在这条线上有什么
let trs = tbody.all(by.tagName('tr'));
只是一个 elementArrayFinder 声明。它不返回承诺,因此它具有同步性质。所以你可以在你打开浏览器很久之前声明这个元素
如果您打算经常使用量角器,请将此量角器 API页面添加为书签。在此页面上,他们说明了每个命令返回的内容。如果没有promise.Promise
或类似的东西,它不需要解决(例外是browser.get
我碰巧知道也是一个承诺,但他们没有提到)
回答你的问题
是不是
trs
需要解决
根据量角器页面element()
不返回 Promise,以及element.all()
NO,它们不需要解决
现在,当您知道如何确定是否使用 Promise 时,让我们谈谈如何解决 Promises
- 好的旧
.then()
语法(不是很好,但确实很旧)
element(by.css('.class')).getText().then(function(text){
console.log(text)
})
现在当你知道这个方法时,把它从你的记忆中抹去。这是额外的信息,会使您的代码不可读并且极难调试。看看这个Promise Hell你就会明白我在说什么
async/await
这与在您的计算机上复制/粘贴一样好。上帝保佑两者的创造者,我无法想象没有他们的生活。所以 #1 中的相同代码现在看起来像这样
let text = await element(by.css('.class')).getText();
console.log(text)
当您查看代码段时,它不是更有意义吗?另一个例子见这个线程。基本上await
对javascript说'停止,解决承诺,返回它的价值'
总而言之,如果你解决你的代码片段的承诺,async/await
你会得到
describe('the contact list', () => {
it('with filter: should find existing contact "Craig Service"', async () => { // pay attention to this async
let tbody = element(by.tagName('tbody'));
let trs = tbody.all(by.tagName('tr'));
let craigService = await trs.filter(async elem => { // async again
let text = await elem.all(by.tagName('td')).get(1).getText()
return text === 'Craig Service'
});
推荐阅读
- android - ConstraintLayout 和 2 个 TextView 在一行上
- c# - 如何检查列表是否包含所有数组项?
- python - 如何在python scrapy中将日期转换为mysql日期格式
- css - 如何在 React-Bootstrap 中更改 Modal 的大小/高度/宽度?
- fpga - 异步 FIFO SystemVerilog
- php - 在中继器内使用中继器
- react-native - 在 React 中根据条件更改 Toast 图标颜色
- autocomplete - 如何将选项卡完成输出(通常在 cli 光标下方)转储到文件中?
- sql - 这个“order by”,“group by”sql有什么问题?
- c - 为什么在使用 int 变量时会收到警告,但在使用整数常量时却没有?