【问题标题】:Selenium EventFiringWebDriver Navigated eventSelenium EventFiringWebDriver 导航事件
【发布时间】:2013-02-19 19:21:53
【问题描述】:

我正在使用 Selenium Web 驱动程序,我想监听浏览器中发生的事件。例如,当页面上的某些 javascript 导致使用 window.location = "..."; 更改 url 时

我的EventFiringWebDriverNavigated 事件附加了一个侦听器。但是当浏览器的 url 改变时,这不会触发。我由此推断 Selenium 不能以这种方式监听事件?

是否有适当的方法附加到来自浏览器的浏览器或 DOM 事件?

【问题讨论】:

    标签: c# selenium selenium-webdriver


    【解决方案1】:

    我能够使用OpenQA.Selenium.Support.UI.WebDriverWait 对象来实现这一点。我只需要指定谓词(浏览器 url 的比较)和时间跨度。 Selenium 每 500 毫秒检查一次结果,直到它返回 true 或时间跨度过去,在这种情况下测试失败。不是完全由事件驱动,但它具有预期的效果:

        private readonly IWebDriver _driver = new FirefoxDriver();
    
        [Test]
        public void UrlIsCorrect()
        {
            var w = new WebDriverWait(_driver, TimeSpan.FromSeconds(30));
            w.Until(driver => driver.Url == "http://test.com");
        }
    

    【讨论】:

      【解决方案2】:

      抱歉,不,WebDriver API 不支持直接侦听 DOM 事件,即使使用 EventFiringWebDriver。您可以使用 JavaScript 将事件处理程序附加到事件,在全局页面上下文中设置 JavaScript 变量,然后您可以从 WebDriver 读取该变量,但这有点复杂。 Navigated 事件是指 WebDriver 导航方法完成的时间。

      【讨论】:

      • 感谢您对 EventFiringWebDriver 的澄清,您可能对我在此问题的替代答案中找到的解决方案感兴趣。
      • Selenium 能否以事件驱动的形式监听该全局变量的变化,还是只能定期获取其值?
      • @ALalavi 目前 Selenium 和浏览器之间没有双向通信。 WebDriver 协议不支持它,所以答案是,“不,您必须轮询更改。” WebDriver 规范的 W3C 工作组目前正在开发一个新版本的 WebDriver 协议,它双向的,因此在未来的版本中应该可以以事件驱动的方式通知更改。此外,Selenium 的第 4 版(即将推出测试版)将与 Chrome DevTools 协议集成点,这可能会提供其中的一些功能。
      • @JimEvans 感谢您纠正我的错误。我急切地等待 Selenium 的新版本。同时,我认为我可以定期(例如每 1 秒)检查附加元素的值并通过 Selenium 清除该值(稍后由 javascript 事件处理程序填充)。我唯一想到的问题是,在通过 Selenium 获取和删除值时,javascript 可能想要向该元素添加一些数据,并且由于这种冲突,我错过了一些数据。事实上,我要收听用 javascript 创建的 websocket 消息。
      猜你喜欢
      • 2016-09-20
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      相关资源
      最近更新 更多