我试图在jquery中获取元素,但我得到返回对象的null
值。
代码如下所示:
public IWebElement Executescript(IWebDriver driver, String script)
{
return (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript(script);
}
public IWebElement getuserpasserror()
{
IWebElement error = op.Executescript(this.driver, "$('li').html()");
return error;
}
但返回值error
为null
。
答案 0 :(得分:0)
在Selenium中,您不需要使用jQuery来查找元素。您可以使用内置的Selenium函数。
var text = driver.FindElement(By.TagName("li")).Text;
如果你必须jQuery问题可能是你没有在脚本中返回任何内容。它应该是这样的:
var error = op.Executescript(this.driver, "return $('li').html();");
答案 1 :(得分:0)
您有多个问题。
您似乎认为需要使用jQuery。这是不正确的,当jQuery或者更确切地说,JavaScript在Selenium中找到一个元素时,我看到很少(可以单手使用我的手指)。
您当前的方法是将ExecuteScript
的结果转换为IWebElement
。这是不正确的,因为您要返回string
(.html()
返回string
)
无论如何,您似乎都在使用jQuery,.html()只需要调用.innerHTML
一些东西来满足旧浏览器的需求。 无论如何,你可以在Selenium中做到这一点!:
此方法使用浏览器的innerHTML属性。某些浏览器可能不会返回完全复制原始文档中HTML源的HTML。例如,如果属性值仅包含字母数字字符,则Internet Explorer有时会忽略引号。
Selenium的JavaScript执行器需要一点点推动,并给它一个提示,你传递给它的JavaScript将返回。< / p>
由于您必然会使用jQuery,因此您的解决方案将在没有加载jQuery的页面上中断。
所以,我要做的是以下内容:
由于您的方法没有任何用处(您已经限制自己被JS返回IWebElement
),所以我只是直接调用它:
string error = ((IJavaScriptExecutor)driver).ExecuteScript("return $('li').html()").ToString();
由于绝对不需要 jQuery来查找您的元素,为什么不使用Selenium 首先找到它们?您似乎正在反对提供给您的API。有多种方法可以找到元素。
driver.FindElements(By.TagName("li"));
要在此处完全删除jQuery依赖项,要复制 html()
属性的功能,只需调用GetAttribute
并查找innerHTML
:
element.GetAttribute("innerHTML");
此外,为什么需要这个innerHTML
/ .html()
?为什么.Text
没有返回您的期望?
最后,使用LINQ:
完全放弃 IEnumerable<string> html = driver.FindElements(By.TagName("li")).Select(i => i.GetAttribute("innerHTML"));
这是您使用jQuery尝试做的完全复制,但没有jQuery。