我在定义自定义等待条件时遇到了selenium javascript绑定的问题。我正在编写一个测试用例来测试一个按钮的功能,其中一个按钮被禁用,但最终会被启用。状态之间的等待时间非常长(4分钟),因为页面加载时会播放教程动画,完成后会启用该按钮。
我已尝试在按钮上使用until.elementIsEnabled条件,但这不起作用。所以,我一直试图让自定义条件起作用。
根据API documentation on until conditions,自定义事件可以编码如下:
driver.wait(function() {
return driver.getTitle().then(function(title) {
return title === 'webdriver - Google Search';
});
}, 1000);
从那个例子,我有这个代码等待状态转为true:
const locator = { id: "Button" };
await driver.wait(until.elementLocated(locator));
const button = await driver.findElement(locator);
await driver.wait(async function () {
const attr = await button.getAttribute("enabled");
log.info(model.browser.type + " - " + "Polling attribute value: " + attr);
return await attr === true;
}, 400000);
从我在那里的日志记录(这是js-logging npm包),我看到selenium-webdriver每毫秒循环该代码,并且状态确实在大约4分钟内从false转换为true,正如预期的那样。但是循环一直持续到它超过400000ms的超时值,大约在变量状态改变后两分钟。
我在这里错过了什么?
你尝试过使用fluentWait
吗?
Wait wait = new FluentWait(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
documentation for WebDriver#wait要求将WebDriver对象作为参数传递给函数。
await driver.wait(function(driver) {
return driver.getTitle().then(function(title) {
return title === 'webdriver - Google Search';
});
}, 1000);
或者,您可以使用Promise或Condition。