如果有一种方法可以在元素变得可见之后执行.click()。
我的功能链构建如下:
this.remote.findByXpath("//div[@data-index='blockContainer']/button[text()='Create new']").then(function(element) {
return element.click().end();
})
有时我得到错误''元素不可见',是否可以在浏览器中显示元素后执行点击?我知道Leadfoot提供pollUntil做类似的事情,但我不想在浏览器端执行xpath,而不是在运行服务器端之前我想做。
为了解决我的问题,我尝试了两种方法,但没有帮助:
我尝试将Leadfoot元素传递给浏览器端脚本并检查它是否可见。但似乎浏览器端代码无法识别leadfoot / element对象。
command.find(...).then(function(element) {
return command.then(pollUntil(
function(element) {
if (element.style.display == 'none') return null;
return true;
}, [element], 60000, 500)).then(function(el){
});
}).click().end();
我也尝试自己定制pollUntil但不能正常工作
function pollVisible(element, timeout) {
var dfd = new Deferred();
var endTime = Number(new Date()) + timeout;
(function poll() {
element.isDisplayed().then(function (displayed) {
if (displayed) {
dfd.resolve();
}
else if (Number(new Date()) < endTime) {
setTimeout(poll, 500);
}
else {
var error = new Error('timed out; final url is ' + url);
dfd.reject(error);
}
});
})();
return dfd.promise;
}
答案 0 :(得分:0)
你现在可能已经得到了答案,但这是我的解决方案,以防你仍然不确定或是否有其他人遇到过这个问题。
我不确定为什么要轮询,直到这里可以看到一个元素。我要做的是设置你的leadfoot / Session的查找超时如下:
this.remote.setFindTimeout(60000)
然后,当您调用this.remote.findByXPath
方法时,它会自动搜索您的元素最多1分钟(在上面的示例中)。如果它在该时间内找到该元素,则它将继续执行代码中的下一步。如果在该时间内没有找到该元素,则测试用例将超时。
然后,您可以将代码简化为(例如):
this.remote
.setFindTimeout(60000)
.findByXpath("//div[@data-index='blockContainer']/button[text()='Create new']")
.click()
.end();
当然,您无需在UI中设置查找超时每个时间。您可以在适当的地方(即在测试开始时)将其设置为一次,并且在测试期间它将保持不变。我在这里只是为你记录一个完整的例子。
希望这有帮助!