Selenium:如何跟踪DOM操作以查找元素的可见性?

时间:2017-09-21 07:58:18

标签: javascript java html selenium dom

是否有可能为以下事件观看网页:元素已被显示?

这可能是使用硒吗?

例如,如果我定义了从startTime到endTime观看网页的时间线。从startTime到endTime,可以捕获不同的网页事件,其中包括dom操作(例如:已添加html元素并使其可见)。一旦达到endTime,我将迭代事件列表,我可以验证特定事件是否已经发生。

就我而言,我想知道一个html元素是否可见。

通常的方法是使用webdriver的API检查元素的可见性,但有一些超时。

但是,我想捕获不同的事件并进行一些回调,从而验证发生了一些预期的事件。

[更新]:我们是否支持Selenium中的MutationObserver

3 个答案:

答案 0 :(得分:2)

是的,您使用显式等待,如WebDriver Documentation

所示

ExpectedConditions类提供了许多有用的元素状态,例如ElementToBeVisibleElementToBeClickable等。

这应该可以解决问题。

答案 1 :(得分:2)

以下是您可以做的样本:

WebDriverWait wait = new WebDriverWait(driver, 10); // how many seconds
wait.until(ExpectedConditions.elementToBeClickable(myPage.getButton()));

对于更复杂的事情,您可以为Function提供自己的WebDriverWait,即:

wait.until(o -> {
    return driver.getWindowHandles().stream().collect(Collectors.toList()).get(tabNo);
});

答案 2 :(得分:0)

Selenium不支持事件,因此您可能应该转移到puppetter之类的其他工具,它似乎支持事件。也就是说,通过将所有事件存储在页面中的变量中,仍然可以通过脚本注入来记录事件:

jse.executeScript(
  "var window.__events = [];" +
  "new MutationObserver(function(mutations) {" +
  "    mutations.forEach(function(mutation) {" +
  "        window.__events.push(mutation);" +
  "    });" +
  "})).takeRecords();");

然后只需返回列表:

Object events = jse.executeScript("return window.__events;");