如何解决for循环中的陈旧元素错误

时间:2018-05-24 10:50:42

标签: selenium-webdriver protractor staleelementreferenceexception

我有一个函数,它将一个数字作为参数,该参数将是循环操作的执行次数。

  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中。我尝试了几种类似帖子中找到的解决方案,但没有一种方法有效。

有人可以解释为什么等待元素可见,然后点击它不能正常工作吗?

我还尝试将定位器存储在变量中,然后对它们执行操作,但这并没有奏效。

2 个答案:

答案 0 :(得分:0)

您有定义元素的变量,在您想要调用它之前指定定位器。 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变量每次分配两次。

答案 1 :(得分:0)

我不熟悉这种语言,但由于您找到了该元素,因此会发生陈旧元素参考异常,然后有关该元素的某些内容发生变化,因此您对该元素的引用是陈旧的(它是&#39; s不再有效)。因此,如果你做了导致该元素发生变化的事情,那么在你尝试再次对它做一些事情之前,你需要重新定位元素。