Метод Selenium invisibilityOf (element), выбрасывающий NoSuchElementException + WebDriverWait.ignoring (NoSuchElementException.class), не работает

Этот запрос состоит из 2 связанных вопросов. Мне нужно дождаться, пока элемент станет невидимым, прежде чем я перейду к следующему шагу, поэтому я попытался определить собственный метод, как показано ниже:

public void waitToDisappear(long timeOutInSeconds, WebElement element) {
    WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
    wait.ignoring(org.openqa.selenium.NoSuchElementException.class);
    wait.until(ExpectedConditions.invisibilityOf(element));
}

Когда я вызываю этот метод как common.waitToDisappear(5, <WebElement>);, я получаю Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element:. Однако, если я использую метод локатора new WebDriverWait(world.driver, 5).until(ExpectedConditions.invisibilityOfElementLocated((By.xpath(someXpath)))), он работает нормально без каких-либо исключений.

Вопрос-1: NoSuchElementException игнорируется в реализации Selenium invisibilityOfElementLocated(), но не в invisibilityOf(). Есть ли для этого какие-то причины? Но, думаю, именно поэтому я получаю исключение. Как мне дождаться исчезновения элемента (не локатора)?

Вопрос-2: Почему я получаю NoSuchElementException, хотя использую wait.ignoring(org.openqa.selenium.NoSuchElementException.class);. Это правильный способ использования wait.ignoring? Кажется, что wait.ignoring() здесь ничего не делает.

Заранее благодарим за ответы.


person CMM    schedule 16.08.2018    source источник


Ответы (1)


invisibilityOf ()

invisibilityOf(WebElement element) определяется как:

public static ExpectedCondition<java.lang.Boolean> invisibilityOf(WebElement element)

An expectation for checking the element to be invisible

Здесь ожидается, что элемент должен быть присутствующим, а также видимым в качестве предварительного условия, и метод будет ждать, пока элемент станет невидимым . Здесь стоит упомянуть, что, поскольку аргумент имеет тип WebElement, findElement(By by) должен успешно найти элемент в качестве предварительного условия. Следовательно, NoSuchElementException нельзя игнорировать.


invisibilityOfElementLocated ()

invisibilityOfElementLocated(By locator) определяется как:

public static ExpectedCondition<java.lang.Boolean> invisibilityOfElementLocated(By locator)

An expectation for checking that an element is either invisible or not present on the DOM.

Здесь очевидно, что элемент уже невидим или отсутствует в HTML DOM. В этом случае основной задачей является отсутствие элемента, которое может произойти даже до вызова ExpectedCondition или в течение промежутка времени, пока ExpectedCondition активно. Итак, здесь нам нужно игнорировать NoSuchElementException как обязательную меру.


Ответ на Вопрос-2: Использование wait.ignoring(org.openqa.selenium.NoSuchElementException.class); не оправдано, поскольку предварительное условие для вызова invisibilityOf(WebElement element) включает тот факт, что элемент должен присутствовать в DOM Tree в качестве обязательной меры.

person DebanjanB    schedule 16.08.2018
comment
Спасибо за быстрый ответ. Я пытаюсь дождаться загрузки (как только я попадаю на страницу, этот элемент виден, пока не отобразятся все данные), элемент должен исчезнуть, прежде чем я нажму на другой элемент. Я вижу, что visibilityOf(element) возвращает истину (это означает, что элемент найден), но invisibilityOf(element) выбрасывает NoSuchElementException. - person CMM; 20.08.2018