我正在尝试通过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");


它抛出了ourFunction找不到的异常。我想做的是通过js注入或其他任何可以让我访问js文件生成的数据的方法来运行完整的javascript文件。有什么帮助吗?

最佳答案

这里有三个问题:


正如@Crowcoder指出的那样,您需要ourFunction(),而不是ourFunction,否则您将在Uncaught ReferenceError: ourFunction is not defined(…)的一行中看到一条错误消息
接下来,将ourFunction添加到document而不是全局范围中,因此您需要document.ourFunction(),否则会遇到相同的错误。
最后,该函数不返回任何内容,因此执行该函数将返回undefined。如果尝试返回它的“值”,则在浏览器中将得到类似Uncaught SyntaxError: Illegal return statement(…)的内容,或者在代码中可能返回null的内容。


您可以从浏览器控制台测试所有这些,而无需启动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中正常工作,根本不需要任何显式或隐式等待。

09-13 10:31