How to implement WebDriverEventListener
in C#?
I have no problem doing it in java importing:
import org.openqa.selenium.support.events.A
Ensuring that webdriver intiated properly:
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();
}
}
Event listening in the C# is accomplished by using the standard event mechanism exposed by the language. 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. In the case of an element event, the EventArgs
will have a reference to the IWebElement
the event fired on. To disconnect the event handler, you use the standard C# -=
operator.
You have to add Selenium.support.dll to your project.
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.
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);
}
This link gives a nice explanation of event handling for selenium:
The events mechanism in WebDriver is composed of two major objects:
EventFiringWebDriver - A wrapper of the normal WebDriver API but adds the support of event triggering.
WebDriverEventListener - An interface with pre-defined events that EventFiringWebDriver instance will trigger.
Implementation of Event handling in Selenium as Class Diagram:
Step 1: Create a class implementing 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
//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. For instance, taking screenshot on exception etc.
Step 4: You can also unregister the listener if you want to stop firing events when selenium
eventDriver.unregister(listener);