selenium中的waitForElementVisible无法在MicrosoftEdge中运行

时间:2016-09-30 18:29:33

标签: javascript selenium microsoft-edge nightwatch.js

我在使用MicrosoftEdge运行selenium测试时等待元素可见的功能出现问题。特别是当元素位于另一个元素之上时。有谁知道如何解决这个问题?是否有一个javascript函数,我可以用来确保用户看到该元素并可以点击它?

这是我现在使用的

   function waitForElementDisplay (selector, time) {
            if (document.querySelector(selector) != null) {
                return true;
            }
            else if (timeLimit < timeSince) {
                return false;
            }
            else {
                timeSince += time;
                setTimeout(function () {
                    waitForElementDisplay(selector, time, timeLimit, timeSince);
                }, time);
            }
        }

2 个答案:

答案 0 :(得分:0)

是的,有时候硒确实有问题。从未使用Edge,但与其他浏览器有类似的问题。

我通常做的是编写重试包装然后使用 脚本执行器中的“document.getElementById”(或其他东西),以在脚本执行器中获取元素引用。我尝试了几次X秒延迟。

以下java中的示例显示了我如何在DOM中等待某些元素可访问。 (我正在使用cucumberJVM)

@When("^questionnaire response is loaded$")
public void questionnaire_response_is_loaded() throws Throwable {

    Predicate<WebDriver> isLoaded = new Predicate<WebDriver>() {
        @Override
        public boolean apply(WebDriver webDriver) {
            Object obj = ((JavascriptExecutor) webDriver).executeScript(
                    "return (!document.getElementById('idNotification'))"
            );
            // if element is present the result will turn false, so we have to negate it
            return !((Boolean) obj);
        }
    };

    WebDriverWait wait = new WebDriverWait(BrowserDriver.getCurrentDriver(), 10);
    wait.until(isLoaded);
}

答案 1 :(得分:0)

方法waitForElementVisible仅检查元素是否以大于0的大小和不透明度进行渲染。它不会检查元素是否可被人眼看到。

您可以使用此JavaScript函数检查元素是否可见且可点击:

function isClickable(element) {
  var doc = element.ownerDocument || document,
    win = doc.defaultView || window,
    rect = element.getBoundingClientRect(),
    elemAt = doc.elementFromPoint(rect.left + (rect.width >> 1), rect.top + (rect.height >> 1));

  for (var e = elemAt; e; e = e.parentElement) {
    if (e === element) return !elemAt.disabled && win.getComputedStyle(elemAt, null).getPropertyValue('pointer-events') !== 'none';
  }
  return false;
}

请注意,如果元素未滚动到视图中,它将返回false。因此,您可能需要先致电element.scrollIntoView()