从python角度解析selenium原理

 

1、selenium工作流程

图片

2、selenium工作原理

(1)客户端和服务端之间实际是通过http协议进行通信,服务端的接口文档可参考:https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelement

(2)客户端按照服务端接口要求传入请求方式、请求url和请求数据,然后发送http请求,服务端收到请求后驱动浏览器执行命令;

(3)selenium实际已封装好各种操作接口的请求函数,用户只需通过指定的方法传入数据即可,如get、click、find_element实际都是封装了整个http请求过程的方法;

即测试人员仅需根据功能需求调用对应的方法并传参即可,最终由selenium组装请求信息后发送请求;

(4)可见,完全可以跳过selenium,自己通过requests模块构建请求信息发送给驱动程序,从而驱动浏览器执行相关操作。

3、从selenium源码角度剖析selenium原理

(1)先说明一下

以下例子,以python、chrome驱动程序、chrome浏览器展开说明。

(2)通过selenium实现工作流

 1  1 # 启动chrome浏览器
 2  2 driver = webdriver.Chrome()
 3  3 # 访问百度网站
 4  4 driver.get("http://www.baidu.com")
 5  5 # 查找输入框元素
 6  6 ele = driver.find_element_by_id("kw")
 7  7 # 在输入框中输入“selenium”
 8  8 ele.send_keys("selenium")
 9  9 # 查找百度一下按钮
10 10 ele = driver.find_element_by_id("su")
11 11 # 点击百度一下按钮
12 12 ele.click()

(3)selenium源码解析

① driver = webdriver.Chrome()

启动chromedriver驱动程序,启动后可通过http://ip:port访问驱动程序

图片

通过execute方法,构建“创建新会话”接口的请求信息,并发送http请求,返回会话id:

请求方式:POST
请求地址:http://localhost:post/session
请求数据:data = {"desiredCapabilities":{
          "browserName": "chrome",
          "version":"85.0.4183.83",
          "platform":"WINDOWS"}
        }

图片

图片

② driver.get(“http://www.baidu.com”)

通过execute方法,按get命令的接口信息构建http请求信息,并发送http请求:

请求方式:POST
请求地址:http://localhost:post/session/$sessionId/url(sessionId为会话id,从①中获取)
请求数据:{"url": "http://www.baidu.com"}

图片

图片

③ driver.find_element_by_id(“kw”)

通过execute方法,按find_element_by_id命令的接口信息构建http请求信息,并发送http请求:

请求方式:POST
请求地址:http://localhost:post/session/$sessionId/element(sessionId为会话id,从①中获取)
请求数据:{"using":"id","value":"kw"}

图片

图片

④ ele.send_keys(“selenium”)

通过execute方法,按send_keys命令的接口信息构建http请求信息,并发送http请求:

请求方式:POST
请求地址:http://localhost:post/session/$sessionId/element/$id/value(sessionId为会话id,从①中获取,id为元素id,从③获取)
请求数据:{"value": ["selenium"]}

图片

图片

图片

⑤ ele.click()

通过execute方法,按click命令的接口信息构建http请求信息,并发送http请求:

请求方式:POST
请求地址:http://localhost:post/session/$sessionId/element/$id/click(sessionId为会话id,从①中获取,id为元素id,从③获取)
请求数据:无

在这里插入图片描述

在这里插入图片描述

图片

4、通过requests模块实操验证selenium实现原理

(1)代码实现

# TODO 访问域名
 base_url = "http://localhost:9515"

 # TODO 创建会话
 url = base_url + "/session"
 data = {
         "desiredCapabilities":{
                 "browserName": "chrome",
                 "version":"85.0.4183.83",
                 "platform":"WINDOWS"
         }
}
res = request("POST",url,json=data)
session_id = res.json()["sessionId"]    # 返回会话id

sleep(2)

# TODO 发送get命令 - 访问某个网站
url = base_url + "/session/{}/url".format(session_id)
data = {
     "url": "http://www.baidu.com"
}
res = request("POST",url,json=data)

# TODO 发送find_element命令 - 查找元素
url = base_url + "/session/{}/element".format(session_id)
data = {
     "using":"id",
     "value":"kw"
}
res = request("POST",url,json=data)
ele = jsonpath(res.json(),"$..ELEMENT")[0]      # 返回元素id

# TODO 发送send_keys命令 - 输入内容
url = base_url + "/session/{}/element/{}/value".format(session_id,ele)
data = {
     "value": ["selenium"]
}
res = request("POST",url,json=data)

# TODO 发送find_element命令 - 查找元素
url = base_url + "/session/{}/element".format(session_id)
data = {
     "using":"id",
     "value":"su"
}
res = request("POST",url,json=data)
ele = jsonpath(res.json(),"$..ELEMENT")[0]      # 返回元素id

# TODO 发送click命令 - 元素点击
url = base_url + "/session/{}/element/{}/click".format(session_id,ele)
res = request("POST",url)

(2)运行结果

图片

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/510831.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

softmax函数的功能及用法

Softmax函数是一种常用的激活函数,通常用于多分类问题的输出层。其功能是将一个具有任意实数值的向量(通常称为“logits”)转换为一个概率分布,其中每个元素的值表示对应类别的概率。 Softmax函数的公式如下: 给定一…

windows下通过vscode访问ubuntu(绝大部分Linux下开发所采用的方案)

前言 本篇博客是介绍VSCode远程连接Ubuntu进行开发的解决方案,前提是安装好了VMWare,Ubuntu,windows下的VSCode。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关…

库存超卖问题分析

3.5 库存超卖问题分析 有关超卖问题分析&#xff1a;在我们原有代码中是这么写的 if (voucher.getStock() < 1) {// 库存不足return Result.fail("库存不足&#xff01;");}//5&#xff0c;扣减库存boolean success seckillVoucherService.update().setSql(&quo…

Nginx 高级

文章目录 Nginx反向代理概念配置 负载均衡概念配置 动静分离概念配置 网关防盗链keepalivednginx跨域 Nginx 反向代理 概念 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&…

深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度

看这篇前请先把我上一篇了解一下&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 前言&#xff1a; 相信很多学习数据结构的人&#xff0c;都会遇到一种情况&#xff0c;就是明明最一开始学习就学习了时间复杂度&#xff0c;但是在后期…

电商-广告投放效果分析(KMeans聚类、数据分析-pyhton数据分析

电商-广告投放效果分析&#xff08;KMeans聚类、数据分析&#xff09; 文章目录 电商-广告投放效果分析&#xff08;KMeans聚类、数据分析&#xff09;项目介绍数据数据维度概况数据13个维度介绍 导入库&#xff0c;加载数据数据审查相关性分析数据处理建立模型聚类结果特征分析…

Ceph学习 - 1.存储知识

文章目录 1.存储基础1.1 基础知识1.1.1 存储基础1.1.2 存储使用 1.2 文件系统1.2.1 简介1.2.2 数据存储1.2.3 存储应用的基本方式1.2.4 文件存储 1.3 小结 1.存储基础 学习目标&#xff1a;这一节&#xff0c;我们从基础知识、文件系统、小节三个方面来学习。 1.1 基础知识 1.…

day01 51单片机

51单片机学习 1 51单片机概述 1.1 51单片机简介 目前使用的51单片机一般是宏晶STC89系列,这其中流传最广的版本,也是我们课程的主角,就是STC89C52RC。 1.2 命名规则 1.3 单片机最小应用系统 2 点亮LED灯 2.1 硬件原理图 这个原理图非常简单,VCC接保护电阻R1,串联LED1最…

IOTX:未来市场爆发点的RWA协议?DePIN赛道被低估的龙头

从基本面来看&#xff0c;IoTeX的目标是创建一个连接的世界&#xff0c;在这个世界中&#xff0c;每个人都能控制自己的数据、设备和身份。通过区块链技术&#xff0c;IoTeX旨在解锁智能设备和数据的潜力&#xff0c;支持新一代的现实世界Dapp和数字资产的发展。IOTX始终致力于…

个性化内容的力量:Kompas.ai如何帮你定制内容

在当今的数字化营销环境中&#xff0c;个性化内容已经成为品牌与消费者建立深层次联系的关键。个性化内容不仅能够更好地满足用户的需求&#xff0c;还能够加深用户的品牌体验&#xff0c;从而提高用户满意度和忠诚度。本文将深入探讨个性化内容在提升用户参与度和忠诚度方面的…

Incus:新一代容器与虚拟机编排管理引擎

Incus是什么&#xff1f; Incus是一个用于编排管理应用型容器、系统型容器及虚拟机实例的管理工具。它是对 Canonical LXD 的继承与发展&#xff0c;引入了更多的存储驱动支持。 Incus项目的产品地址&#xff1a;Linux Containers - Incus - Introduction 在 LXC-Incus 项目…

Java练习

这个练习我用到了继承&#xff0c;多态和封装。 1.继承&#xff1a; Animal 类是一个抽象类&#xff0c;它有两个子类 Dog 和 Cat。 Dog 和 Cat 分别继承自 Animal 类&#xff0c;因此它们可以使用 Animal 类中定义的属性和方法&#xff0c;同时也可以有自己特有的属性和方法。…

鸿蒙OS元服务开发:【(Stage模型)学习窗口沉浸式能力】

一、体验窗口沉浸式能力说明 在看视频、玩游戏等场景下&#xff0c;用户往往希望隐藏状态栏、导航栏等不必要的系统窗口&#xff0c;从而获得更佳的沉浸式体验。此时可以借助窗口沉浸式能力&#xff08;窗口沉浸式能力都是针对应用主窗口而言的&#xff09;&#xff0c;达到预…

基于springboot+vue+Mysql的教学视频点播系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

pymc,一个灵活的的 Python 概率编程库!

目录 前言 安装与配置 概率模型 贝叶斯推断 概率分布 蒙特卡罗采样 贝叶斯网络 实例分析 PyMC库的应用场景 1. 概率建模 2. 时间序列分析 3. 模式识别 总结 前言 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - pymc Github地址&#xff1a;https://gith…

黄金票据攻击

黄金票据攻击——域内横向移动技术 一、黄金票据攻击介绍&#xff1a; 黄金票据攻击是一种滥用Kerberos身份认证协议的攻击方式&#xff0c;它允许攻击者伪造域控krbtgt用户的TGT&#xff08;Ticket-Granting Ticket&#xff09;。通过这种方法&#xff0c;攻击者可以生成有效…

怎么禁止特定程序运行

计算机已经成为了人们日常生活和工作中不可或缺的工具。 然而&#xff0c;随着计算机应用的广泛化&#xff0c;如何管理和控制计算机上的程序运行也成为了一个亟待解决的问题。 特别是在企业、学校或一些需要严格控制计算机使用环境的场所。 为什么要禁止特定程序运行&#x…

Catcatcat【杂项 攻防世界】

知识点&#xff1a; strings 命令 打印文件中可以打印的字符&#xff0c;可以是任意文件grep flag 过滤出文件中的flag关键字rabbit加密 深入了解Rabbit加密技术&#xff1a;原理、实现与应用-CSDN博客对称加密算法需要密钥&#xff0c;也可不设置数据开头固定&#xff1a;U2F…

6.8物联网RK3399项目开发实录-驱动开发之RTC实时时钟的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f RTC 使用 简介 AIO-3399J 开发板上有 一个集成于 RK808 上的RTC(Real Time Clock)&#xff0c;主要功能有时钟&#xff0c…

【OpenCV-颜色空间】

OpenCV-颜色空间 ■ RGB■ BGR■ HSV■ HSL■ HUE■ YUV ■ RGB ■ BGR BGR 就是RGB R和B调换位置。 OpenCV 默认使用BGR ■ HSV ■ HSL ■ HUE ■ YUV