C# EventFiringWebDriver不通知事件

C# EventFiringWebDriver不通知事件,c#,selenium,C#,Selenium,操作系统:Windows 10 Selenium版本:2.53.0 浏览器:Chrome 浏览器版本:50.0.2661.102m 预期行为-应该得到下面代码示例的回调 实际行为-单击导航的链接元素时,不会调用任何事件处理程序 复制步骤-在Visual Studio中创建selenium项目,导航到您最喜欢的站点,在从GoTour方法调用返回webdriver后调用此代码 从下面开始,打开一个新的WD实例并导航到返回Webdriver的url。我们看到新的url在Chrome中打开。接下来我们调

操作系统:Windows 10 Selenium版本:2.53.0 浏览器:Chrome 浏览器版本:50.0.2661.102m

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

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

复制步骤-在Visual Studio中创建selenium项目,导航到您最喜欢的站点,在从GoTour方法调用返回webdriver后调用此代码

从下面开始,打开一个新的WD实例并导航到返回Webdriver的url。我们看到新的url在Chrome中打开。接下来我们调用HookEventFiringWebDriver。。。而且从来没有被通知过

    var wd = StartWebDriver(url);
    wd.HookEventFiringWebDriver(changedURL => {});
这是一个用于钩住事件的helper类,我尝试了不同的钩住方法,但没有成功

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();
    };
} -->
公共静态void HookEventFiringWebDriver(此IWebDriver wd,操作导航到turl){
var ed=新的EventFiringWebDriver(wd);
ed.ElementClicked+=新事件处理程序((o,e)=>{
Debugger.Break();
});
导航+=(驱动程序,ea)=>
{
Debugger.Break();
如果(navigatedtour!=null)navigatedtour(ea.Url);
};
ed.element单击+=(驱动程序,ea)=>
{
Debugger.Break();
如果(navigatedtour!=null)navigatedtour(ea.Element.Text);
};
ed.导航+=(驾驶员,ea)=>{
Debugger.Break();
如果(navigatedtour!=null)navigatedtour(ea.Url);
} ;
ed.ExceptionThrown+=(驱动程序,ea)=>
{
Debugger.Break();
};
} -->

EventFiringWebDriver
类是一个扩展类,用于拦截对
WebDriver
实例的调用。因此,要通知事件,需要从
EventFiringWebDriver
实例调用方法

以下是一个例子:

var driver = new EventFiringWebDriver(new FirefoxDriver());

driver.Navigated += new EventHandler<WebDriverNavigationEventArgs>((obj, ea)=>{
    Debugger.Break();
});

driver.Navigate().GoToUrl("http://stackoverflow.com/");
var driver=neweventfiringwebdriver(newfirefoxdriver());
driver.Navigated+=新事件处理程序((obj,ea)=>{
Debugger.Break();
});
driver.Navigate().gotour(“http://stackoverflow.com/");

为希望以功能性方式连接 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;
    }

另一个注意事项是:EventFiringWebDriver(在C#中)还包含对EventFiringWebElement(EFWE)的私有引用。如果您将它作为IWebElement传递到另一个方法中,它将简单地隐藏获取包装驱动程序的功能。下面是如何揭露它

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;
    }

我上面的例子和你的例子完全一样。然而,你使用的是Firefox,我使用的是Chrome。我想知道您的示例之所以有效是因为FireFoxDriver?它与Chrome的工作方式完全相同。请注意,您的示例不包括对浏览器的调用(
.gotour
。单击
,…)。您可能正在调用
WebDriver
实例上的方法,而不是
EventFiringWebDriver
实例上的方法。您可以使用
driver.GetType().FullName
检查它。好的,这就是问题所在,我正在导航原始web驱动程序,而不是事件驱动程序。让我试一试。
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;
    }