【问题标题】:Run JavaScript after every page load [duplicate]每次页面加载后运行 JavaScript [重复]
【发布时间】:2019-08-13 16:30:58
【问题描述】:

我正在使用Selenide 来测试一个网站。 我需要在每个页面上设置一些事件侦听器。 为此,我需要某种页面加载事件来告诉我 Selenium 何时加载新页面。

一个可能的(但丑陋的)解决方案是每 x 秒检查一次循环中的当前 url。


解决方案:

WebDriverRunner.addListener(new WebDriverEventListener() {
    private String urlBeforeClick;

    @Override
    public void afterNavigateTo(String s, WebDriver webDriver) {
        // code here
    }

    @Override
    public void beforeClickOn(WebElement webElement, WebDriver webDriver) {
        this.urlBeforeClick = webDriver.getCurrentUrl();
    }

    @Override
    public void afterClickOn(WebElement webElement, WebDriver webDriver) {
        // if the url is different after a click a new page was loaded.
        if (!Objects.equals(this.urlBeforeClick, webDriver.getCurrentUrl()))
            // code here
    }
});

注意:我认为这不应该被标记为重复。

【问题讨论】:

  • 不,我不想知道页面何时完成加载。我希望在加载页面时收到通知。
  • 那么您可能想要使用ready 事件而不是onload 事件。见stackoverflow.com/questions/3698200/…
  • 不,我想在 selenium 加载开始加载新页面时收到通知,而不是在特定页面完全加载时得到通知

标签: javascript java selenium webdriver selenide


【解决方案1】:

我来自 C#,所以我不知道确切的代码,但您仍然应该能够将 WebDriver 包装在 EventFiringWebDriver 中并使用 beforeNavigateTo。根据该链接,它也可以在 java 中使用。

编辑: 正如 cmets beforeNavigateTo 中所指出的,仅在直接向驱动程序发送导航命令时才会触发。而是监听 EventClicking 和 ElementClicked 事件,将当前 URL 缓存在 click 事件上,然后检查它是否在 clicked 事件上发生了变化。

【讨论】:

  • 这适用于我从 java 中进行的页面导航,但不适用于在页面上单击链接时
  • 对了,忘记触发了。我提取了一些旧代码,发现我所做的是监听 EventClicking 和 ElementClicked 事件,将当前 URL 缓存在 click 事件上,然后检查它是否在 clicked 事件上发生了变化。
【解决方案2】:

此页面讨论“卸载”事件。这对你有用吗?

Javascript event that runs before page changes

我还发现页面中的一个匿名函数会在 onLoad 事件之前运行。 https://jsfiddle.net/pawqhdjy/

function codeAddress() {
    alert('second');
}

window.onload = codeAddress;

(function () {
    alert("first");
})();

【讨论】:

  • 卸载事件对我没有帮助,因为我需要在新页面上执行 js。加载事件也对我不起作用,因为我不知道何时附加监听器
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 2017-01-20
  • 2014-11-21
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2023-03-05
  • 2015-01-13
相关资源
最近更新 更多