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 框架之间的切换
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 框架之间的切换