WebDriver 协议相对于注入 JavaScript 自动化有什么好处?

What is the benefit of the WebDriver protocol over injected JavaScript automation?

W3C 定义了 WebDriver Protocol,可用于在浏览器中自动执行网页上的用户输入。它可以与外部浏览器驱动程序(例如 Google Chrome 的 Chrome 驱动程序或 FireFox Gecko 驱动程序一起使用,并且按钮按下和悬停事件(以及更多)等操作可以被模拟。

但是,我可以通过注入一些自定义编写的 JavaScript 代码来获得相同的结果,这些代码直接生成事件并 运行 在网页上下文中发送它们。例如,我可以只创建一个 MouseEvent 实例并分派它来模拟点击事件。

我知道 WebDriver 协议是浏览器自动化的最先进方法,但为什么会这样?当我可以打开网页并 运行 注入自动化代码时,使用需要依赖于浏览器的驱动程序软件的协议有什么好处?

我可能仍然需要外部软件来打开浏览器实例并注入自动化代码,但我认为事件自动化不需要完整的浏览器外部接口。

  • Jason Huggins 在 JavaScriptTestRunner 时开始构建 Selenium 的核心模式(原始模式),其中 javascript 自动化脚本被注入 Web 应用程序以实现 运行 自动化。
  • Same origin policy 是这种自动化模式的主要障碍之一,它指出要在网页上执行 javascript 文件,javascript 文件应来自同一域加载网页的位置。例如:要从 www.google.com 页面上的 js 文件实现 运行 javascript 功能,必须从 www.google.com 网络服务器本身下载 javascript 文件。浏览器阻止用户从外部注入 javascript 文件并执行它。
  • 那么 Jason 是如何实现自动化的呢?他在被测 Web 应用程序中包含了 JavaScriptTestRunner

Expecting testers to have access to the web server to include the JavaScriptTestRunner into the server is not practical. Also, in production servers this is big NO-GO.

  • RC 和随后的 WebDriver 项目开始着手解决这些问题。

With WebDriver protocol, a user only needs access to the application under test in a browser to write UI automation. There is no need to have back end server access.

WebDriver architecture is beautifully designed to have 2 objects(primarily) to achieve automation - WebDriver to control the browser and find WebElements and WebElement to perform operations on the application UI.

// Open chrome
WebDriver driver = new ChromeDriver();
// open url
driver.get("url");
// find element
WebElement someElement = driver.findElement(By.id("some-id"));
// perform operation on element
someElement.click();
  • 没有与页面上的其他javascript运行发生冲突的风险
  • 适用于非 html 页、没有 dom 且不会 运行 javascript
  • 的资源
  • 可以访问注入js没有权限的功能(例如浏览器日志)运行
  • 流控制不会被意外的页面导航、重新加载等破坏
  • 当您的代码未 运行 在其中一个框架内时,更容易处理选项卡、windows 框架之间的切换