Selenium3 Python WebDriver API源码探析(20)WebDriver协议概述

软件测试员200题(练习) 所谓的“录制-回放”,就是先使用自动化工具由手工完成一遍需要测试的流程,同时由计算机记录下这个流程期间操作,并形成特定的( )。① 测试用例 ② 测试人员的分配 ③ 测试的度量标准 ④ 测试工具的选用 ⑤ 测试场所的建立(单选题)某公司要成立一个新的测试团队,需要在办公区域内扩展出 20 个工位并搭建专用的测试网络,这属于测试成本中的( )。制定( )的目的在于使测试流程更标准,测试过程更规范。在敏捷项目中,典型业务导向的工作产品是( )和它的验收准则,它是需求规格说明的敏捷表达形式。 阅读详情

WebDriver协议

早期Selenium和WebDriver是两个独立的项目,Selenium早期主要依靠将操作转换为JavaScript然后注入浏览器实现浏览器的自动化,WebDriver将浏览器原生API封装成一套更加面向对象的API,但是由于不同浏览器内核的差异,因此为了适配,必须对不同浏览器实现不同的API。在Selenium2之后两个项目合并,我们常说的Selenium其实主要指的就是WebDriver API。当前Selenium稳定版本的主版本为3,beta版本的Selenium4已经在路上。

Selenium或者WebDriver与浏览器交互的基础是WebDriver协议(W3C推荐标准)。WebDriver协议是一个与操作系统、编程语言无关的通过HTTP协议使用JSON作为传输格式的RESTful Web服务。

WebDriver协议目前有两个版本:

WebDriver协议之前还有一个废弃的JsonWireProtocol协议,具体见https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol

在WebDriver协议模型中牵扯三个对象:

  • 客户端(Client或local end):可以简单认为就是调用WebDriver API的程序或机器。我们常用的Python WebDriver API就是客户端的一个Python语言绑定。
  • 服务端(Server或remote end):运行RemoteWebDriver的机器,或者支持WebDriver协议的浏览器,比如支持geckodriver的Firefox浏览器、支持chromedriver的Chrome浏览器。WebDriver协议其实只定义了服务端的行为。
  • WebDriver:即各种浏览器的WebDriver协议实现,比如geckodriver、chromedriver,WebDriver则相当于客户端和服务端的中介,提供WebDriver协议RESTful 服务。客户端通过WebDriver操控服务端(浏览器)。比如Firefox依靠webdriver.xpi扩展来控制浏览器。

客户端运行后,启动1个会话(session),客户端在该会话中通过WebDriver协议 RESTful 服务端点(endpoint,可简单理解为url)向服务端请求,服务器端接受请求后向客户端返回响应。
!在这里插入图片描述

WebDriver协议将端点映射为命令(command)。端点与命令的关系如下(https://www.w3.org/TR/webdriver/#endpoints):

MethodURI TemplateCommand
POST/sessionNew Session
DELETE/session/{session id}Delete Session
GET/statusStatus
GET/session/{session id}/timeoutsGet Timeouts
POST/session/{session id}/timeoutsSet Timeouts
POST/session/{session id}/urlNavigate To
GET/session/{session id}/urlGet Current URL
POST/session/{session id}/backBack
POST/session/{session id}/forwardForward
POST/session/{session id}/refreshRefresh
GET/session/{session id}/titleGet Title
GET/session/{session id}/windowGet Window Handle
DELETE/session/{session id}/windowClose Window
POST/session/{session id}/windowSwitch To Window
GET/session/{session id}/window/handlesGet Window Handles
POST/session/{session id}/window/newNew Window
POST/session/{session id}/frameSwitch To Frame
POST/session/{session id}/frame/parentSwitch To Parent Frame
GET/session/{session id}/window/rectGet Window Rect
POST/session/{session id}/window/rectSet Window Rect
POST/session/{session id}/window/maximizeMaximize Window
POST/session/{session id}/window/minimizeMinimize Window
POST/session/{session id}/window/fullscreenFullscreen Window
GET/session/{session id}/element/activeGet Active Element
POST/session/{session id}/elementFind Element
POST/session/{session id}/elementsFind Elements
POST/session/{session id}/element/{element id}/elementFind Element From Element
POST/session/{session id}/element/{element id}/elementsFind Elements From Element
GET/session/{session id}/element/{element id}/selectedIs Element Selected
GET/session/{session id}/element/{element id}/attribute/{name}Get Element Attribute
GET/session/{session id}/element/{element id}/property/{name}Get Element Property
GET/session/{session id}/element/{element id}/css/{property name}Get Element CSS Value
GET/session/{session id}/element/{element id}/textGet Element Text
GET/session/{session id}/element/{element id}/nameGet Element Tag Name
GET/session/{session id}/element/{element id}/rectGet Element Rect
GET/session/{session id}/element/{element id}/enabledIs Element Enabled
GET/session/{session id}/element/{element id}/computedroleGet Computed Role
GET/session/{session id}/element/{element id}/computedlabelGet Computed Label
POST/session/{session id}/element/{element id}/clickElement Click
POST/session/{session id}/element/{element id}/clearElement Clear
POST/session/{session id}/element/{element id}/valueElement Send Keys
GET/session/{session id}/sourceGet Page Source
POST/session/{session id}/execute/syncExecute Script
POST/session/{session id}/execute/asyncExecute Async Script
GET/session/{session id}/cookieGet All Cookies
GET/session/{session id}/cookie/{name}Get Named Cookie
POST/session/{session id}/cookieAdd Cookie
DELETE/session/{session id}/cookie/{name}Delete Cookie
DELETE/session/{session id}/cookieDelete All Cookies
POST/session/{session id}/actionsPerform Actions
DELETE/session/{session id}/actionsRelease Actions
POST/session/{session id}/alert/dismissDismiss Alert
POST/session/{session id}/alert/acceptAccept Alert
GET/session/{session id}/alert/textGet Alert Text
POST/session/{session id}/alert/textSend Alert Text
GET/session/{session id}/screenshotTake Screenshot
GET/session/{session id}/element/{element id}/screenshotTake Element Screenshot
POST/session/{session id}/printPrint Page

WebDriver Python API执行流程(反推)

WebDriver客户端API其实就是实现属性或方法到命令,再到WebDriver协议端点的变换过程。

例如:WebDriver类的current_url特性

  1. current_url特性其实是命令Command.GET_CURRENT_URL的执行结果。

    @property
    def current_url(self):
         return self.execute(Command.GET_CURRENT_URL)['value']
    
  2. WebDriver类的execute方法通过command_executor.execute(driver_command, params)执行命令。
    command_executor是一个字符串(服务器url)或者remote_connection.RemoteConnection对象。

  3. remote_connection.RemoteConnection类位于selenium\webdriver\remote\remote_connection.py。
    remote_connection.RemoteConnection类的_commands属性定义了命令和端点之间的关系。
    Command.GET_CURRENT_URL: ('GET', '/session/$sessionId/url')
    remote_connection.RemoteConnection类的execute方法控制服务端执行命令。

  4. WebDriver类在实例化时会传入command_executor参数,command_executor参数即服务端地址。

WebDriver Python API执行流程(正推)

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 服务端地址
url = driver.command_executor._url  
print(url)

上述代码的执行流程大致如下:

  1. driver = webdriver.Firefox()即对selenium\webdriver\firefox\webdriver.py中的WebDriver类实例化,WebDriver类继承自selenium\webdriver\remote\webdriver.py中的WebDriver类。WebDriver类构造方法中command_executor参数即服务端地址。
    此时WebDriver启动浏览器,加载webdriver.xpi扩展,监听基于WebDriver协议的请求。
    在日志文件geckodriver.log中可以看到类似1116855012551 geckodriver INFO Listening on 127.0.0.1:54499的记录。

  2. driver.get("http://www.baidu.com")相当于执行Command.GET命令。 WebDriver对象依靠remote_connection.RemoteConnection对象command_executor执行命令。 remote_connection.RemoteConnection类中实现了命令到WebDriver协议的映射Command.GET: ('POST', '/session/$sessionId/url')。执行命令相当于向浏览器发送对应请求。WebDriver将请求发送给浏览器。

     def get(self, url):
         self.execute(Command.GET, {'url': url})
    
  3. 浏览器在接受请求后执行操作(打开百度页面)并返回响应(服务端地址)。WebDriver将响应结果传递给代码。

c++ 动态库虚表问题导致的不兼容问题 实例 c++动态库在abi兼容方面臭名昭著,这里结合一个线上模块使用动态库导致出core的问题总结下动态库、虚函数表等知识,这里将线上遇到的问题抽象出一个极简的例子,三个文件include.h, main.cpp, func.cpp ,先上源码 include.h: class Base { public: void virtual func1() = 0; }; class Wrapper { public: Base *b; }; extern void jj(Wrapper *); 阅读详情

相关推荐

Python+Selenium 自动化测试 2. Webdriver API介绍

目录 一 Webdriver介绍 二 webdriver实现的原理 三 API介绍 Webdriver 元素的查找的八种方式 find_element_by_id() 源码 find_element_by_name() 源码 find_element_by_link_text() 源码 find_element_by_partial_link_text() 源码 find...

ricky_yangrui的博客 5987

Python+Selenium4环境搭建与原理讲解_web自动化(1)

环境搭建与原理讲解:Selenium的三大组件、两大对象、webdriver类型和下载、webdriver协议原理。

天草柑橘的博客 3201

selenium3源码解析Python篇(十六)-webdriver源码解析

此章为核心模块,内含对浏览器的各种操作!!! 目录结构如下: class WebDriver(object): 将命令通过WebDriver wire protocol协议发送到服务器 session_id: 由此webdriver启动和控制浏览器的会话id capabilities: 远端服务器以字典形式返回有效功能,并非所有服务器实现都将支持每种WebDriver功能。 因此,在描述用户请...

m0_37623792的博客 1491

Selenium Webdriver原理终于搞清楚了

前言 selenium1.x:这个时候的selenium,使用的是JavaScript注入技术与浏览器打交道。需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。Javascript可以获取并调用DOM的任何元素,自如的进行操作。由此才实现了Selenium的目的:自动化Web操作。 这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对

专注自动化、性能测试、测试架构学习交流 1万+

Selenium 3源码解析:WebDriver协议的Python实现本质

WebDriver协议是W3C制定的浏览器自动化标准HTTP接口,其核心在于Session生命周期管理、Command命令路由与JSON Wire Protocol通信机制。理解该协议原理,是掌握自动化底层行为的关键——它决定了超时控制、元素定位稳定性及跨环境兼容性等技术价值。在电商巡检、CI/CD测试、反爬工程等场景中,对Selenium 3源码级认知(如RemoteWebDriver初始化链路、Session创建三次握手、WebElement远程代理模型)能显著提升问题定位效率与架构鲁棒性。本文聚焦Se

weixin_33739646的博客 552

VINS-Mono 时延估计论文翻译

Online Temporal Calibration for Monocular Visual-Inertial Systems 摘要 精确的状态估计是机器人导航、自主驾驶、虚拟现实和增强现实等各种智能应用的基础模块。视觉惯性融合是近年来流行的六自由度状态估计技术。记录不同传感器测量值的时刻对系统的鲁棒性和准确性至关重要。在实践中,每个传感器的时间戳通常会受到触发和传输延迟的影响,从而导致不同传感器之间的时间偏差(时间偏移)。这种时间偏移严重影响传感器融合的性能。为此,我们提出了一种标定视觉和

weixin_39061796的博客 1255

chrome浏览器 headless模式下如何跳过selenium webdriver检测?

1.chrome浏览器 headless模式vb.net教程下如何跳过webdriver检测? 环境: 1.selenium-java <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.4.0</version> </dependency>

chinaherolts2008的博客 1212

强化学习新手上路:用PPO-Clip轻松玩转Pendulum-v1(PyTorch保姆级教程)

本文提供了一份基于PyTorch的PPO-Clip算法实战教程,指导强化学习新手在Pendulum-v1环境中构建连续控制智能体。教程详细解析了PPO-Clip的核心机制,特别是其Clip机制如何限制策略更新幅度以确保训练稳定,并涵盖了从环境配置、策略网络设计、经验收集到完整训练框架搭建的全过程,是掌握连续动作空间强化学习的实用指南。

weixin_29062963的博客 271

Selenium3 Python WebDriver API源码探析(11)WebDriver Capabilities(驱动功能)概述,FirefoxOptions

Selenium通过WebDriver操控浏览器,WebDriver不单是远程控制接口,也是W3C的推荐标准详见https://www.w3.org/TR/webdriver/。 Capabilities(功能)是WebDriver支持的标准命令之外的扩展命令,用于控制端与浏览器端之间对一些特性进行通讯,控制端可以使用Capabilities定义浏览器端创建新会话时需要满足的一些特性。浏览器端也可以用Capabilities描述会话所支持的特性集。 WebDriver支持的Capabilities分为两类,

mighty13的专栏 3万+

基于STM32与毫米波雷达的非接触式睡眠监测系统

物联网和嵌入式系统技术正在推动医疗健康设备的智能化发展。通过传感器网络采集生理信号,结合信号处理算法实现健康监测已成为主流技术方案。毫米波雷达凭借其非接触检测特性,在呼吸、心率等生命体征监测中展现出独特优势。STM32系列MCU凭借丰富外设和低功耗特性,成为医疗级嵌入式设备的首选平台。本系统整合60GHz毫米波雷达、红外测温与无线传输模块,构建了完整的睡眠质量评估解决方案,其硬件架构设计、信号处理算法和低功耗优化策略对可穿戴医疗设备开发具有参考价值。

weixin_36369848的博客 613

PyFluent进阶实战:自动化密闭几何(Watertight)网格生成

本文深入探讨了如何利用PyFluent实现自动化密闭几何(Watertight)网格生成。通过Python脚本控制Fluent Meshing工作流,工程师可以高效、一致地完成从几何导入、局部尺寸定义、面网格生成到边界层设置和体网格输出的全过程,从而将复杂的CFD前处理工作转化为可重复、可集成的自动化流程,极大提升仿真效率和知识复用性。

t8u9v0w1x的博客 578

Selenium3 Python WebDriver API源码探析(1):Selenium基本概念、环境部署

Selenium 简介 Selenium 是支持 Web 浏览器自动化的一系列工具和库的集合。Selenium 是开源项目。目前最新版本为Selenium 3。 Selenium 支持多平台,如:Linux、Windows和mac OS。 Selenium 支持多种编程语言,如:Java、Python、C#、Ruby、JavaScript、Kotlin Selenium 支持多种浏览器,如:IE、Firefox、Google Chrome、Edge、Safari、Opera等 Selenium项目主要包括以

mighty13的专栏 3万+

Ubuntu 部署 Ollama 避坑指南:下载失败 / 服务崩溃?一招解决所有问题!

本文详细介绍了在Ubuntu系统上安装Ollama大模型工具的完整流程和常见问题解决方案。主要内容包括:环境检查(系统版本、架构、依赖)、一键安装步骤、端口配置和服务启动等核心操作。重点针对下载失败、服务启动异常、权限不足等高频问题,提供了国内镜像配置、手动创建服务文件、用户组添加等实用解决方案。最后通过测试Qwen2.5轻量模型验证安装效果,并给出低配设备选型建议。全文提供可复制的命令行操作,帮助用户快速搭建离线可用的大模型环境。

2501_93651177的博客 1008

Selenium3 Python WebDriver API源码探析(19)加载FireFox用户配置文件

FireFox用户配置文件 Firefox 将用户个人信息(例如书签、密码、首选项、扩展、Cookie、证书等)保存在一系列文件中,它们被叫做用户配置文件,它们与 Firefox 的程序文件保存在不同位置。 因此,WebDriver如果能够加载已有的FireFox用户配置文件可带来很多便利! 查找用户配置文件 Firefox默认在本地路径C:\Users\<your Windows login username>\AppData\Roaming\Mozilla\Firefox\Profiles\

mighty13的专栏 3万+

【汽车 OTA 】差分升级

汽车 OTA 差分升级,本质是在整包 OTA 的基础上,通过“只传变化”的方式,大幅减少下载数据量、时间和成本,是当前车端软件升级的主流方向之一。

天赐好车的博客 484

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程。

本文介绍了三相四线制整流器在不平衡负载下的中点电位平衡控制方法。首先分析了中点电位漂移的物理机理和控制策略(零序电压注入)。接着详细讲解了Simulink建模步骤:搭建三相四线制主电路、设计平衡控制算法、实现PWM调制。通过对比有无平衡控制的仿真结果,验证了控制方法的有效性。最后提供了工程建议:零序注入需限幅、考虑中性线寄生电感影响、采用稳健的PI参数。该方案能有效抑制中点电位波动,保障三电平系统在不平衡工况下的稳定运行。

MHD0815的博客 60

Selenium3 Python WebDriver API源码探析(15)Cookie管理

Cookie是从网站发送并存储在计算机中的一小段数据。 Cookies主要用于识别用户并加载存储的信息。WebDriver API提供了一系列与Cookie进行交互的内置方法。selenium\webdriver\remote\webdriver.py中的WebDriver类实现了相关方法。 Cookie相关API 添加Cookie Selenium用于添加Cookie的方法为add_cookie(cookie_dict),cookie_dict参数的格式为一组已定义的可序列化JSON对象(字典),具体取值

mighty13的专栏 3万+

NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化

本文介绍了在项目开发中实现坐标转换的方法,重点解析了两个关键函数UF_MTX4_csys_to_csys和UF_MTX4_vec3_multiply的使用。通过4个变换矩阵(transform1-4)实现工作坐标系与绝对坐标系之间的相互转换,并以圆柱体为例详细说明了坐标转换的具体实现过程,包括原点、X/Y轴方向的转换处理。相比之前采用的if-else判断方法,这种矩阵转换方式在代码复杂度和运行效率上都更具优势。

weixin_47753171的博客 600

Selenium3 Python WebDriver API源码探析(4):Web元素的属性和方法

Selenium中网页中DOM元素的实现为selenium\webdriver\remote\webelement.py中的WebElement类。 WebDriver API中定位元素的方法在《Selenium3 Python WebDriver API源码探析(3):定位元素》已经简单介绍。本文主要介绍网页元素的属性和方法。 属性或特性 元素的标签名称 作用:获得当前元素的标签名称 签名:el.tag_name 返回值:字符串,例如'input' 元素的文本 作用:获得当前元素的文本内容 签名:el.t

mighty13的专栏 3万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Selenium3 Python WebDriver API源码探析(2):Selenium包目录结构、模块功能概述

Selenium 包结构概述 Selenium 包结构如下: selenium ├─common └─webdriver ├─android ├─blackberry ├─chrome ├─common │ ├─actions │ └─html5 ├─edge ├─firefox ├─ie ├─opera ├─phantomjs ├─remote ├─safari ├─support

mighty13的专栏 3万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Selenium3 Python WebDriver API源码探析(13)FireFox设置代理

数据采集过程中经常需要用到代理,Selenium也支持代理功能,selenium\webdriver\common\proxy.py提供了代理数据结构的实现。Selenium实现代理的方法有很多种,不同WebDriver实现实现代理的方法也不尽相同。由于经常使用FireFox浏览器,因此,以geckodriver作为案例来演示代理功能。 官方文档推荐使用Capabilities 根据《Selenium3 Python WebDriver API源码探析(11)WebDriver Capabilities(驱

mighty13的专栏 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Selenium3 Python WebDriver API源码探析(6):窗口(标签)管理(切换、关闭)

WebDriver 不区分窗口和标签页。如果打开了一个新窗口(标签),可以使用窗口句柄(handle)来处理它。 每个窗口都有一个唯一的标识符,该标识符在单个会话中保持持久性。 获取当前窗口句柄 作用:获取当前窗口句柄 签名:driver.current_window_handle 调用对象:WebDriver实例 值类型:字符串 获取浏览器窗口句柄集合 作用:获取当前浏览器的窗口句柄集合 签名:driver.window_handles 调用对象:WebDriver实例 值类型:字符串列表 打开并切换新窗

mighty13的专栏 3万+

Selenium3 Python WebDriver API源码探析(3):定位Web元素

定位元素是任何与Web进行交互操作的基础,JavaScript如是,对于Selenium亦如是。只有定位到了元素,才能对元素进行操作。 Selenium中的两个基础元素定位方法(find_element与 find_elements) 在Selenium中使用find_element与 find_elements方法即可完成元素的定位。 我们先简单对比下这两个方法,再讲相关的细节: find_element : 函数签名:def find_element(self, by=By.ID, value=No

mighty13的专栏 3万+

Selenium3 Python WebDriver API源码探析(12)FireFox自定义功能(FirefoxOptions)的实现:Options类

FireFox自定义功能的相关实现 根据《Selenium3 Python WebDriver API源码探析(11)WebDriver Capabilities(驱动功能)概述,FirefoxOptions》可知,WebDriver实现通过Capabilities定义新会话启动时的各种特性,也可以返回会话的特性集。Capabilities分为两类,一类是标准Capabilities,一类是各WebDriver实现的特定Capabilities。对于FireFox WebDriver 即geckodrive

mighty13的专栏 3万+

Selenium3 Python WebDriver API源码探析(18)FireFox WebDriver实现,安装扩展

根据《Selenium3 Python WebDriver API源码探析(2):Selenium包目录结构、模块功能概述》可知,selenium\webdriver\remote\webdriver.py模块中的WebDriver类定义了通用WebDriver的基本特性,各种浏览器根据自身特性继承WebDriver类再做进一步实现。selenium\webdriver\firefox\webdriver.py模块中的WebDriver类实现了FireFox WebDriver,并通过selenium\we

mighty13的专栏 3万+

Selenium3 Python WebDriver API源码探析(9):JavaScript原生警告框(alert)、确认框(confirm)、提示框(prompt)处理

弹窗提示概述 Selenium专门提供了用于处理JavaScript原生弹窗提示的API。 这些JavaScript原生提示包括警告框(alert)、确认框(confirm)、提示框(prompt),它们由浏览器提供限定的样式。 警告框(alert)构成主要包括提示文本和确定按钮。 确认框(confirm)构成主要包括提示文本、确定按钮和取消按钮。 提示框(prompt)构成主要包括提示文本、输入框、确定按钮和取消按钮。 Selenium弹窗提示API Selenium用于处理Java

mighty13的专栏 3万+
上一篇: Selenium3 Python WebDriver API源码探析(19)加载FireFox用户配置文件
下一篇: Microsoft SQL Server 2008 R2 “无法读取此系统上以前注册的服务器的列表”异常问题解决方法
mighty13
博客等级 码龄23年 728粉丝 438原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值