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