IJavaScriptExecutor返回null

时间:2013-12-11 13:14:02

标签: c# jquery selenium

我试图在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;
}

但返回值errornull

2 个答案:

答案 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)

您有多个问题。

  1. 您似乎认为需要使用jQuery。这是不正确的,当jQuery或者更确切地说,JavaScript在Selenium中找到一个元素时,我看到很少(可以单手使用我的手指)。

  2. 您当前的方法是将ExecuteScript的结果转换为IWebElement。这是不正确的,因为您要返回string.html()返回string

  3. 无论如何,您似乎都在使用jQuery,.html()只需要调用.innerHTML一些东西来满足旧浏览器的需求。 无论如何,你可以在Selenium中做到这一点!

  4.   

    此方法使用浏览器的innerHTML属性。某些浏览器可能不会返回完全复制原始文档中HTML源的HTML。例如,如果属性值仅包含字母数字字符,则Internet Explorer有时会忽略引号。

    1. Selenium的JavaScript执行器需要一点点推动,并给它一个提示,你传递给它的JavaScript将返回。< / p>

    2. 由于您必然会使用jQuery,因此您的解决方案将在没有加载jQuery的页面上中断。

    3. 所以,我要做的是以下内容:

      1. 由于您的方法没有任何用处(您已经限制自己被JS返回IWebElement),所以我只是直接调用它:

        string error = ((IJavaScriptExecutor)driver).ExecuteScript("return $('li').html()").ToString();

      2. 由于绝对不需要 jQuery来查找您的元素,为什么不使用Selenium 首先找到它们?您似乎正在反对提供给您的API。有多种方法可以找到元素。

        driver.FindElements(By.TagName("li"));

      3. 要在此处完全删除jQuery依赖项,要复制 html()属性的功能,只需调用GetAttribute并查找innerHTML

        element.GetAttribute("innerHTML");

      4. 此外,为什么需要这个innerHTML / .html() ?为什么.Text没有返回您的期望?

      5. 最后,使用LINQ:

        完全放弃

        IEnumerable<string> html = driver.FindElements(By.TagName("li")).Select(i => i.GetAttribute("innerHTML"));

      6. 这是您使用jQuery尝试做的完全复制,但没有jQuery。