javascript - 测试 React 组件时解决 selenium-webdriver 中的 StaleElementReference

标签 javascript selenium selenium-webdriver reactjs

我有一个相当基本的 react 组件,它呈现一个带有包含数字的跨度的按钮,以及 yadda/mocha 对其进行测试。

有时测试因 StaleElementReference 失败 - 这似乎是在组件更新缓慢时发生的,因此

driver.findElement(By.css('.button-counter')).then(function(counter) { 在元素更新之前执行,然后自然

counter.getText() 失败。

似乎一种常见的方法是在实际测试失败之前尝试多次重新获取元素(就像完成 here 一样);问题是,就我而言,无论我等待多长时间,我总是会得到对陈旧元素的引用;感觉就像 driver.findElement 将第一个结果缓存在某处,并且始终返回该结果以供当前测试用例运行中的后续提取。

我在某个时候使用了以下方法,该方法应该有效,但不知何故我仍然得到了 StaleElementReferences:

function waitForElementWithText(driver, cssSelector, txt, attempts) {
  if (!attempts) {
    attempts = 3;
  }

  // first wait for element to be present
  return driver.findElement(By.css(cssSelector)).then(function(found) {
    // now wait for it to be visible
    driver.manage().timeouts().implicitlyWait(300); // we need this to be faster now
    driver.wait(function() {
      return found.isDisplayed().then(function(visible) {
        // First wait for it to become visible
        if (visible) {
          // Then wait for text to be populated
          return found.getText().then(function(gotTxt) {
            return gotTxt === txt;
          }, function(err) {
            if (attempts > 0) {
              return waitForElementWithText(driver, cssSelector, txt, attempts--);
            }
             throw err;
          });
        }
        driver.sleep(300); // give it a break
        return false;
      }, function(err) { /* err hnd */
        if (attempts > 0) {
          return waitForElementWithText(driver, cssSelector, txt, attempts--);
        }
        throw err;
      });
    }, function(err) {
      if (attempts > 0) {
        return waitForElementWithText(driver, cssSelector, txt, attempts--);
      }
      throw err;
    });
    // restore implicit wait
    driver.manage().timeouts().implicitlyWait(10000);
  }, function(err) { /* err hnd */
    if (attempts > 0) {
      return waitForElementWithText(driver, cssSelector, txt, attempts--);
    }
    throw err;
  });
}

目前,我只是在执行第一个 findElement 之前添加了 1 秒 sleep ,但这当然不是最佳的。 那么有什么推荐的方法来处理这种情况吗?还是我做错了什么?

提前致谢!

最佳答案

除非绝对必要,否则最好不要存储对变量的 WebElement 引用。相反,存储选择器并在需要时使用选择器检索元素。这应该可以缓解大部分或全部 StaleElementExceptions。

关于javascript - 测试 React 组件时解决 selenium-webdriver 中的 StaleElementReference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862414/

相关文章:

javascript - 具有多种功能的 jQuery 作用域

java - 使用 Selenium Webdriver 控制 Chrome Devtools

javascript - 使用node js访问本地网络驱动器

javascript - 将事件与参数一起传递给函数

javascript - 使用内置样式的 Bootstrap 3 表单验证

selenium-webdriver - Protractor:Protractor 中的ignoreSynchronization 和async/await 有什么区别

selenium-webdriver - Selenium Grid : Error communicating with the remote browser. 它可能已经死了

启动时的 Selenium 服务器

java - 当我尝试安装 cucumber Eclipse 插件时,它没有安装并显示一些错误

python - 如何使用 Selenium 在动态加载的网页中正确滚动?