Javascript 承诺是如何在量角器中得到解决的?
我有一个疑问,它是这样写的:无论是单个元素还是集合,查找web元素都是异步的,所以结果是一个承诺。因此,如果是这种情况,下面的代码段是如何工作的:Javascript 承诺是如何在量角器中得到解决的?,javascript,jasmine,protractor,Javascript,Jasmine,Protractor,我有一个疑问,它是这样写的:无论是单个元素还是集合,查找web元素都是异步的,所以结果是一个承诺。因此,如果是这种情况,下面的代码段是如何工作的: describe('the contact list', () => { it('with filter: should find existing ' + 'contact "Craig Service"', () => { let tbody = element(by.tagName('tbody'));
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';
});
});
是否需要使用then()解析trs,在我们进入下一行使用过滤功能(craigService)之前?
如果这是由promise-manager处理的,那么我们可以使用相同的策略使用gettext()获取元素的文本,然后不使用then()使用它吗
如果这是由量角器承诺经理处理的
量角器承诺管理器(又名硒承诺管理器)从量角器6开始。所以忘了它吧
查找web元素是异步的
用我自己的话来说,查找web元素并对其进行操作(click()
,getText()
等)是异步的,因此会返回一个需要解决的承诺。但是你在这条线上有什么
let trs = tbody.all(by.tagName('tr'));
只是一个elementArrayFinder声明。它不返回承诺,因此它具有同步性。所以你可以在打开浏览器之前声明这个元素
如果您打算经常使用量角器,请将此页面标记为书签。在这一页上,他们说出每个命令返回的内容。如果它没有承诺。承诺或类似的东西,它就不需要解决(例外是browser.get
,我碰巧知道这也是一个承诺,但他们没有提到)
回答你的问题
是否需要解决trs
根据量角器页面element()
不返回承诺,也不返回element.all()
因此不需要解析
现在,当你知道如何找出你是否与承诺一起工作时,让我们谈谈如何解决承诺
.then()
语法(不是很好,但确实很旧)async/await
这与在计算机上复制/粘贴一样好。上帝保佑这两者的创造者,我无法想象没有他们我的生活。那么来自#1的相同代码现在看起来是这样的wait
对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'
});
不,你不能在不等待的情况下使用文本。上面代码中的一些行可以用“惰性评估”过程来解释——即使它们是异步的,只要这些操作不需要立即知道元素的实际值,您就可以对它们执行操作,而无需等待。另一方面,用文本值做事情并不是这样的……嗨,谢谢。你能帮我得到一些属于“惰性评估”的操作,以及我们需要等待的操作吗。任何文档或链接都是有用的。我想创建新Proactor对象的每个方法都会被延迟并异步执行,但是所有返回普通值的方法(例如
getText
)都会返回一个承诺。这是一个很棒的解释。谢谢,非常感谢;)
let text = await element(by.css('.class')).getText();
console.log(text)
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'
});