我有一个相当基本的 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/