- 需求
我们在进行selenium页面自动化测试时,是不是经常碰到需要反复的进行脚本调试,且调试的过程中不需要从场景的起始开始,只需要运行场景的某些步骤。对于初学者来说,可能只会从webdriver初始化开始,打开一个浏览器一步步的运行。对于一个场景有几十个步骤的情况,这样调试会非常耗时,且每次都需要重复的打开浏览器。
对于这样的耗时的调试,有没有一种办法可以进行断点调试,通过对selenium的源码做了深度刨析,发现是有方法可以解决以上情况。
- 思路
首先要知道selenium webdriver的工作原理,当我们用webdriver初始化一个浏览器窗口时,实际上是创建了一个浏览器的调试服务端,而webdriver的api是客户端。
当运行selenium的每个脚本,其实都会创建一个HTTP请求到服务端,HTTP Server接收到请求后根据请求来具体操控对应的浏览器做出响应,执行具体的动作,并将执行的结果返回给HTTP Server,然后server再将结果返回给脚本,webdriver在http协议基础上又有些许改动,增加了更加明确的响应状态码,如NoSuchElement,ElementNotVisible等。
当我们知道了webdriver原理本质是http协议后,此时我们要去操控浏览器其实就是获取session的过程,根据官方文档的指引,我们首先用命令java -jar selenium-server-standalone-3.14.0.jar,建立服务端,再根据相应接口操控浏览器。
- 实现
1、下载相应的浏览器驱动和服务端jar包
jar: http://selenium-release.storage.googleapis.com/3.14/selenium-server-standalone-3.14.0.jar
2、服务端启动
java -jar selenium-server-standalone-3.14.0.jar
浏览器打开:http://localhost:4444/wb/hub/static/resource/hub.html,session管理
3、获取可用的浏览器
用sessions接口获取所有已启动的调试窗口,找到相应的sessionId。
4、根据sessionId来操控浏览器
HTTP Method | Path | Summary |
---|---|---|
GET | /status | Query the server's current status. |
POST | /session | Create a new session. |
GET | /sessions | Returns a list of the currently active sessions. |
GET | /session/:sessionId | Retrieve the capabilities of the specified session. |
DELETE | /session/:sessionId | Delete the session. |
POST | /session/:sessionId/timeouts | Configure the amount of time that a particular type of operation can execute for before they are aborted and a |
POST | /session/:sessionId/timeouts/async_script | Set the amount of time, in milliseconds, that asynchronous scripts executed by /session/:sessionId/execute_async are permitted to run before they are aborted and a |
POST | /session/:sessionId/timeouts/implicit_wait | Set the amount of time the driver should wait when searching for elements. |
GET | /session/:sessionId/window_handle | Retrieve the current window handle. |
GET | /session/:sessionId/window_handles | Retrieve the list of all window handles available to the session. |
GET |