Проверьте, является ли 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. Вы можете изменить максимальное значение, но лично я думаю, что если сайт такой неустойчивый, что Элемент настолько устарел, я бы поговорил с разработчиком, потому что это не был бы хороший сайт.