遍历页面上的元素并使用nightwatchjs / selenium单击它们

时间:2016-03-18 15:36:47

标签: selenium nightwatch.js

如何在页面上迭代具有特定类名的元素并单击它们?我尝试使用

browser.elements('css selector', element.articleItemTitle,function (links) {
        for (var i=0; i < links.value.length; i++) {
            browser.waitForElementVisible('body');
            browser.pause(1000);
            browser.elementIdClick(links.value[i].ELEMENT);
            browser.waitForElementVisible('.article-detail');
            browser.expect.element(element.postHeroTitle).to.be.present;
            browser.back();
        }
});

但每次迭代循环时,它并不总是点击指定的元素。

我收到错误:stale element reference: element is not attached to the page document

使用守夜人

2 个答案:

答案 0 :(得分:4)

在迭代另一个页面的元素列表(links)时,您无法更改DOM(例如,通过加载新页面)。一旦您更改页面,您就有可能使列表无效,在这种情况下,下次循环时您将收到该错误。

不要将元素视为属性集合,而是将being 'proxy' objects视为真实浏览器中的真实数据页面。他们只对当前页面有好处,并且不容小觑。

对于解决方案,在您的情况下,您在links元素中使用的唯一内容似乎是Id,这只是一个无害的字符串。因此,不是迭代匹配的元素,而是首先构建所有 Id字符串的列表,然后迭代完成。这应该是你需要的唯一改变。

<强>更新

示例代码(未经过测试,不是优雅的JavaScript,但可能有效,并演示了概念):

var ids = {};

// build the list of matching Ids on current page
browser.elements('css selector', element.articleItemTitle,function (links) {
    ids.push(links.value[i].ELEMENT);
});

// Try each one in turn - note *no references* held to existing page
for (var i = 0; i < ids.length; i++) {
    browser.waitForElementVisible('body');
    browser.pause(1000);
    browser.elementIdClick(ids[i]);
    browser.waitForElementVisible('.article-detail');
    browser.expect.element(element.postHeroTitle).to.be.present;
    browser.back();
}

答案 1 :(得分:0)

我也遇到了类似的问题并且能够解决它。我发布了示例代码here。这只是我们如何做的一个例子。请根据您的情况进行调整。