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
请求要有效得多,因为只会向远程浏览器发出一个请求。
我的用例因这个而异,但总的来说,我试图收集一堆元素,然后将 _.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
请求要有效得多,因为只会向远程浏览器发出一个请求。