我正在尝试通过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中正常工作,根本不需要任何显式或隐式等待。