Selenium--简介和原理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值