【问题标题】:How to implement a WebDriverEventListener in C#?如何在 C# 中实现 WebDriverEventListener?
【发布时间】:2016-04-13 04:59:30
【问题描述】:

如何在C#中实现WebDriverEventListener

我在java导入中没有问题:

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

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

【问题讨论】:

  • 你到底想在这里实现什么..你能澄清你的问题吗?
  • 我有在页面上添加一些元素的按钮。单击此按钮后,将向服务器发送请求,并发送此元素的响应 ID。每个点击元素都有不同的 id。如果单击操作后此 ID 的元素出现在页面上,我需要获取此 ID 以检查 selenium。

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


【解决方案1】:

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

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

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

Selenium 中的事件处理实现类图:

第 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 执行时,您实现的类中定义的所有事件都将被执行。例如,对异常进行截图等。

第四步:如果你想在 selenium 时停止触发事件,你也可以取消注册监听器

eventDriver.unregister(listener);

【讨论】:

  • 非常感谢。这是一个很好的解释,但是你知道如何在 C# 中实现它吗?
  • 投反对票,因为答案与原始问题无关。 .NET 事件机制 Java 机制不同,并且解释虽然对 Java 是正确的,但并没有以任何方式解决 .NET 的问题。
  • @JimEvans,感到很高兴,硒贡献者阅读了我的回答。我将发布一个 C# 相关的答案。
【解决方案2】:

您必须将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,供大家参考。

【讨论】:

    【解决方案3】:

    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# -= 运算符。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        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);
        }
        

        【讨论】:

          猜你喜欢
          • 2021-08-18
          • 2010-09-28
          • 2014-10-29
          • 2018-02-14
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多