Проверьте, является ли WebElement устаревшим без обработки исключения
В настоящее время я проверяю, является ли WebElement устаревшим, выполнив следующие действия:
public static boolean isStale(WebElement element) {
try {
element.click();
return false;
} catch (StaleElementReferenceException sere) {
return true;
}
}
Это то же самое, что решение, предлагаемое для этого вопроса:
Проверить наличие устаревшего элемента с помощью селена 2?
Однако это кажется мне довольно грязным. Есть ли более чистый способ, которым я могу проверить, является ли элемент устаревшим, без необходимости бросать и исключать исключение?
(Кроме того, в качестве стороны, если я должен придерживаться броска и ловить исключение, есть ли что-то лучше, чем нажимать/отправлять ключи/зависать, чтобы выбросить указанное исключение? У меня может быть WebElement, который я не делаю хотите выполнить любое из этих действий, так как это может непреднамеренно повлиять на что-то другое.)
Ответы
Ответ 1
Webdriver сам использует конструкцию try/catch, чтобы проверить также на тотальность.
from org.openqa.selenium.support.ui.ExpectedConditions.java:
public static ExpectedCondition<Boolean> stalenessOf(final WebElement element) {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver ignored) {
try {
// Calling any method forces a staleness check
element.isEnabled();
return false;
} catch (StaleElementReferenceException expected) {
return true;
}
}
@Override
public String toString() {
return String.format("element (%s) to become stale", element);
}
};
}
Проверка isEnabled() лучше, чем действие щелчка - щелчок элемента может вызвать нежелательные побочные эффекты, и вы просто хотите проверить состояние элемента.
Ответ 2
Я знаю, что у этого уже есть принятый ответ, и я не знаю более широкого контекста того, как вы используете проверку на тотальность, но, возможно, это поможет вам или другим. Вы можете ExpectedConditions.stalenessOf(WebElement)
выполнить эту работу за вас. Например,
WebElement pageElement = driver.findElement(By.id("someId"));
WebDriverWait wait = new WebDriverWait(webDriver, 10);
// do something that changes state of pageElement
wait.until(ExpectedConditions.stalenessOf(pageElement));
В этом случае вам не нужно делать pageElement.click()
и т.д., чтобы вызвать проверку.
В документах .stalenessOf()
ждет, пока элемент больше не привязан к DOM.
Ссылки: ExpectedConditions
Ответ 3
Классическая инструкция для С# для проверки стабильности веб-элемента
protected bool IsStale
{
get { return ExpectedConditions.StalenessOf(webElement)(WebDriver); }
}
Ответ 4
Я не совсем понимаю, что вы хотите сделать. Что вы подразумеваете под "грязным" решением?
Возможно, вы можете использовать explicite wait as как ожидаемое условие stalenessOf в сочетании с not.
Но каждое решение с этим не кажется мне стабильным.
Что я делаю, так это то, что в helperclass есть процедура щелчка, идея такова:
public void ClickHelper(WebDriver driver, By by){
int counter = 1;
int max = 5;
while (counter <= max) {
try {
WebElement clickableWebElement = driver.findElement(by);
clickableWebElement.click();
return;
} catch (StaleElementReferenceException e) {
System.out.print("\nTry " + counter + " with StaleElementReferenceException:\n" + e.getMessage() + "\n");
}
versuche++;
}
throw new RuntimeException("We tried " + max + " times, but there is still an Exception. Check Log!");
}
Будьте осторожны, я просто ввел это, просто используя свой собственный метод (есть еще несколько проверок и лично я использую xpath, а не и т.д.). Могут быть некоторые опечатки, но я думаю, вы поймете основную идею. Поскольку я использую этот Helpermethode, мне не нужно заботиться о Staleness webelements. Вы можете изменить максимальное значение, но лично я думаю, что если сайт такой неустойчивый, что Элемент настолько устарел, я бы поговорил с разработчиком, потому что это не был бы хороший сайт.