如何在C#中实现WebDriverEventListener?

时间:2016-01-08 13:29:22

标签: c# selenium testing selenium-webdriver automated-tests

如何在C#中实现WebDriverEventListener

在java导入中我没有问题:

import org.openqa.selenium.support.events.AbstractWebDriverEventListener;

但是,在C#中没有看到WebDriverEventListener,我无法实现它。

5 个答案:

答案 0 :(得分:6)

通过使用该语言公开的标准事件机制来完成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);

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

答案 1 :(得分:3)

您必须在项目中添加Selenium.support.dll

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

IWebDriver driver = new FirefoxDriver();

EventFiringWebDriver firingDriver = new EventFiringWebDriver(driver);
firingDriver.ElementClicked += new EventHandler<WebElementEventArgs>(firingDriver_ElementClicked);

要发生的事件:

firingDriver.findElement(By.xpath("...").click();

事件定义为:

private void firingDriver_ElementClicked(object sender, WebDriverExceptionEventArgs e) {
    // do action required to handle what happens after clicking button you have mentioned.
}

EventFiringDriver selenium源代码为here,其相应的测试为here,供您参考。

答案 2 :(得分:0)

这个link给出了关于selenium事件处理的一个很好的解释:

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

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

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

enter image description here

第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步:如果您想在selenium时停止触发事件,也可以取消注册侦听器

eventDriver.unregister(listener);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

还有另一个更简单的网站导航解决方案。

  1. 创建并注册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. 声明事件
 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);
}