Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解决Mocha.js+Selenium+wd.js中的StaleElementReference_Javascript_Selenium_Mocha.js - Fatal编程技术网

Javascript 如何解决Mocha.js+Selenium+wd.js中的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

我正在为一个使用Mocha+SeleniumServer+wd.js+chai的网站编写自动化测试。 该网站使用JavaScript作为前端,当执行某些操作时,它似乎会刷新页面上的元素。i、 e.在网格中选择一个元素后,启用“下一步”按钮,允许用户进入下一页。这似乎会更改对button元素的引用,从而导致StaleElementReference错误

        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次,最后只引用该元素一次