我们现在使用的selenium是selenium 2,也就是基于webdriver实现的版本.webdriver是一个w3c的标准,其标准文档在https://w3c.github.io/webdriver/中.webdriver协议规定了通过给一个webdriver进程发送restful HTTP请求来控制浏览器进行UI元素操作.
在selenium 1版本中,也就是以前的selenium rc中,没有使用webdriver协议,而是使用向页面注入JavaScript脚本的方式进行测试.
开启调试模式观察selenium的测试过程为了看清楚selenium测试的过程中是怎么和webdriver进行Http请求交互的.使用如下代码,注意其中开启全局logging DEBUG的地方.
import loggingimport timefrom selenium import webdriver# 下面两行开启全局的logging DEBUG,urllib3和selenium的日志会打印出来logging.basicConfig()logging.getLogger().setLevel(logging.DEBUG)chromeOptions = webdriver.ChromeOptions()driver = webdriver.Chrome(options=chromeOptions)driver.maximize_window()driver.get('http://www.baidu.com')driver.execute_script(f"window.open('http://www.baidu.com')")time.sleep(2)driver.quit()测试过程中,可以看到如下的日志.可以看到其中都是和一个本地端口的HTTP请求的交互.
那么这个本地端口是怎么开起来的呢? 通过调试代码,可以看到这个端口是chromedriver启动起来的.这就是为什么我们需要将chromedriver放到PATH目录里面,或者指定chromedriver的路径.
手动进行webdriver调试我们可以手动模拟上面的过程来更加清楚的理解selenium的运行过程.
1.使用如下命令启动chromedriver,其默认启动在9515端口上
chromedriver.exe2.使用如下命令让chromedriver启动一个新的session(也就是一个新的浏览器)
curl -XPOST http://127.0.0.1:9515/session -d @cap#其中cap文件内容如下{"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}}返回内容中会有这个session的id
5bd4e704a736094a169ee322e6ac3df83.使用如下命令让Chrome窗口最大化
curl -XPOST http://127.0.0.1:9515/session/5bd4e704a736094a169ee322e6ac3df8/window/maximize -d '{}'能看到浏览器窗口最大化了
4.使用如下命令让地址栏输入百度的网址,能看到打开了百度网页
curl -XPOST http://127.0.0.1:9515/session/5bd4e704a736094a169ee322e6ac3df8/url -d '{"url": "http://www.baidu.com"}'5.使用如下命令,让浏览器打开一个新的table并打开百度网页
curl -XPOST http://127.0.0.1:9515/session/5bd4e704a736094a169ee322e6ac3df8/execute/sync -d @baidu# baidu 这个文件的内容为{"script": "window.open('http://www.baidu.com')", "args": []}6.使用如下命令让浏览器退出
curl -XDELETE http://127.0.0.1:9515/session/5bd4e704a736094a169ee322e6ac3df8 -d '{}'可以看到整个HTTP的通信过程和用selenium做是相同的.
webdriver协议本身还定义了很多其他操作,比如查找元素,截图之类的,这些都对应着其他的HTTP请求.