Почему в этом случае возникает исключение Stale Element? - PullRequest
1 голос
/ 04 октября 2019

У меня есть следующая функция веб-драйвера:

this.clickButton = async function () {
  try {
    var buttonElement = await driver.findElement(By.className('button-class'));
    await buttonElement.click();
  }
  catch (err) {
    console.log(err);
  }
}

Это иногда дает Stale Element exception.

Иногда я получаю это исключение, даже если я изменяю его на:

this.clickButton = async function () {
  try {
    await driver.findElement(By.className('button-class')).click();
  }
  catch (err) {
    console.log(err);
  }
}

Мои вопросы:

  1. Это нормально / ожидается, что Stale Reference exception может произойти в этой функции, где я получаю ссылку на элемент, а затем использую его в следующий разстрока или даже та же строка, ничего не делая со страницей? (Я мог бы понять, как получить исключение «элемент не найден», если не было элемента «button-class», но для меня не имеет смысла, что элемент существует в то время, когда я его ищу, но этопрошло к тому времени, когда будет достигнута следующая строка кода.)

  2. Если ответ на вопрос 1 - да, то как это возможно? На найденный элемент немедленно воздействуют, как в этом случае? Как видите, я не использую локаторы / элементы;функция ищет элемент каждый раз, когда его вызывают, и завершается сразу после щелчка.

  3. Уместно ли, что нажатие кнопки удаляет себя со страницы? То есть я мог получить это исключение, потому что кнопка исчезла после нажатия?

1 Ответ

0 голосов
/ 12 октября 2019

Вы должны использовать оператор селена, ожидающий нажатия до нажатия, эта ошибка произошла, потому что она все еще не появилась в DOM или все еще не активна. Пример кода:

var webDriver= new ChromeDriver(Constants.DriverPath);
WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(5));
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.ClassName('button-class')));

Затем после этого вы можете выполнить свою операцию:

var buttonElement = await webDriver.FindElement(By.ClassName('button-class'));
    await buttonElement.Click();

В JavaScript нет кликабельности, но вы можете проверить наличие видимых и включить состояние, например:

driver.findElement(webdriver.By.name('q')).then(function (element) {
    driver.wait(function () {
        return element.isDisplayed().then(function (displayed) {
            if (!displayed)
                return false;

            return element.isEnabled();
        });
    });
    element.sendKeys('webdriver');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...