Selenium(C#)IEWebDriver使用ExecuteJavaScript调用jQuery返回IWebElement
我是新手,但我想尝试一下:Selenium(C#)IEWebDriver使用ExecuteJavaScript调用jQuery返回IWebElement,c#,selenium,selenium-webdriver,C#,Selenium,Selenium Webdriver,我是新手,但我想尝试一下: var clickableThing = myWebDriver.ExecuteJavaScript<IWebElement>("return $('" + Selector + "');"); clickableThing.Click(); var clickableThing=myWebDriver.ExecuteJavaScript(“return$('“+Selector+”);”; clickableThing.Click(); 我的目标是绕
var clickableThing = myWebDriver.ExecuteJavaScript<IWebElement>("return $('" + Selector + "');");
clickableThing.Click();
var clickableThing=myWebDriver.ExecuteJavaScript(“return$('“+Selector+”);”;
clickableThing.Click();
我的目标是绕过IE驱动程序的css选择器,使用另一种css选择实现
非常感谢您的帮助。我认为您需要返回DOM元素,而不是jQuery对象 如果是这样,那么添加
[0]
应该可以做到:
var clickableThing = myWebDriver.ExecuteJavaScript<IWebElement>("return $('" + Selector + "')[0];");
clickableThing.Click();
当我更新它以使用您最初文章中的JavaScript方法时,它抛出了一个异常,因为它无法将返回对象强制转换为IWebElement
public void Click(string cssSelector)
{
Log("Clicking element \"{0}\".", cssSelector.Replace("\"", "\\\""));
IWebElement webElement = (IWebElement)_driver.ExecuteScript("return $('" + cssSelector + "');");
webElement.Click();
}
但是当我添加[0]
时,它起了作用
public void Click(string cssSelector)
{
Log("Clicking element \"{0}\".", cssSelector.Replace("\"", "\\\""));
IWebElement webElement = (IWebElement)_driver.ExecuteScript("return $('" + cssSelector + "')[0];");
webElement.Click();
}
因此,虽然这不是针对完全相同的
IJavaScriptExecutor
接口实现,但我认为它至少表明[0]
调整可能会解决问题。这怎么不起作用?你犯了什么错误?(从表面上看,它应该工作得很好)我想知道你试图绕过“IE驱动程序的css选择器[sic]”的哪一部分。除了非常旧的IE旧版本外,驱动程序使用浏览器的本机CSS选择器引擎,本质上是在封面下调用document.querySelector()
。在IE版本不支持CSS选择器的情况下,它使用Sizzle CSS选择器引擎,jQuery也使用该引擎。我遇到过这样的情况,IE CSS选择器在我的几个调用中超时。Troy Gizzi帮助我开发的Sizzle/jQuery替代方案没有出现这种情况。我仍然得到脚本返回的值,但结果无法转换为所需的类型
,您可以尝试使用
而不是
运行它吗,然后检查返回值以查看它实际返回的是什么?强制转换发生在赋值之前,因此在返回值之前发生异常。不知道ExecuteJavaScript的内部类型是什么。好吧,我只是做了一些研究。我认为问题在于ExecuteJavaScript
扩展方法。我实现了在的底部找到的内容,并修改了代码以使用它。它失败,因为result.GetType().IsAssignableFrom(typeof(T))
返回false。但实际上我可以将结果
转换为IWebElement
。所以,底线是,直接使用ExecuteScript()
。这是可行的,但并不完美。来自selenium独立服务器的日志现在报告其“显示”调用的“未知定位器”。这不是一个问题,因为解决方案是可行的,但它确实表明演员阵容比我最初想象的要复杂一些。
public void Click(string cssSelector)
{
Log("Clicking element \"{0}\".", cssSelector.Replace("\"", "\\\""));
IWebElement webElement = (IWebElement)_driver.ExecuteScript("return $('" + cssSelector + "')[0];");
webElement.Click();
}