Leadfoot + sauce:使用 getAttr 映射元素集合仅在移动设备中失败

Leadfoot + sauce: mapping a collection of elements using getAttr fails in mobile only

我的用例因这个而异,但总的来说,我试图收集一堆元素,然后将 _.map() 应用于每个元素。问题在于,这一系列 .getAttribute() 调用可能会导致在本地运行的测试对 sauce/android 等远程服务器失败。

一个例子:收集页面上的所有 <div class='article'><a href='articles/{id}'>,然后获取 href。它可能看起来像这样,并且这种方法将一直有效,直到我在移动 (android) sauce 环境中进行测试。然后我超时了。

这是否可能与我的 android 环境功能有关?堆积那么多要求?我已经尝试将我的测试从使用 75 篇文章缩小到仅 45 篇,并且我已经将超时时间提高到 60 秒,但移动测试仍然失败。本地用chrome驱动就可以了,chrome桌面+酱就可以了。

不是我的实际测试,而是我正在谈论的代码的近似值:

/// ... return this.remote
.findAllByTagName('div.article a')
    .then(function (articles) {
      var promises = articles.map(function(article) {
        return article.getAttribute('href');
      });
      Promise.all(promises)
      .then(function (hrefs) {
        uniques = _.uniq(hrefs);
        assert(hrefs.length === uniques.length);
      });
    });

由于您看到超时错误,我建议继续增加测试超时,直到测试通过。与桌面环境相比,Sauce 上的移动测试环境初始化速度和操作速度都较慢,因此很可能有很多请求的测试非常慢。

加快速度的一种方法是使用 execute 块来收集引用,例如:

.then(function (articles) {
    return this.parent.execute(function (articles) {
        return articles.map(function (node) {
            return node.getAttribute('href');
        });
    }, [ articles ]);
})

在上面的代码片段中,articles 元素数组作为参数传递给执行块。远程 WebDriver 会将元素引用反序​​列化为可以在 execute 代码中操作的实际 DOM 元素。这比对每个元素使用单独的 getAttribute 请求要有效得多,因为只会向远程浏览器发出一个请求。