通过WebDriver在C#中执行Javascript文件

时间:2016-03-22 14:28:15

标签: javascript c# selenium-webdriver

我正在尝试通过C#中的webdriver执行javascript文件。以下是我到目前为止:

IJavaScriptExecutor js = driver as IJavaScriptExecutor;
(string)js.ExecuteScript("var s = window.document.createElement(\'script\'); s.src = \'E:\\workspace\\test\\jsPopup.js\'; window.document.head.appendChild(s); ");
js.ExecuteScript("return ourFunction");

jsfile.js的内容是

 document.ourFunction =  function(){ tabUrl = window.location.href;
 imagesPath = chrome.extension.getURL("images"); 
 var optionsPopupPath = chrome.extension.getURL("options.html");
 }

然而,当我执行

js.ExecuteScript("return ourFunction");

它抛出了找不到myFunction的例外。我想要做的是通过js注入或任何其他方法运行一个完整的javascript文件,让我访问js文件生成的数据。有帮助吗?

1 个答案:

答案 0 :(得分:1)

这里有三个问题:

  1. 正如@Crowcoder指出的那样,您需要ourFunction(),而不是ourFunction,否则您将会遇到Uncaught ReferenceError: ourFunction is not defined(…)
  2. 的错误
  3. 接下来,ourFunction已添加到document而不是全局范围,因此您需要document.ourFunction(),否则您将收到相同的错误。
  4. 最后,函数不返回任何内容,因此执行它将返回undefined。如果您尝试返回'值'它,你会在浏览器中得到类似Uncaught SyntaxError: Illegal return statement(…)的内容,或者可能会在代码中找到null
  5. 您可以从浏览器控制台测试所有这些,而无需启动WebDriver。

    如果您将方法更改为:

    document.ourFunction = function(){ tabUrl = window.location.href;
      imagesPath = chrome.extension.getURL("images"); 
      var optionsPopupPath = chrome.extension.getURL("options.html");
      return optionsPopupPath;  // return here!
    }
    

    然后js.ExecuteScript("return document.ourFunction()");应该有用。

    <强>更新

    (你可以尝试:js.ExecuteScript("return document.ourFunction();");(添加分号),但这不应该有所作为。)

    我建议(除了添加return语句之外)暂时注释chrome.extension行,以防这些行抛出错误并导致无法创建函数。我认为是最可能的失败原因。

    完成此操作后,这在Firefox和Chrome中对我来说没有任何明确或隐含的等待。