【问题标题】:iterate through elements on a page and click on them using nightwatchjs/selenium遍历页面上的元素并使用 nightwatchjs/selenium 点击它们
【发布时间】:2016-07-05 10:46:24
【问题描述】:

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

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

使用守夜人

【问题讨论】:

  • links.value.length?不应该是links.length吗?
  • 不。它应该是 links.value

标签: selenium nightwatch.js


【解决方案1】:

在从另一个页面迭代元素列表 (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();
}

【讨论】:

  • 这不起作用,因为元素的回调在 for 循环之后被调用,所以当我们调用 for 循环时,ids 数组为空
  • 你可能是对的 - 我将放弃我的代码示例,因为我没有时间让它完全可运行,但我的目的是证明你需要先收集所有 Id, 然后遍历它们。嵌套回调完全可以实现。
  • 您的代码根本无法运行,即使使用 for 循环修复也不行。一切都必须在元素函数内
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-01-05
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2015-01-16
    • 2011-11-12
    相关资源
    最近更新 更多