javascript.Injection with Selenium, Puppeteer, and Marionette in Chrome and Firefox

经过Evan Sangaline.|2017年12月29日

Browser automation frameworks–like傀儡木偶, 和nightmare.js.-Strive提供丰富的API,用于配置和交互与Web浏览器。这些通常很好地工作,但如果您完成了大量的测试或Web刮擦,您将不可避免地将最终进入API限制。你可能会发现自己想要隐瞒你使用无头浏览器的事实extract image resources from a web page那set the seed forMath.random()或在运行测试套件之前模拟浏览器的地理位置。您的特定自动化框架可能会提供内置的方式来实现其中一些,但它们都有其局限性。

添加自定义行为的一个选项是本身将新功能实际到浏览器自动化框架,并提交拉出请求。如果您认为其他人会发现它很有用,这是一件好事,但您经常需要解决方案立即地并且没有保证您的拉请求不会几个月的萎语。在这些情况下,或者您的用例是相当利基的,您可能会发现自己转向JavaScript。无论您是使用Python,Ruby,Java还是其他语言,几乎所有浏览器自动化框架和浏览器都支持某种形式的JavaScript注入。这通常为在Web擦除或写入测试时添加自定义行为或配置的最快和最简单的方法。

这re’s just one problem: not all JavaScript injection methods behave in the some way. Some execute your JavaScript code before the page is parsed by the browser while others wait until after theDOMContentLoaded或者加载活动已经解雇了。后一种行为在语言执行的情况下,在情况下可能是非常有问题的before页面上包含的任何JavaScript。例如,如果在WebApp已经检查了位置后,您的地理位置模拟不会做很多好处!

这意味着不仅要知道它很重要如何将JavaScript注入页面,也可以将JavaScript注入页面,什么时候javascript将执行。在本文中,我们将在注入的JavaScript代码执行时,开发一个简单的测试来测量,然后我们将全面地基准以各种注射方法以及它们的行为方式。如果您有兴趣使用木偶特,Selenium,Marionette或其他框架运行自定义JavaScript代码,那么本指南应告诉您您需要知道的一切。

测试页面

为了帮助衡量注射行为,我汇总了一个简单的test page我可以用来基准不同的方法。测试页面 - 故意加载非常缓慢 - 将呈现出这样的东西

Test Page

基于以下HTML代码。