箭头函数内的 webdriverio 元素未定义

webdriverio element undefined inside arrow function

我正在从事 webdriverio 自动化项目。我有以下代码。

waitUntilVisible(element, maxTimeOut) {
    console.log("********** PARAMETER ************" + element);

    const testelement = $('#identifierId');

    browser.waitUntil(testelement => {

        console.log("************** INSIDE *********" + testelement);

        return testelement.isDisplayed();

    }, maxTimeOut, 'Wait for element to be visible');
}

testelement 总是返回未定义的。有人可以告诉我出了什么问题吗?

/**
 * Check if the given element is (not) visible
 * @param  {String}   selector   Element selector
 * @param  {String}   falseCase Check for a visible or a hidden element
 */
const isDisplayed = async (selector, falseCase) => {
    let elem = await browser.$(selector);
    const displayed = await elem.isDisplayed();
    if (falseCase) {
        expect(displayed).to.not
            .equal(true, `Expected element "${selector}" not to be displayed`);
    } else {
        expect(displayed).to
            .equal(true, `Expected element "${selector}" to be displayed`);
    }
}

使用 browser.$(selector) 并使用该元素继续您的测试。我添加了一个方法来检查元素是否已显示。

为什么不使用 waitForDisplayed

但是如果你想使用自己的 - 你在调用你的函数时遇到问题


waitUntilVisible(element, maxTimeOut) {
    console.log("********** PARAMETER ************" + element);
    //this is never called due same name of variable in fn waitUntil
    const testelement = $('#identifierId');

可能的修复:

// if you want to pass selector 
waitUntilVisible(elementSelector, maxTimeOut) {
    console.log("********** PARAMETER ************" + elementSelector);
    browser.waitUntil(testelement => {
        console.log("************** INSIDE *********" + elementSelector);
        return $(elementSelector).isDisplayed();
    }, maxTimeOut, 'Wait for element to be visible');
}

// if you want to pass WebDriverIO object 
waitUntilVisible(element, maxTimeOut) {
    console.log("********** PARAMETER ************");
    browser.waitUntil( () => {
        console.log("************** INSIDE *********");
        return element.isDisplayed();
    }, maxTimeOut, 'Wait for element to be visible');
}