【问题标题】:Issues with resolving promise on browser.findElements in Protractor解决 Protractor 中 browser.findElements 上的承诺的问题
【发布时间】:2018-07-26 15:55:58
【问题描述】:

我正在尝试在量角器中编写一个测试(使用 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();
            });

【问题讨论】:

  • 能否请您发布输出消息是什么。

标签: typescript selenium-webdriver jasmine protractor


【解决方案1】:

输出大约是ManagedPromises,因为Elementfinder.getText() 方法返回的是Promise 对象,而不是您期望的stringgetText() 实际上是一个async 函数,这些函数总是返回一个PromisePromise 可以被认为是一个值的包装器。这是管理代码的好概念。请花点时间了解Promise Objects。

另一个问题是, 如果您想从元素中输出文本,您必须调用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();
}

希望我能帮上忙。干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2018-04-02
    相关资源
    最近更新 更多