如何在C#中实现WebDriverEventListener?

如何在C#中实现WebDriverEventListener?,c#,selenium,testing,selenium-webdriver,automated-tests,C#,Selenium,Testing,Selenium Webdriver,Automated Tests,如何在C#中实现WebDriverEventListener 我在java导入中没有问题: import org.openqa.selenium.support.events.AbstractWebDriverEventListener; 但是,WebDriverEventListener在C中看不到,我无法实现它。这很好地解释了selenium的事件处理: WebDriver中的事件机制由两个主要对象组成: EventFiringWebDriver-普通WebDriver API的包装,但增

如何在C#中实现
WebDriverEventListener

我在java导入中没有问题:

import org.openqa.selenium.support.events.AbstractWebDriverEventListener;
但是,
WebDriverEventListener
在C中看不到,我无法实现它。

这很好地解释了selenium的事件处理:

WebDriver中的事件机制由两个主要对象组成:

EventFiringWebDriver-普通WebDriver API的包装,但增加了对事件触发的支持。
WebDriverEventListener-带有预定义事件的接口,EventFiringWebDriver实例将触发这些事件

在Selenium as类图中实现事件处理:

步骤1:创建一个实现WebDriverEventListener的类

public class DefaultWebDriverEventListener implements WebDriverEventListener {

    public void beforeNavigateTo(String url, WebDriver driver) {
        System.out.println("Driver will navigate to:" + url);
    }

   ...
}
步骤2:使用您创建的webdriver实例初始化事件触发驱动程序

//initalize FireFox webdriver instance
WebDriver driver = new FirefoxDriver();
//initalize event-firing driver using Firefox webdriver instance.
EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver); 
步骤3:注册侦听器

//register event listener to even-firing webdriver instance
eventDriver.register(listener);
现在,在执行selenium时,将执行已实现类中所有已定义的事件。例如,拍摄异常的屏幕截图等

第4步:如果希望在启动时停止触发事件,也可以注销侦听器

eventDriver.unregister(listener);
您必须添加到您的项目中

定义并实例化事件触发驱动程序,如下所示:

IWebDriver driver = new FirefoxDriver();

EventFiringWebDriver firingDriver = new EventFiringWebDriver(driver);
firingDriver.ElementClicked += new EventHandler<WebElementEventArgs>(firingDriver_ElementClicked);
事件定义为:

private void firingDriver_ElementClicked(object sender, WebDriverExceptionEventArgs e) {
    // do action required to handle what happens after clicking button you have mentioned.
}
EventFiringDriver selenium源代码及其相应的测试供您参考。

C#中的事件侦听是通过使用该语言公开的标准事件机制完成的。为事件创建具有正确签名的方法,并将其附加到事件。示例方法如下所示:

void MyElementClickedHandler(object sender, WebElementEventArgs e)
{
    Console.WriteLine("Clicked");
}
// Assumes driver is a properly created
// IWebDriver instance. 
IWebDriver eventDriver = new EventFiringWebDriver(driver);
eventDriver.ElementClicked += new EventHandler<WebElementEventArgs>(MyElementClickedHandler);
附加事件的外观如下所示:

void MyElementClickedHandler(object sender, WebElementEventArgs e)
{
    Console.WriteLine("Clicked");
}
// Assumes driver is a properly created
// IWebDriver instance. 
IWebDriver eventDriver = new EventFiringWebDriver(driver);
eventDriver.ElementClicked += new EventHandler<WebElementEventArgs>(MyElementClickedHandler);
//假设驱动程序是正确创建的
//IWebDriver实例。
IWebDriver eventDriver=新的EventFiringWebDriver(驱动程序);
eventDriver.ElementClicked+=新的EventHandler(MyElementClickedHandler);

在事件处理程序方法中,
EventArgs
参数允许您检查与事件关联的属性。在元素事件的情况下,
EventArgs
将引用触发事件的
IWebElement
。要断开事件处理程序的连接,请使用标准的C#
-=
运算符。

确保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();
        }
}

还有一个更简单的站点导航解决方案

  • 创建并注册事件触发驱动程序
  • 宣布事件

  • 你到底想在这里实现什么。。你们能澄清你们的问题吗?我有一个按钮,可以在页面上添加一些元素。单击此按钮后,将向服务器发送请求,并发送此元素的响应id。每个点击元素都有不同的id。如果点击操作后页面上出现了此id的元素,我需要获取此id以签入selenium。非常感谢。这是一个很好的解释,但是你知道如何在C#中实现它吗?因为答案与原始问题无关。.NET事件机制与Java机制不同,虽然该解释对Java来说是正确的,但并没有以任何方式解决.NET的问题。@JimEvans很高兴看到我的答案。我将发布一个与C#相关的答案。
     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);
    }