Selenium简介
- selenium1.0:
- selenium IDE(一个FireFox浏览器的插件,可以录制用户的基本操作,生成测试用例,可以在浏览器中回放录制的测试用例,也可以将测试用例转换成其他的编程语言的自动化脚本);
- selenium RC(RC就是remote control的缩写,是用来模拟浏览器的,主要测试web网页,支持多种平台和多种浏览器以及多种编程语言);
- selenium Grid(允许selenium RC 针对规模庞大的测试案例集或者需要在不同测试环境中运行的测试案例集进行的拓展)
总结:selenium1.0的不足之处就是不支持本机的键盘和鼠标的事件,不支持拓展脚本,不支持对话框、弹出框。
- selenium2.0
selenium2.0=selenium1.0+webdriver,和对手webdriver成一家了,selenium2.0基于webdriver API 来模拟用户操作,直接交互操作的浏览器,因此速度更快,支持多种编程语言。
- selenium3.0
selenium3.0: 去掉了对selenium RC的支持,全面拥抱java8,支持macOS 的safari浏览器。
webdriver下载启动
- chromedriver下载
一般选择Chrome版本进行下载安装,chromedriver下载地址: https://npm.taobao.org/mirrors/chromedriver/,选择匹配浏览器的版本即可。
无需安装。win下建议放置在对应运行环境的根目录(即python运行环境根目录),mac下建议放置在usr/local/bin/目录下。或者放置在自定义目录,然后配置环境变量即可。
- 启动
使用
chromedriver
命令即可启动。可看到默认端口为9515
。
% chromedriver
Starting ChromeDriver 88.0.4324.96 (68dba2d8a0b149a1d3afac56fa74648032bcf46b-refs/branch-heads/4324@{#1784}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
使用http://127.0.0.1:9515/访问,接口返回404(未找到对应资源)。可以看出启动chromedriver,实际上是启动了一个可供本地调用的服务。
Selenium原理
- 打印源码log查看启动到关闭过程中发生了什么
# python
from selenium import webdriver
import logging
logging.basicConfig(level=logging.DEBUG) # 打印源码中的日志
driver = webdriver.Chrome() # 启动浏览器
driver.get('http://www.baidu.com') # 访问百度
driver.close() # 关闭浏览器
控制台输出内容如下:
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:57847/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}}
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:57847
DEBUG:urllib3.connectionpool:http://127.0.0.1:57847 "POST /session HTTP/1.1" 200 763
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:57847/session/115f4814ff02d9bae6a80b103e2e4fd7/url {"url": "http://www.baidu.com"}
DEBUG:urllib3.connectionpool:http://127.0.0.1:57847 "POST /session/115f4814ff02d9bae6a80b103e2e4fd7/url HTTP/1.1" 200 14
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:DELETE http://127.0.0.1:57847/session/115f4814ff02d9bae6a80b103e2e4fd7/window {}
DEBUG:urllib3.connectionpool:http://127.0.0.1:57847 "DELETE /session/115f4814ff02d9bae6a80b103e2e4fd7/window HTTP/1.1" 200 12
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
可以看出本地代码使用
HTTP
协议与chromedriver通信,使用urllib3
库进行数据请求。打开浏览器和百度页面使用的是POST
请求,关闭浏览器使用的是DELETE
请求
- 使用代码多次打开浏览器,看看发生了什么
% ps -ef | grep chromedriver
501 6806 1 0 12:22下午 ?? 0:00.08 chromedriver --port=59632
501 12471 1 0 3:13下午 ttys001 0:00.05 chromedriver --port=52637
501 12690 1 0 3:16下午 ttys001 0:00.05 chromedriver --port=53163
501 12800 1 0 3:17下午 ttys001 0:00.07 chromedriver --port=53441
501 13467 1 0 3:36下午 ttys001 0:00.07 chromedriver --port=57716
501 13505 1 0 3:36下午 ttys001 0:00.06 chromedriver --port=57847
501 13974 1 0 3:50下午 ttys001 0:00.04 chromedriver --port=63457
501 14024 1 0 3:50下午 ttys001 0:00.04 chromedriver --port=63601
501 14122 1 0 3:52下午 ttys001 0:00.04 chromedriver --port=64335
可以看出,相当于多次调用webdriver并启动了多个不同端口的服务。
- 使用requests调用chromedriver
import logging
import requests
logging.basicConfig(level=logging.DEBUG) # 打印源码中的日志
# chromedriver地址
driver_url0 = 'http://127.0.0.1:9515/session'
# 打开浏览器请求参数
driver_config = {
"capabilities":{
"firstMatch":[{}],
"alwaysMatch":{
"browserName":"chrome", # 浏览器
"platformName":"any",
"goog:chromeOptions":{
"extensions":[],
"args":[]}}},
"desiredCapabilities":{
"browserName":"chrome",
"version":"",
"platform":"ANY",
"goog:chromeOptions":{
"extensions":[],
"args":[]}}
}
# 打开浏览器并获取sessionId
res = requests.post(driver_url0, json=driver_config).json()
session_id = res.get('value').get('sessionId')
# 带sessionId的chromedriver服务地址
driver_url1 = driver_url0 + '/' + session_id + '/url'
# 访问百度
value = {"url": "https://www.baidu.com/", "sessionId": session_id}
res_baidu = requests.post(url=driver_url1, json=value)
控制台输出内容如下:
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:9515
DEBUG:urllib3.connectionpool:http://127.0.0.1:9515 "POST /session HTTP/1.1" 200 763
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:9515
DEBUG:urllib3.connectionpool:http://127.0.0.1:9515 "POST /session/bd3c02604e3528729ea6a0a5416cba28/url HTTP/1.1" 200 14
webdriver驱动
- webdriver作用
- 跨平台----->将不同的语言python/java/ruby等翻译成浏览器可读的语言
- 多线程----->可以同时启动多个线程服务
- 传递信息----->
code client
<------->webdriver
<------->浏览器
,可部分理解为代理
- 参考文档
https://www.cnblogs.com/linuxchao/p/linux-selenium-webdriver.html