如何在C#中实现WebDriverEventListener?
如何在C#中实现如何在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的包装,但增
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);
}