[英]How to implement a WebDriverEventListener in C#?
How to implement WebDriverEventListener
in C#?如何在 C# 中实现WebDriverEventListener
?
I have no problem doing it in java importing:我在java导入中没有问题:
import org.openqa.selenium.support.events.AbstractWebDriverEventListener;
However, WebDriverEventListener
is not seen in C# and I cannot implement it.但是,在 C# 中看不到WebDriverEventListener
,我无法实现它。
Event listening in the C# is accomplished by using the standard event mechanism exposed by the language. C# 中的事件侦听是通过使用该语言公开的标准事件机制来完成的。 You create a method with the correct signature for the event, and attach it to the event.您为事件创建一个具有正确签名的方法,并将其附加到事件。 An example method would look like this:示例方法如下所示:
void MyElementClickedHandler(object sender, WebElementEventArgs e)
{
Console.WriteLine("Clicked");
}
Attaching the event would look something like this:附加事件看起来像这样:
// Assumes driver is a properly created
// IWebDriver instance.
IWebDriver eventDriver = new EventFiringWebDriver(driver);
eventDriver.ElementClicked += new EventHandler<WebElementEventArgs>(MyElementClickedHandler);
Inside the event handler method, the EventArgs
parameter allows you to examine attributes associated with the event.在事件处理程序方法中, EventArgs
参数允许您检查与事件关联的属性。 In the case of an element event, the EventArgs
will have a reference to the IWebElement
the event fired on.对于元素事件, EventArgs
将引用触发事件的IWebElement
。 To disconnect the event handler, you use the standard C# -=
operator.要断开事件处理程序,请使用标准 C# -=
运算符。
You have to add Selenium.support.dll to your project.您必须将Selenium.support.dll添加到您的项目中。
Define and instantiate, event firing driver as below:定义和实例化事件触发驱动程序如下:
IWebDriver driver = new FirefoxDriver();
EventFiringWebDriver firingDriver = new EventFiringWebDriver(driver);
firingDriver.ElementClicked += new EventHandler<WebElementEventArgs>(firingDriver_ElementClicked);
For event to fire:对于要触发的事件:
firingDriver.findElement(By.xpath("...").click();
Event is defined as:事件定义为:
private void firingDriver_ElementClicked(object sender, WebDriverExceptionEventArgs e) {
// do action required to handle what happens after clicking button you have mentioned.
}
EventFiringDriver selenium source code is here and its corresponding tests are here , for your reference. EventFiringDriver selenium 源代码在这里及其相应的测试在这里,供您参考。
This link gives a nice explanation of event handling for selenium:此链接很好地解释了 selenium 的事件处理:
The events mechanism in WebDriver is composed of two major objects: WebDriver 中的事件机制由两个主要对象组成:
EventFiringWebDriver - A wrapper of the normal WebDriver API but adds the support of event triggering. EventFiringWebDriver - 普通 WebDriver API 的包装器,但增加了对事件触发的支持。
WebDriverEventListener - An interface with pre-defined events that EventFiringWebDriver instance will trigger. WebDriverEventListener - 带有 EventFiringWebDriver 实例将触发的预定义事件的接口。
Implementation of Event handling in Selenium as Class Diagram:在 Selenium 中以类图的形式实现事件处理:
Step 1: Create a class implementing WebDriverEventListener.第 1 步:创建一个实现 WebDriverEventListener 的类。
public class DefaultWebDriverEventListener implements WebDriverEventListener {
public void beforeNavigateTo(String url, WebDriver driver) {
System.out.println("Driver will navigate to:" + url);
}
...
}
Step 2: Initalize event-firing driver using the webdriver instance you have created第 2 步:使用您创建的 webdriver 实例初始化事件触发驱动程序
//initalize FireFox webdriver instance
WebDriver driver = new FirefoxDriver();
//initalize event-firing driver using Firefox webdriver instance.
EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
Step 3: Register the listener第三步:注册监听器
//register event listener to even-firing webdriver instance
eventDriver.register(listener);
Now all the defined events in your implemented class will be executed when the selenium is executing.现在,在执行 selenium 时,您实现的类中的所有定义的事件都将被执行。 For instance, taking screenshot on exception etc.例如,对异常进行截图等。
Step 4: You can also unregister the listener if you want to stop firing events when selenium第 4 步:如果要在 selenium 时停止触发事件,也可以取消注册侦听器
eventDriver.unregister(listener);
Ensuring that webdriver intiated properly:确保 webdriver 正确启动:
class WebDriverActionListener : EventFiringWebDriver
{
private IWebDriver _driver;
public WebDriverActionListener(IWebDriver _driver): base(_driver)
{
this._driver = _driver;
_driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(60));
}
protected override void OnElementClicking(WebElementEventArgs e)
{
_driver.Sync();
string type = getTypeofElement(e.Element.TagName);
base.OnElementClicking(e);
Reporter.Logtofile("Clicked on element:" +e.Element.Text + " of type:" + type,Status.Info);
_driver.Sync();
}
}
yet another simpler solution for site navigation.另一个更简单的网站导航解决方案。
var driver = new ChromeDriver();
EventFiringWebDriver firingDriver = new EventFiringWebDriver(driver);
firingDriver.Navigating += FiringDriver_Navigating;
firingDriver.Navigated += FiringDriver_Navigated;
firingDriver.Navigate().GoToUrl(@"https://www.selenium.dev/");
private static void FiringDriver_Navigating(object sender, WebDriverNavigationEventArgs e)
{
Console.WriteLine("NAVIGATING - " + e.Url);
}
private static void FiringDriver_Navigated(object sender, WebDriverNavigationEventArgs e)
{
Console.WriteLine("SITE LOADED - " + e.Url);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.