Protractor 中的承诺是如何解决的?
How promises are getting resolved in Protractor?
我有疑问,上面写着:查找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() 的情况下使用它......?
If that is being handled by Protractor promise -manager
量角器承诺管理器(又名 SELENIUM_PROMISE_MANAGER)is removed 从量角器 6 开始。所以忘记它吧
Finding web elements is asynchronous
用我自己的话说,寻找以操纵它为目的的 Web 元素(click()
、getText()
等)是异步的,因此 return 是一个 Promise,需要解决。但是你在这条线上有什么
let trs = tbody.all(by.tagName('tr'));
只是一个 elementArrayFinder 声明。它不 return 承诺,因此它具有同步性质。所以你可以在打开浏览器之前很久就声明这个元素
如果您打算经常使用量角器,请将此 protractor API 页面添加为书签。在这个页面上,他们说每个命令 returns。如果没有 promise.Promise
或类似的东西,则不需要解决(例外是 browser.get
我碰巧知道这也是一个承诺,但他们没有提到)
正在回答您的问题
Isn't trs
needs to be resolved
根据量角器页面 element()
没有 return 承诺,element.all()
所以不,它们不需要解决
现在当你知道如何确定你是否使用 promises 时,让我们谈谈如何解决 Promises
- 很好的旧
.then()
语法(不是很好,但确实很旧)
element(by.css('.class')).getText().then(function(text){
console.log(text)
})
现在当你知道这个方法时,把它从你的记忆中抹去。这是额外的信息,会使您的代码不可读并且极难调试。看看这个 Promise Hell 你就会明白我在说什么
async/await
这与您计算机上的 copy/paste 一样好。上帝保佑两者的创造者,我无法想象没有他们我的生活。所以来自 #1 的相同代码现在看起来像这样
let text = await element(by.css('.class')).getText();
console.log(text)
当您查看代码片段时,是不是感觉更有意义了?另一个例子见 。基本上 await
对 javascript 说'停止,解决承诺,return 它的价值'
总而言之,如果您使用 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'
});
我有疑问,上面写着:查找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() 的情况下使用它......?
If that is being handled by Protractor promise -manager
量角器承诺管理器(又名 SELENIUM_PROMISE_MANAGER)is removed 从量角器 6 开始。所以忘记它吧
Finding web elements is asynchronous
用我自己的话说,寻找以操纵它为目的的 Web 元素(click()
、getText()
等)是异步的,因此 return 是一个 Promise,需要解决。但是你在这条线上有什么
let trs = tbody.all(by.tagName('tr'));
只是一个 elementArrayFinder 声明。它不 return 承诺,因此它具有同步性质。所以你可以在打开浏览器之前很久就声明这个元素
如果您打算经常使用量角器,请将此 protractor API 页面添加为书签。在这个页面上,他们说每个命令 returns。如果没有 promise.Promise
或类似的东西,则不需要解决(例外是 browser.get
我碰巧知道这也是一个承诺,但他们没有提到)
正在回答您的问题
Isn't
trs
needs to be resolved
根据量角器页面 element()
没有 return 承诺,element.all()
所以不,它们不需要解决
现在当你知道如何确定你是否使用 promises 时,让我们谈谈如何解决 Promises
- 很好的旧
.then()
语法(不是很好,但确实很旧)
element(by.css('.class')).getText().then(function(text){
console.log(text)
})
现在当你知道这个方法时,把它从你的记忆中抹去。这是额外的信息,会使您的代码不可读并且极难调试。看看这个 Promise Hell 你就会明白我在说什么
async/await
这与您计算机上的 copy/paste 一样好。上帝保佑两者的创造者,我无法想象没有他们我的生活。所以来自 #1 的相同代码现在看起来像这样
let text = await element(by.css('.class')).getText();
console.log(text)
当您查看代码片段时,是不是感觉更有意义了?另一个例子见 await
对 javascript 说'停止,解决承诺,return 它的价值'
总而言之,如果您使用 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'
});