【问题标题】:EventFiringWebDriver does not notify of eventsEventFiringWebDriver 不通知事件
【发布时间】:2016-09-20 23:37:13
【问题描述】:

操作系统:Windows 10 硒版本:2.53.0 浏览器:铬 浏览器版本:50.0.2661.102m

预期行为 - 应该在下面的代码示例中得到回调

实际行为 - 单击导航的链接元素时,不会调用任何事件处理程序。

重现步骤 - 在 Visual Studio 中创建一个 selenium 项目,导航到您喜欢的站点,在从 gotoURL 方法调用返回 webdriver 后调用此代码。

StartWebDriver 下面打开一个新的 WD 实例并导航到返回 Webdriver 的 url。我们看到在 Chrome 中打开了新的 url。接下来我们调用 HookEventFiringWebDriver... 并且永远不会收到通知。

    var wd = StartWebDriver(url);
    wd.HookEventFiringWebDriver(changedURL => {});

这是挂钩事件的辅助类,我尝试了不同的挂钩方法,但都不起作用。

public static void HookEventFiringWebDriver(this IWebDriver wd, Action<string> NavigatedToURL) {
    var ed = new EventFiringWebDriver(wd);
    ed.ElementClicked += new EventHandler<WebElementEventArgs>((o, e) => {
        Debugger.Break();
    });
    ed.Navigated += (driver, ea) =>
    {
        Debugger.Break();
        if (NavigatedToURL != null) NavigatedToURL(ea.Url);
    };
    ed.ElementClicked += (driver, ea) =>
    {
        Debugger.Break();
        if(NavigatedToURL !=null) NavigatedToURL(ea.Element.Text);
    };
    ed.Navigating += (driver, ea)=>{
        Debugger.Break();
        if (NavigatedToURL != null) NavigatedToURL(ea.Url);
    } ;
    ed.ExceptionThrown += (driver, ea) =>
    {
        Debugger.Break();
    };
} -->

【问题讨论】:

    标签: c# selenium


    【解决方案1】:

    EventFiringWebDriver 类是一个扩展类,旨在拦截对WebDriverinstance 的调用。因此,要通知事件,您需要调用 EventFiringWebDriver 实例中的方法。

    这是一个例子:

    var driver = new EventFiringWebDriver(new FirefoxDriver());
    
    driver.Navigated += new EventHandler<WebDriverNavigationEventArgs>((obj, ea)=>{
        Debugger.Break();
    });
    
    driver.Navigate().GoToUrl("http://stackoverflow.com/");
    

    【讨论】:

    • 我上面的例子在你的例子中做了完全相同的事情。但是,您使用的是 Firefox,我使用的是 Chrome。我想知道您的示例有效的原因是否是由于 FireFoxDriver?
    • 它与 Chrome 的工作方式完全相同。请注意,您的示例不包括对浏览器的调用(.GoToUrl.Click,...)。您可能正在调用 WebDriver 实例而不是 EventFiringWebDriver 实例上的方法。您可以通过driver.GetType().FullName查看。
    • 好的,这就是我正在导航原始 Web 驱动程序而不是事件驱动程序的问题。让我试一试。
    【解决方案2】:

    为了任何想要一种功能性的方式来连接 EventFiringWebDriver 使用带有可选回调的 C#...

        /// <summary>
        /// Allows for events to be posted back to the user from the browser
        /// </summary>
        /// <param name="wd">The WebDriver to hook into</param>
        /// <param name="Error">Any Exceptions if thrown</param>
        /// <param name="Navigating">On Navigation start</param>
        /// <param name="NavigatedToURL">On Navigation complete</param>
        /// <param name="Clicked">On web element clicked</param>
        /// <param name="HookedDriver">The Hooked driver</param>
        /// <returns>The Hooked driver</returns>
        public static IWebDriver HookEventFiringWebDriver(this IWebDriver wd,
            Action<WebDriverExceptionEventArgs> Error = null,
            Action<WebDriverNavigationEventArgs> Navigating = null,
            Action<WebDriverNavigationEventArgs> NavigatedToURL = null,
            Action<WebElementEventArgs> Clicked = null,
            Action<IWebDriver> HookedDriver = null)
        {
            var ed = new EventFiringWebDriver(wd);
            ed.ElementClicked += new EventHandler<WebElementEventArgs>((o, ea) =>
            {
                if (Clicked != null) Clicked(ea);
            });
            ed.Navigated += (driver, ea) =>
            {
                if (NavigatedToURL != null) NavigatedToURL(ea);
            };
    
            ed.Navigating += (driver, ea) =>
            {
                if (NavigatedToURL != null) NavigatedToURL(ea);
            };
            ed.ExceptionThrown += (driver, ea) =>
            {
                if (Error != null) Error(ea);
            };
            if (HookedDriver != null) HookedDriver(ed);
            return ed;
        }
    

    这里是如何使用它。

            CurrentWebDriver.HookEventFiringWebDriver(
                error => { 
                    //process errors here 
                },
                navigating => {
                   //browser is navigating
                },
                navigated => { 
                  //browser has navigated 
                },
                clicked => { 
    
                 //element was clicked
                }, 
                wd => {
                    wd.Navigate().GoToUrl(url);
                });
    

    【讨论】:

      【解决方案3】:

      另一个注意事项:EventFiringWebDriver 还(在 C# 中)包含对 EventFiringWebElement (EFWE) 的私有引用。如果将它作为 IWebElement 传递给另一个方法,它只会隐藏获取 Wrapped 驱动程序的能力。以下是如何公开它....

      public static IWebElement ScrollIntoView(this IWebElement ele){
              var rele = ((IWrapsElement)ele).WrappedElement as RemoteWebElement;
              var wd = rele.WrappedDriver;
              var action = new Actions(wd);
              action.MoveToElement(ele);
              action.Perform();
              return ele;
          }
      

      【讨论】:

        猜你喜欢
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 2017-12-16
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多