【发布时间】:2018-12-31 03:54:38
【问题描述】:
我已经为 browser.wait 编写了一些函数。我的问题是当我运行测试时,由于量角器运行太快,它们不一致地通过。为了解决这个问题,我使用了 browser.sleep。这有效,但效率不高。例如,如果我的连接速度很慢,这些 browser.sleep 语句可能会变得不可靠。所以我开始使用browser.wait。这是我使用的等待函数的示例。
EC = Expected Conditions;
myForm = element(by.id('myForm');
button1 = element(by.id('btn1');
waitForBtn = this.EC.elementToBeClickable(button1)
formIsVisible = this.EC.visibilityOf(myForm)
//Test
it(should click the button and bring up the form), () => {
browser.wait(page.waitForBtn, 3000);
page.button1.click()
browser.wait(page.formIsVisible, 3000);
expect(page.getMyForm().isDisplayed).toBeTruthy();
此测试可以单独运行,但与其他测试结合使用时,有时测试会失败并返回错误"element" is not clickable at point...。即使使用这些等待功能,我也会收到此错误。它似乎总是用于单击元素时。
我的问题是:在运行多个测试时,量角器等待的最佳方式是什么,以免量角器执行测试过快而错过元素?谢谢。 编辑: 这是解决方案。
点击元素的辅助函数。
async function sendClick(el: ElementFinder): Promise<void> {
try {
let result = await forCondition(function() { return el.isDisplayed() });
if(!result || !await el.isEnabled()) {
throw new Error('element disabled');
}
await browser.executeScript('arguments[0].click();', el.getWebElement());
} catch(error) {
console.warn('element:', el.locator().toString(), 'is not clickable', error.message);
}
}
export async function forCondition(condition: () => any | PromiseLike<boolean>, timeout = 20000): Promise<boolean> {
try {
return await browser.wait(condition, timeout);
} catch (err) {
console.log('Condition: false');
return false;
}
}
【问题讨论】:
标签: protractor