selenium-webdriver(javascript绑定)中的自定义等待条件不起作用

时间:2017-10-29 20:13:08

标签: javascript selenium-webdriver

我在定义自定义等待条件时遇到了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,大约在变量状态发生变化后两分钟。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

您是否尝试使用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"));
    }

});

答案 1 :(得分:0)

documentation for WebDriver#wait要求将WebDriver对象作为参数传递给函数。

await driver.wait(function(driver) {
    return driver.getTitle().then(function(title) {
        return title === 'webdriver - Google Search';
    });
}, 1000);

或者,您可以使用Promise或Condition