0

我的用例对此有所不同,但总的来说,我试图收集一堆元素,然后应用于_.map()每个元素。问题是这一系列.getAttribute()调用可能会导致在本地工作的测试对远程服务器(如 sauce/android)失败。

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

这可能是与我的 android 环境功能有关的问题吗?堆积这么多请求?我尝试将我的测试从使用 75 篇文章缩减到仅 45 篇,并将超时时间提高到 60 秒,但移动测试仍然失败。本地用chromedriver就可以了,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);
      });
    });
4

1 回答 1

1

由于您看到超时错误,我建议继续增加测试超时,直到测试通过。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,因为只会向远程浏览器发出一个请求。

于 2016-04-16T14:20:30.313 回答