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