简体   繁体   English

如何在 C# 中实现 WebDriverEventListener?

[英]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.另一个更简单的网站导航解决方案。

  1. Create & Register EventFiring driver创建和注册 EventFiring 驱动程序
var driver = new ChromeDriver();
EventFiringWebDriver firingDriver = new EventFiringWebDriver(driver);
firingDriver.Navigating += FiringDriver_Navigating;
firingDriver.Navigated += FiringDriver_Navigated;
firingDriver.Navigate().GoToUrl(@"https://www.selenium.dev/");
  1. Declare the Event声明事件
 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM