实习生和Leadfoot有条件等到

时间:2015-05-28 15:33:02

标签: intern leadfoot

如果有一种方法可以在元素变得可见之后执行.click()。

我的功能链构建如下:

    this.remote.findByXpath("//div[@data-index='blockContainer']/button[text()='Create new']").then(function(element) {
       return element.click().end();
    })

有时我得到错误''元素不可见',是否可以在浏览器中显示元素后执行点击?我知道Leadfoot提供pollUntil做类似的事情,但我不想在浏览器端执行xpath,而不是在运行服务器端之前我想做。

为了解决我的问题,我尝试了两种方法,但没有帮助:

  1. 我尝试将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();
    
  2. 我也尝试自己定制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;
     }
    

1 个答案:

答案 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中设置查找超时每个时间。您可以在适当的地方(即在测试开始时)将其设置为一次,并且在测试期间它将保持不变。我在这里只是为你记录一个完整的例子。

希望这有帮助!