selenium历史与webdriver实现原理

Selenium始于2004年的Selenium Core,后来发展为包括Selenium IDE、Grid和RC。Selenium 2.0引入了Webdriver,通过原生浏览器支持直接控制,而Selenium 3.0移除了RC,支持更高版本的JAVA和浏览器。WebDriver的工作原理是通过发送HTTP请求到远程服务器,执行浏览器操作,然后返回响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

我们常说的selenium是什么?

**

移除
Selenium
Selenium 1.0
Selenium 2.0
Selenium 3.0
Selenium IDE
Selenium Grid
Selenium RC
Selenium 1.0
Webdriver
Selenium2.0
Selenium RC

1. Selenium 1.0:
诞生于2004年,最初是由ThoughtWorks的工程师们为了实现自动操控浏览器的功能,用js封装了一套类库,被称为:selenium core,这也是Selenium 1.0的核心
Selenium IDE:
他是存在于Firefox浏览器上的一个插件,可以用它来实现对浏览器的录制与回放操作
Selenium Grid:
他是一个自动化测试的辅助工具,以分布式为基础,实现在多台机器上运行同一份测试脚本
Selenium RC(remote control):
他是Selenium家族的核心:
Selenium RC=Client Libraries+Selenium Server
Client Libraries用来编写测试脚本,Selenium Server用来执行从客户端发来的请求,控制浏览器行为,其中服务端用来控制浏览器的类库,便是用js编写的selenium core

Python
Selenium Server
JAVA
Ruby
......Client
Chrome
Firefox
......

2. Selenium 2.0:
但用js操作有诸多麻烦,毕竟不是长久之计,在2006年的时候,Google工程师们发起了Webdriver项目,Webdriver是通过原生浏览器的支持来直接控制浏览器,Webdriver支持各个浏览器,例如Chrome的chromedriver,并且可以调用OS级别的操作,它的出现使得Selenium 2.0诞生

Python
chromedriver ...
JAVA
Ruby
......Webdriver
Chrome
Firefox
......

3. Selenium 3.0:
时间到了2016年,Selenium 3.0诞生,在此之前已经过了10年的时间,本次Selenium 3.0为我们带来的改变有:
1.去掉了Selenium RC
2.JAVA只支持8版本及以上
3.Firefox驱动独立,类似于Chrome的chromedriver
4.MAC OS 集成Safari的浏览器驱动,默认在/usr/bin/safaridriver 目录下
5.只支持IE 9.0版本及以上
Selenium 3.0重写了webdriver驱动,产生了 The WebDriver Wire Protocol协议

webdriver实现原理:

以下面这段代码的执行过程为例:

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw")
driver.quit()

从selenium包中倒入webdriver包:
_init_会自动帮我们载入from .chrome.webdriver import WebDriver as Chrome

class WebDriver(RemoteWebDriver):

Chrome的webdriver实现,继承了RemoteWebDriver,而RemoteWebDriver是来自:

from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver

我们在源码解析有讲解RemoteWebDriver:

通过将命令发送到远程服务器来控制浏览器。
该服务器预期正在运行WebDriver有线协议,在
https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol

driver.find_element_by_id("kw")

最终通过find_element_by_id发现,调用的是这个方法

self.execute(Command.FIND_ELEMENT, {
            'using': by,
            'value': value})['value']
response = self.command_executor.execute(driver_command, params)
command_executor=RemoteConnection(command_executor, keep_alive=keep_alive)

command_executor在webdriver中有默认值为:command_executor='http://127.0.0.1:4444/wd/hub

所以调用find_element_by_id方法时:
会先通过Command.FIND_ELEMENT取得对应值
调用RemoteConnection类的execute方法向远程服务器发送命令,执行后给出response

总结一下:

webdriver通过对RemoteConnection类的调用,执行http请求,将参数转化成json格式,作为请求体发送到remote server上,remote server在执行完对浏览器的操作后得到response传回客户端,最后解析成自己想要的数据

继承
http RESTful request
控制
response
code
selenium/webdriver/remote/webdriver.py
selenium/webdriver/remote/remote_connection.py
Remote webdriver
Browser
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值