Как и когда реализовать обновленное (ExpectedCondition условие) Selenium WebDriver?
Я проходил через методы ExpectedCondtions
класс и нашел один способ: освежил
Я могу понять, что метод можно использовать, когда вы получаете StaleElementReferenceException
и вы хотите получить этот элемент снова и таким образом, чтобы избежать StaleElementReferenceException
мое выше понимание может быть неправильным, поэтому я хочу подтвердить:
- , когда
refreshed
следует использовать? - каким должен быть код
something
часть следующим код:
wait.until(ExpectedConditions.refreshed(**something**));
может кто-нибудь объяснить это на примере?
2 ответов
согласно источнику:
обертка для условия, которое позволяет обновлять элементы путем перерисовки. Это работает вокруг проблемы условий, которые имеют две части: найти элемент, а затем проверьте на него какое-то условие. Для этих условий возможно, что элемент находится, а затем впоследствии перерисовывается клиент. Когда это происходит, {@link StaleElementReferenceException} является бросается, когда вторая часть условия проверен.
таким образом, в основном, это метод, который ждет, пока манипуляция DOM не будет завершена на объекте.
обычно, когда вы делаете driver.findElement
этот объект представляет, что такое объект.
когда DOM манипулировал и, скажем, после нажатия кнопки, добавляет класс к этому элементу. Если вы попытаетесь выполнить действие над указанным элементом, он бросит StaleElementReferenceException
теперь WebElement
returned now не представляет обновленного элемент.
вы будете использовать refreshed
когда вы ожидаете, что произойдет манипуляция DOM, и вы хотите подождать, пока это не будет сделано в DOM.
пример:
<body>
<button id="myBtn" class="" onmouseover="this.class = \"hovered\";" />
</body>
// pseudo-code
1. WebElement button = driver.findElement(By.id("myBtn")); // right now, if you read the Class, it will return ""
2. button.hoverOver(); // now the class will be "hovered"
3. wait.until(ExpectedConditions.refreshed(button));
4. button = driver.findElement(By.id("myBtn")); // by this point, the DOM manipulation should have finished since we used refreshed.
5. button.getClass(); // will now == "hovered"
обратите внимание, что если вы выполняете say a button.click()
в строке #3 он вызовет исключение StaleReferenceException, так как DOM был манипулирован в этот момент.
в мои годы использования Селена мне никогда не приходилось использовать это условие, поэтому я считаю, что это " крайний случай" ситуация, что вы, скорее всего, даже не придется беспокоиться об использовании. Надеюсь, это поможет!
на refreshed
метод был очень полезен для меня при попытке получить доступ к результату поиска, который был недавно обновлен. Попытка дождаться результата поиска просто ExpectedConditions.elementToBeClickable(...)
возвращает StaleElementReferenceException
. Чтобы обойти это, это вспомогательный метод, который будет ждать и повторять максимум 30s для элемента поиска, который будет обновлен и доступен для кликабельности.
public WebElement waitForElementToBeRefreshedAndClickable(WebDriver driver, By by) {
return new WebDriverWait(driver, 30)
.until(ExpectedConditions.refreshed(
ExpectedConditions.elementToBeClickable(by)));
}
затем нажать на результат поиска:
waitForElementToBeRefreshedAndClickable(driver, By.cssSelector("css_selector_to_search_result_link")).click();
надеюсь, это было полезно для других.