Транспортир - получение вычисляемого стиля из веб-элемента с помощью browser.executeScript работает со строкой, но не работает с функцией - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь проверить видимость всплывающей подсказки, вызывая свойство window.getComputedStyle().visibility с помощью каркаса транспортира.

Когда я передаю строку в executeScript, она работает нормально.Он возвращает visible:

// elementToCheck is an ElementFinder
async getComputedStyleVisibility(elementToCheck) {
    return await browser
         .executeScript(`return window.getComputedStyle(document.querySelector('${elementToCheck.locator().value}')).visibility`);
}

Однако это не удается, когда я заменяю строку в executeScript на функцию.Он возвращает hidden и , похоже, что выполнение застревает до тех пор, пока всплывающая подсказка не исчезнет.

Итак, я предполагаю, что есть некоторая проблема с синхронизацией, но я не могу понять, что происходит:

// elementToCheck is an ElementFinder
async getComputedStyleVisibility(elementToCheck) {
    return await browser.executeScript(
        webElem => (window.getComputedStyle(webElem).visibility),
        await elementToCheck.getWebElement()
    );
}

1 Ответ

0 голосов
/ 11 июня 2019

Чтобы ваш скрипт работал так, как вы хотели, вам нужно правильно получить доступ к вашему webElement.

документы скажем,

Любые аргументы, предоставленные дополнительнок сценарию будут включены как аргументы сценария, и на него можно ссылаться, используя объект аргументов

Поэтому вам необходимо использовать объект arguments в вашем сценарии.Вот так:

async getComputedStyleVisibility(elementToCheck) {
    return await browser.executeScript(
        () => (window.getComputedStyle(arguments[0]).visibility),
        await elementToCheck.getWebElement()
    );
}

НО

Если вы не ограничены каким-либо образом только в использовании browser.executeScript(), вам следует переосмыслить свой подход.

protractor предоставляет API для проверки наличия определенного элемента или аналогичного.

Проверьте элемент, который должен присутствовать и быть видимым для пользователя:

element(by.css("#a")).isDisplayed()
    .then(isDisplayed => console.log("element displayed?", isDisplayed))
    .catch(err => console.error("Some error happedn. Element not present..", err))

Вы должны использовать browser.executeScript() только в качестве последнего средства на мой взгляд.Большинство общих вещей, таких как щелчок, проверка наличия и т. Д., Уже есть в удобной форме, предоставленной protractor.

...