Как устранить ошибку устаревшего элемента в цикле for - PullRequest
0 голосов
/ 24 мая 2018

У меня есть функция, которая принимает число в качестве параметра, которое будет количеством раз, которое должны быть выполнены действия цикла.

  async add(n) {
    for (let i = 0; i < n; i++) {
      const num = Math.floor(Math.random() * 999)

      await EC.isVisible(this.s.tm.button.invite)
      await this.el.clickElement(this.s.tm.button.invite)

      await EC.isVisible(this.s.tm.modal.container)
      await this.form.populateFormField(this.s.tm.modal.firstName, i)
      await this.form.populateFormField(this.s.tm.modal.lastName, i)
      await this.form.populateFormField(this.s.tm.modal.email,`${num}@${i}.es`)

      await this.el.clickElement(this.s.tm.modalButton.invite)
      await EC.isVisible(this.s.tm.successModal.container)

      await this.el.clickElement(this.s.modal.close)
    }
  }

Иногда я получаю stale element error и убежище 'не смог избавиться от этого.Это указывает на эту строку: await this.el.clickElement(this.s.tm.button.invite)

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

Может кто-нибудь объяснить, почему ждет, пока элемент будет виден, а затем, щелкнув по нему, он не работает?

IЯ также пытался сохранить локаторы в переменной и затем выполнить над ними действия, но это не сработало.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я не знаком с этим языком, но исключение ссылки на устаревший элемент возникает из-за того, что вы нашли элемент, и затем что-то в этом элементе изменяется, поэтому ваша ссылка на элемент устарела (она больше не действительна).Поэтому, если вы делаете что-то, что приводит к изменению этого элемента, вам нужно будет впоследствии переместить элемент, прежде чем пытаться что-то сделать с ним снова.

0 голосов
/ 24 мая 2018

Переменная, в которой вы определяете элемент, присвойте локатор непосредственно перед тем местом, где вы хотите его вызвать.И DOM получит объект для того же.

Пример:

            List<WebElement> findExistingRow = driver.findElements(By.xpath(""));

            int i = findExistingRow.size();

            while (i != 0) {            

                findExistingRow = driver.findElements(By.xpath(""));
                i = findExistingRow.size();
            }

Здесь я хочу обновить значение переменной i, но я получаю то же исключение.Который был причиной обновления DOM.Я переназначил webelement, из которого переменная i становится получающей значение.Например, переменная findExistingRow назначается дважды каждый раз.

...