Javascript 如何解决Mocha.js+Selenium+wd.js中的StaleElementReference
我正在为一个使用Mocha+SeleniumServer+wd.js+chai的网站编写自动化测试。 该网站使用JavaScript作为前端,当执行某些操作时,它似乎会刷新页面上的元素。i、 e.在网格中选择一个元素后,启用“下一步”按钮,允许用户进入下一页。这似乎会更改对button元素的引用,从而导致StaleElementReference错误Javascript 如何解决Mocha.js+Selenium+wd.js中的StaleElementReference,javascript,selenium,mocha.js,Javascript,Selenium,Mocha.js,我正在为一个使用Mocha+SeleniumServer+wd.js+chai的网站编写自动化测试。 该网站使用JavaScript作为前端,当执行某些操作时,它似乎会刷新页面上的元素。i、 e.在网格中选择一个元素后,启用“下一步”按钮,允许用户进入下一页。这似乎会更改对button元素的引用,从而导致StaleElementReference错误 describe('1st step', function () { it('should select an e
describe('1st step', function () {
it('should select an element is grid', function () {
return browser
.waitForElementByCss('#grid', wd.asserters.isDisplayed, 20000)
.elementByCss('#grid .elementToBeSelected')
.click()
.sleep(1000)
.hasElementByCss('#grid elementToBeSelected.active')
.should.eventually.be.true;
});
it('should proceed next step', function () {
return browser
.waitForElementByCss('.btnGrid .btn.nextBtn:not(.disabled)', wd.asserters.isDisplayed, 20000)
.elementByCss('.btnGrid .btn.nextBtn:not(.disabled)')
.click()//Error thrown here
.sleep(2000)
.url()
.should.eventually.become('http://www.somewebsite.com/nextpage');
});
});
以我有限的JavaScript经验,我已经尝试了所有我能想到的,但都没有用。那么,我是否可以避免这个StaleElementReference错误?此外,只有在执行过程中才会偶尔抛出错误。您可能需要了解有关异常的更多信息。从您所描述的内容来看,听起来好像您获得了对元素的引用,在页面上执行一些操作,然后更改/删除引用的元素。当您使用变量引用执行某些操作时,会出现此错误。解决方案实际上取决于您用来进行测试的代码和访问元素的框架。通常,在访问元素之前,您需要知道何时执行更改页面和重新蚀刻元素的操作。您可以在访问某个元素之前重新蚀刻该元素,也可以重新蚀刻受页面更改影响的所有元素,等等 您的代码可能看起来像这样
WebElement e = driver.findElement(...); // get the element
// do something that changes the page which, in turn, changes e above
e.click(); // throws the StaleElementReference exception
你可能想要的是更像这样的东西
在需要之前不要获取元素
// do something that changes the page which, in turn, changes e above
WebElement e = driver.findElement(...); // get the element
e.click(); // throws the StaleElementReference exception
…或者在你需要它之前再拿一次
WebElement e = driver.findElement(...); // get the element
// do something that changes the page which, in turn, changes e above
e = driver.findElement(...); // get the element
e.click(); // throws the StaleElementReference exception
我更喜欢第一次修理。。。你需要的时候就去拿吧。这应该是解决这个问题最有效的方法。第二个解决方案可能会有性能问题,因为您可能会一次又一次地重新蚀刻一组元素,并且可能从未使用它们,或者重新蚀刻它们10次,最后只引用该元素一次