如何使用 selenium 将 javascript 文件加载到 DOM 中?
Posted
技术标签:
【中文标题】如何使用 selenium 将 javascript 文件加载到 DOM 中?【英文标题】:How do I load a javascript file into the DOM using selenium? 【发布时间】:2013-06-27 11:18:01 【问题描述】:我正在使用 Selenium WebDriver 尝试将外部 javascript 文件插入 DOM,而不是将整个内容输入到 executeScript 中。
看起来它正确地将节点放入 DOM,但随后它只是忽略了源,即所述源 js 文件上的函数没有运行。
这是我的代码:
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Example
public static void main(String[] args)
WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementsByTagName('head')[0].innerhtml += '<script src=\"<PATH_TO_FILE>\" type=\"text/javascript\"></script>';");
我要链接的 javascript 文件的代码是
alert("hi Nate");
我已将 js 文件放在我的本地主机上,我使用 file:/// 调用它,并在外部服务器上尝试了它。没有骰子。
另外,在 Java 部分,我尝试使用该技巧附加 'scr'+'ipt',但它仍然不起作用。当我使用 Firefox 的检查元素检查 DOM 时,我可以看到它正确加载了脚本节点,所以我很困惑。
我也尝试了这个解决方案,它显然是为另一个版本的 Selenium(不是 webdriver)而设计的,因此根本不起作用:Load an external js file containing useful test functions in selenium
【问题讨论】:
【参考方案1】:据此:http://docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp
您可能正在使用浏览器机器人来获取当前的句柄 测试窗口或文件。幸运的是,WebDriver 总是 在当前窗口的上下文中评估 JS,所以你可以使用 直接“窗口”或“文档”。
或者,您可能正在使用浏览器机器人来定位元素。 在 WebDriver 中,这样做的习惯用法是首先定位元素, 然后将其作为参数传递给 Javascript。因此:
那么以下在 webdriver 中是否有效?
WebDriver driver = new FirefoxDriver();
((JavascriptExecutor) driver)
.executeScript("var s=window.document.createElement('script');\
s.src='somescript.js';\
window.document.head.appendChild(s);");
【讨论】:
是的!我最终搞砸了一段时间,我相信问题不在于 Selenium 或类似的东西,而是我使用 innerHTML 来附加 DOM,而不是 appendChild,根据***.com/questions/1197575/… 希望这个问题会将来帮助某人,因为我从未找到使用 selenium 添加外部 javascript 文件的工作示例 不错的代码,伙计,但是这个 js 应该在哪个路径中? @estemendoza 我猜它是相对的,但可以是 root 相对的,例如/js/somescript.js
或在您的本地计算机上 file://home/me/js/somescript.js
好的,js文件被加载了,因为我是通过调用document.head.lastChild看到的,但是我不能调用文件中定义的任何方法,总是“bla未定义”。顺便说一句,我正在使用python。【参考方案2】:
将我们的 JS 文件注入 DOM
将我们的 JS-File 从本地服务器注入浏览器应用程序,以便我们可以使用文档对象访问我们的函数。
injectingToDOM.js
var getHeadTag = document.getElementsByTagName('head')[0];
var newScriptTag = document.createElement('script');
newScriptTag.type='text/javascript';
newScriptTag.src='http://localhost:8088/WebApplication/OurOwnJavaScriptFile.js';
// adding <script> to <head>
getHeadTag.appendChild(newScriptTag);
OurSeleniumCode.java
String baseURL = "http://-----/";
driver = new FirefoxDriver();
driver.navigate().to(baseURL);
JavascriptExecutor jse = (JavascriptExecutor) driver;
Scanner sc = new Scanner(new FileInputStream(new File("injectingToDOM.js")));
String inject = "";
while (sc.hasNext())
String[] s = sc.next().split("\r\n");
for (int i = 0; i < s.length; i++)
inject += s[i];
inject += " ";
jse.executeScript(inject);
jse.executeScript("return ourFunction");
OurOwnJavaScriptFile.js
document.ourFunction = function() .....
注意 :如果您将 JS-File 作为字符串传递给 executeScript(),则不要在 JavaScript 代码之间使用任何 cmets,例如 injectioningToDOM.js 删除所有 cmets 数据。
【讨论】:
在 js 文件中使用类似“document.ourFunction = function() .....”后完美运行以上是关于如何使用 selenium 将 javascript 文件加载到 DOM 中?的主要内容,如果未能解决你的问题,请参考以下文章
Python爬虫编程思想(102):使用Selenium改变节点的属性值
selenium webDriver给隐藏域赋值 input hidden set value