Метод до (Функция) в типе FluentWait не применяется для аргументов (логическое значение, ExpectedCondition <WebElement>) - PullRequest
0 голосов
/ 26 сентября 2019

Мне дали два условия, в соответствии с которыми веб-драйверу нужно дождаться выполнения любого из условий, прежде чем приступить к выполнению.Я использую явное ожидание вместе с ExpectedConditions.or для этой цели.

Я попытался использовать следующий код:

new WebDriverWait(driver.getDriver(),30).until(
    ExpectedConditions.or(
        ExpectedConditions.jsReturnsValue("return document.ReadyState")).equals("complete"),    
        ExpectedConditions.visibilityOfElementLocated(driver.findElement(By.Id("name"))
    )
);

Я получаю сообщение об ошибке:

The method until(Function<? super WebDriver,V>) in the type FluentWait<WebDriver> is not applicable for the arguments (boolean, ExpectedCondition<WebElement>)

Обратите внимание, что я использую Guava 23.0, и он уже добавлен в качестве зависимости в моем pom.xml

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

ExpectedConditions.or получает ExpectedCondition с в качестве параметров.Когда вы сравниваете результат ExpectedConditions.jsReturnsValue со строкой, вы меняете все выражение на boolean.

. Вы можете создать пользовательский ExpectedCondition, чтобы деформировать его

public static ExpectedCondition<Object> customeJsReturnsValue(final String javaScript) {
    return new ExpectedCondition<Object>() {
        @Override
        public Object apply(WebDriver driver) {
            return ExpectedConditions.jsReturnsValue("return Spotfire.Busy.idle()")).equals("true")
        }
    }
}

Использует:

new WebDriverWait(driver.getDriver(),30).until(
    ExpectedConditions.or(
        customeJsReturnsValue("return document.ReadyState")).equals("complete"),
        ExpectedConditions.visibilityOfElementLocated(driver.findElement(By.Id("name"))
    )
);
0 голосов
/ 26 сентября 2019

jsReturnsValue ()

Ожидаемые условия из jsReturnsValue() возвращает Объект и определяется как:

public static ExpectedCondition<java.lang.Object> jsReturnsValue(java.lang.String javaScript)

An expectation for String value from javascript

Parameters:
    javaScript - as executable js line

Returns:
    true once js return string

visibilityOfElementLocated ()

Ожидаемые условия из visibilityOfElementLocated() возвращает WebElement и определяется как:

public static ExpectedCondition<WebElement> visibilityOfElementLocated(By locator)

An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.

Parameters:
locator - used to find the element

Returns:
the WebElement once it is located and visible

Это сообщение об ошибке ...

The method until(Function<? super WebDriver,V>) in the type FluentWait<WebDriver> is not applicable for the arguments (boolean, ExpectedCondition<WebElement>)

... означает, что until() не применимо для нескольких типов возврата boolean и WebElement.

В вашем случае использования

  • jsReturnsValue() возвращает Объект .
  • visibilityOfElementLocated() возвращает WebElement .

Решение

Если ваш вариант использования соответствует видимости определенного WebElement , вы можете смело игнорировать проблемудля document.readyState, равного «complete» , так как это было бы накладными расходами.Соответствующее обсуждение можно найти в Selenium IE WebDriver работает только во время отладки .

Однако, для использования until() для visibilityOfElementLocated() для нескольких элементов схожего типа типов данных выможно следовать приведенному ниже примеру:

  • Ожидание любого из элементов из By.xpath("//span[@id='id1']") или By.xpath("//span[@id='id2']") будет выглядеть так:

    new WebDriverWait(driver, 10).until(ExpectedConditions.or(
        ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@id='id1']")),
        ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@id='id2']"))
    ));
    

Ссылки

Вы можете найти несколько подробных обсуждений в


Outro

Есть ли у нас какая-либо общая функция, чтобы проверить, полностью ли загружена страница в Selenium

...