Selenium IJavaScriptExecutor`executeScript()`方法在将页面对象作为参数传递时抛出异常

时间:2015-04-09 14:38:30

标签: c# selenium selenium-webdriver

我正在使用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()`方法中使用页面对象。

2 个答案:

答案 0 :(得分:2)

好吧,我没有合适的解决方案,但我有一个解决方法。

要使用Java脚本单击的元素,使用WebDriver的FindElement()方法查找它们,而不是创建页面对象(仅使用Java脚本单击要素)

_driver.FindElement(By.Id("Login1_UserName")).JsClick();

这种方法应该没有任何例外。

答案 1 :(得分:1)

读得太快了。如果我没有误会(没有测试),扩展方法必须是静态Reference