我正在使用Selenium 2,C#,SpecFlow,Page Objects和Page Factory创建一个BDD框架来初始化页面对象。
为了报告目的和异常处理,我使用EventFiringWebDriver
类重写了Selenium基本操作的事件监听器,并在重写方法中添加了报告调用。
public class WebDriverActionListener : EventFiringWebDriver
{
protected override void OnElementClicked(WebElementEventArgs e)
{
base.OnElementClicked(e);
const string expectedDescription = "Click on the element";
var actualDescription = String.Format("Successfully clicked on the element '{0}'", ScenarioContext.Current["element"]);
Reporter.ReportEvent(expectedDescription, actualDescription, Status.Pass); // Logging the low level reporting
_driver.Sync();
}
}
现在我正在为WebDriverActionListener
类创建对象,如下所示:
return new WebDriverActionListener(new FirefoxDriver());
我正在使用上面初始化的相同驱动程序初始化页面对象。
[FindsBy(How = How.Id, Using = "Login1_UserName")]
private IWebElement _userName;
public LoginPage(IWebDriver driver)
{
_driver = driver;
PageFactory.InitElements(_driver, this);
if (!(_userName.Displayed && _loginButton.Displayed))
throw new InvalidPageObjectException("Login page is not displayed", Status.Fail);
}
public void SomeMethod()
{
_userName.JsClick(); // Java Script click call method
}
我创建了一个使用javascript(非常遗留的应用程序)单击某些页面对象的方法。当我尝试将页面对象元素传递给ExecuteScript()
方法时,我遇到异常。根据提供的帮助,它应该接受`IWebElement'作为参数。
public static void JsClick(this IWebElement element)
{
((IJavaScriptExecutor)_driver).ExecuteScript("arguments[0].click();", element);
}
但是我无法在'ExecuteScript()`方法中使用页面对象。
答案 0 :(得分:2)
好吧,我没有合适的解决方案,但我有一个解决方法。
要使用Java脚本单击的元素,使用WebDriver的FindElement()
方法查找它们,而不是创建页面对象(仅使用Java脚本单击要素)
_driver.FindElement(By.Id("Login1_UserName")).JsClick();
这种方法应该没有任何例外。
答案 1 :(得分:1)
读得太快了。如果我没有误会(没有测试),扩展方法必须是静态。 Reference