selenium 中 webdriver 原理
selenium 中 webdriver 通信流程
主要流程就是 selenium 通过里面的 webdriver 直接控制浏览器(通过不同浏览器的驱动)然后对目标进行UI层面的测试。
其本质就是 http 的通信过程:
- 通过代码服务启动,chromedriver 启动,IP + 端口进行监听
- python selenium webdriver 跟 chromedriver 建立连接
- chromedriver 接受到指令后,加载浏览器配置,启动chromedriver.exe,驱动浏览器进行操作,发送 http 请求
- chromedriver 把结果返回给 python selenium webdriver
这个 Selenium 和 Python 的关系并不大,只是用 Python 语言做一些封装,访问 Selenium 连接的服务器,通过请求参数发送对应的指令。
Selenium-Binding 的实现:
- Webdriver 类干了两件事:初始化了一个 server 实例 和 remoteConnect 实例。
- Server 实例就干了一件事:启动了driver.exe,因此搭了一个本地服务器,你可以通过浏览器访问这个服务器。
- RemoteConnect 就是做一个客户端,类似于 requests 干的事,当然这里有但是标准库 urlib3。
- 其他还定义了一些 command,然后把 command 传给 connect 做为请求参数,访问对应的 url 地址。
查看 webdriver 源码
# 从selenium中导入webdriver
from selenium import webdriver
# 创建一个浏览器驱动,打开一个浏览器,与浏览器创建会话
# 启动了chromedriver.exe 并建立了连接,创建了会话ID
driver = webdriver.Chrome()
# executable_path 驱动的路径
# driver = webdriver.Chrome(executable_path=r'C:\webDriver\chromedriver.exe')
print(driver)
# 打印的是selenium对象 驱动
# <selenium.webdriver.chrome.webdriver.WebDriver (session="02d3143d34d31c6062c76cd68b5f41c8")>
# 用谷歌浏览器打开一个网站
driver.get(url='https://www.baidu.com/')
将鼠标移至 webdriver 处,按住Ctrl单击鼠标左键,查看源代码
通过这些代码,可以知道 selenium 是从各个地方引进 webdriver 的,然后以浏览器的名字进行命名
而这里通过实例化webdriver.Chrome() 赋值给 driver 变量,与 chromedriver 建立连接,加载浏览器配置,启动chromedriver.exe,驱动浏览器进行操作
将鼠标移至 Chrome() 处,按住Ctrl单击鼠标左键,查看源代码
通过这段代码,可以知道在 webdriver 类中,对 chromedriver 进行了一些初始化操作。
这个初始化方法的下方有两句注释,意思是创建了一个 chrome driver 的实例,开始了一个新的服务进行实例会话
-
executable_path 驱动的路径。
executable_path=“chromedriver”,这里为什么没有exe后缀呢?
是因为selenium是跨平台的,mac 和 Linux 上都可以执行这个驱动,所以这里只给定了名称,在网站上下载驱动的时候,也发现提供了多种类型的文件,Windows下的是 .exe后缀的文件。
从下方灰色字体的注释中,可以了解到,如果不给定驱动的路径,会默认从path环境变量中去找,直到某个环境变量下有 chromedriver 为止,所以这就是为什么我们默认将驱动文件放在python的安装目录下的原因了。 -
port 端口号,这里指 chromedriver 的启动端口
port=0 ,意思是它会自动去找一个没有被占用的端口号启动
目前知道这两个内容就可以,后面用到后再具体说明