如何解决Mocha.js + Selenium + wd.js中的StaleElementReference

时间:2015-09-04 06:06:28

标签: javascript selenium mocha

我正在使用Mocha + SeleniumServer + wd.js + chai-as-promising为网站编写自动化测试。 该网站使用JavaScript作为前端,当执行某些操作时,它似乎刷新了页面上的元素。即,在选择网格中的元素时," next"启用按钮以允许用户转到下一页。这似乎改变了对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错误吗?此外,错误有时仅在执行期间抛出。

1 个答案:

答案 0 :(得分:0)

您可能想要了解Stale Element Reference例外的更多信息。根据您的描述,听起来您获得了对元素的引用,在页面上执行某些操作,然后更改/删除引用的元素。当您使用变量引用执行某些操作时,会出现此错误。解决方案实际上取决于您用于执行测试的代码以及用于访问元素的框架。通常,您需要了解何时执行更改页面的操作并在访问之前重新获取元素。您可以在访问元素之前重新获取元素,可以重新获取受页面更改影响的所有元素,等等......

您的代码可能看起来像这样

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次以在结尾处引用该元素。