ProtractorJS点击元素超时,有什么建议吗?

时间:2018-08-08 14:21:36

标签: javascript angular selenium-webdriver protractor

问题

我想单击一个简单的“新预订”按钮。如下图所示

<button _ngcontent-c9="" class="mat-menu-item" mat-menu-item="" role="menuitem" routerlinkactive="menu-highlight-item-left" tabindex="0" ng-reflect-router-link="/booking,create" ng-reflect-router-link-active="menu-highlight-item-left" aria-disabled="false">
    New Booking
<div class="mat-menu-ripple mat-ripple" matripple="" ng-reflect-disabled="false" ng-reflect-trigger="[object HTMLButtonElement]">
</div>
</button>

注意事项

这是Material 2 Angular 5应用程序,因此每个页面都使用和运行Angular。

过去,我将继续提供的代码在每次运行测试时都会100%正常运行,这使我相信源代码中的其他问题可能是导致此问题的原因。但是,没有其他加载方式/微调框或弹出式窗口

它绝对没有任何独特属性,也没有周围环境 带有ID的div附加到元素或以其他任何方式获取元素。 但是,尽管我解决了问题,但使用我对XPath的了解 找到一个我认为可行的独特定位器,如下所示。

var btnNewBooking = element(by.xpath("//*[text()='New Booking']"));

我知道这应该抓住元素,因为当我通过ChromeDevTools查询xpath时,它会突出显示该元素。

最初有效的代码

var btnNewBooking = element(by.xpath("//*[text()='New Booking']"));
btnNewBooking.click();

从ProtractorJS控制台产生的异常

Failed: Timed out waiting for asynchronous Angular tasks to finish after 11 seconds. This may be because the current page is not an Angular application. Please see the FAQ for more details: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular
    While waiting for element with locator - Locator: By(xpath, //*[text()='New Booking'])

到目前为止我尝试过什么?

我尝试使用API​​库中在“预期条件”中内置的量角器,他们提供的量度器包括所有这些:

1)等待直到元素出现

var EC = protractor.ExpectedConditions;
// Waits for the element with id 'abc' to be present on the dom.
browser.wait(EC.presenceOf($('#abc')), 5000);

2)等待直到元素可见

EC = protractor.ExpectedConditions;
// Waits for the element with id 'abc' to be visible on the dom.
browser.wait(EC.visibilityOf($('#abc')), 5000);

3)等到元素的可点击性

var EC = protractor.ExpectedConditions;
// Waits for the element with id 'abc' to be clickable.
browser.wait(EC.elementToBeClickable($('#abc')), 5000);

我也尝试过使用Angular自己的等待方法,例如:

browser.WaitForAngular();

还有

browser.WaitForAngularEnabled();

2 个答案:

答案 0 :(得分:0)

click()方法返回一个promise,如果您需要一些文档,可以肯定地阅读以下内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Protractor / WebDriverJS “控制流” 负责履行这些诺言。但是,我的团队一直在努力使同步不完美。

此问题的解决方案是实际使用EC等待元素,然后通过链接解决点击的承诺

var pages = 1;

// Not all devices have this property, but Fujitsu N7100A has.
device.Properties["Pages"]?.set_Value(ref pages);

查看此堆栈溢出答案:Protractor, when should I use then() after a click()

更好吗?

我们使用新的 async 功能 await 承诺在量角器测试中。这使我们能够重构大部分逻辑并确保适当的受控流程。该链接很好地说明了路上的叉子部分,为什么使用异步/等待的结果是“串行”代码(一次执行一个步骤):https://ponyfoo.com/articles/understanding-javascript-async-await

答案 1 :(得分:0)

您应该尝试禁用量角器以等待与Angular同步。可以通过browser.ignoreSynchronisation完成。在您的true文件中将其设置为conf.js