2

如果有办法在元素变得可见后执行 .click() 。

我的函数链是这样构建的:

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

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

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

  1. 我试图将 Leadfoot 元素传递给浏览器端脚本并检查它是否可见。但似乎浏览器端代码无法识别前导脚/元素对象。

    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;
     }
    
4

1 回答 1

0

到目前为止,您可能已经对此有了答案,但这是我的解决方案,以防万一您仍然不确定或其他人遇到此问题。

我不确定你为什么要轮询,直到一个元素在这里可见。我要做的是将您的前导脚/会话的查找超时设置如下:

this.remote.setFindTimeout(60000)

然后,当您调用该this.remote.findByXPath方法时,它会自动搜索您的元素最多 1 分钟(在我上面的示例中)。如果它在该时间内找到该元素,它将继续执行代码中的下一步。如果在这段时间内没有找到该元素,则测试用例将超时。

然后,您可以将代码简化为(例如):

this.remote
  .setFindTimeout(60000)
  .findByXpath("//div[@data-index='blockContainer']/button[text()='Create new']")
  .click()
  .end();

当然,每次您希望在 UI 中查找元素时,都无需设置查找超时。您可以在更合适的地方设置一次(即在测试开始时),它将在测试期间保持不变。我在这里这样做只是为了为您记录一个完整的示例。

希望这可以帮助!

于 2017-11-21T08:31:11.803 回答