在Protractor中解决browser.findElements上的promise问题



我正试图用量角器(使用jasmine和typescript(编写一个测试,试图点击表中列出的每个链接。在点击每个链接之前,我希望测试显示它正在点击的链接的文本,这就是问题所在。当我尝试对包含所有元素的对象调用.gettext((时,输出是关于ManagedPromises的。我已经研究了其他问题来试图解决这个问题,但最终我的解决方案看起来与我所看到的类似。下面是我的代码:

browser.findElements(By.xpath('//tBody//a')).then((clickLinks) => {
console.log('made it [' + i + ']');
console.log('link clicked[' + i + ']: ' + clickLinks[i].getText());
clickLinks[i].click();
i++;
browser.waitForAngular();
browser.driver.navigate().back();
browser.waitForAngular();
});

输出是关于ManagedPromises的,因为方法Elementfinder.getText()返回的是Promise对象,而不是预期的stringgetText()实际上是async函数,这些函数总是返回PromisePromise可以被认为是一个值的包装器。这是一个管理代码的好概念。请慢慢来了解Promise对象。

另一个问题是如果您想从元素中输出文本,您必须调用getText().then(Func),如下所示:

browser.findElements(by.xpath('//tBody//a')).then((clickLinks) => {
clickLinks[i].getText().then(function(text) {
console.log('got text from link:', text);
});
});

例如,browser.waitForAngular();也是一个异步函数。因此,您的代码不会像您期望的那样工作。

如果你写:

browser.waitForAngular(); browser.driver.navigate().back();

这两个函数将直接执行。上面的代码将正确地写如下:

browser.waitForAngular().then(function() {
console.log('waitForAngular() done');
browser.driver.navigate().back().then(function() {
console.log('navigated');
});
});

这看起来有点混乱,所以他们将关键字await添加到了javascript中,该关键字在每个async函数中都可用。上面的代码与await组合如下:

async function waitForPage() {
await browser.waitForAngular();
await browser.driver.navigate().back();
}

希望我能帮上忙。干杯

最新更新