selenium原理python_从python角度解析selenium原理

1、selenium工作流程

202111998_1_20200914103133849.png

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访问驱动程序

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

请求方式:POST

请求地址:http://localhost:post/session

请求数据:data = {"desiredCapabilities":{

"browserName": "chrome",

"version":"85.0.4183.83",

"platform":"WINDOWS"}

}

202111998_3_20200914103134412.png 

202111998_4_20200914103134552.png

202111998_5_20200914103134818.png② driver.get("http://www.baidu.com")通过execute方法,按get命令的接口信息构建http请求信息,并发送http请求:

请求方式:POST

请求地址:http://localhost:post/session/$sessionId/url(sessionId为会话id,从①中获取)

请求数据:{"url": "http://www.baidu.com"}

202111998_6_20200914103134990.png 

202111998_7_2020091410313599.png③ 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"}

202111998_8_20200914103135287.png 

202111998_9_20200914103135505.png 

202111998_10_20200914103135693.png④ ele.send_keys("selenium")通过execute方法,按send_keys命令的接口信息构建http请求信息,并发送http请求:

请求方式:POST

请求地址:http://localhost:post/session/$sessionId/element/$id/value(sessionId为会话id,从①中获取,id为元素id,从③获取)

请求数据:{"value": ["selenium"]}

202111998_11_20200914103135880.png 

202111998_12_2020091410313652.png 

202111998_13_20200914103136255.png⑤ ele.click()通过execute方法,按click命令的接口信息构建http请求信息,并发送http请求:

请求方式:POST

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

请求数据:无

202111998_14_20200914103136583.png 

202111998_15_20200914103136849.png 

202111998_16_2020091410313783.png

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

(1)代码实现1  1 # TODO 访问域名

2  2 base_url = "http://localhost:9515"

3  3

4  4 # TODO 创建会话

5  5 url = base_url   "/session"

6  6 data = {

7  7         "desiredCapabilities":{

8  8                 "browserName": "chrome",

9  9                 "version":"85.0.4183.83",

10 10                 "platform":"WINDOWS"

11 11         }

12 12 }

13 13 res = request("POST",url,json=data)

14 14 session_id = res.json()["sessionId"]    # 返回会话id

15 15

16 16 sleep(2)

17 17

18 18 # TODO 发送get命令 - 访问某个网站

19 19 url = base_url   "/session/{}/url".format(session_id)

20 20 data = {

21 21     "url": "http://www.baidu.com"

22 22 }

23 23 res = request("POST",url,json=data)

24 24

25 25 # TODO 发送find_element命令 - 查找元素

26 26 url = base_url   "/session/{}/element".format(session_id)

27 27 data = {

28 28     "using":"id",

29 29     "value":"kw"

30 30 }

31 31 res = request("POST",url,json=data)

32 32 ele = jsonpath(res.json(),"$..ELEMENT")[0]      # 返回元素id

33 33

34 34 # TODO 发送send_keys命令 - 输入内容

35 35 url = base_url   "/session/{}/element/{}/value".format(session_id,ele)

36 36 data = {

37 37     "value": ["selenium"]

38 38 }

39 39 res = request("POST",url,json=data)

40 40

41 41 # TODO 发送find_element命令 - 查找元素

42 42 url = base_url   "/session/{}/element".format(session_id)

43 43 data = {

44 44     "using":"id",

45 45     "value":"su"

46 46 }

47 47 res = request("POST",url,json=data)

48 48 ele = jsonpath(res.json(),"$..ELEMENT")[0]      # 返回元素id

49 49

50 50 # TODO 发送click命令 - 元素点击

51 51 url = base_url   "/session/{}/element/{}/click".format(session_id,ele)

52 52 res = request("POST",url)

(2)运行结果

202111998_17_20200914103137287.png 来源:https://www.icode9.com/content-1-736251.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter(二)Jmeter目录介绍

看过许多有关Jmeter的博客,算得上的收获颇丰;不过最牛逼的博客还是“官方文档”,官方文档是ApacheJmeter自己对自己产品的说明,论起对自己产品的理解程度,那肯定是自己嘛。。。因此推荐大家从Jmeter的官方文档开始学习…

使用Spring Data MongoDB和Spring Boot进行数据聚合

MongoDB聚合框架旨在对文档进行分组并将其转换为聚合结果。 聚合查询包括定义将在管道中执行的几个阶段。 如果您对有关该框架的更深入的细节感兴趣,那么 mongodb docs是一个很好的起点。 这篇文章的重点是编写一个用于查询mongodb的Web应用程序,以便从…

结合前段修改mysql表数据_jquery实现点击文字可编辑并修改保存至数据库

这个方法网上可以查到很多,但是好多只有点击文字编辑并保持,但是没有完整的代码写怎么保存到数据库。因为本人才疏学浅,费啦好长时间才写好把修改的内容只用一条sql语句保存到数据库,今天在这里和大家分享这是运行图片这是前台页面…

关于类、抽象类和接口的继承关系

关于类、抽象类和接口的继承关系 Java类的继承是单继承的,就是一个类只能继承一个类,但是可以通过接口来实现多继承,一个类可以实现多个接口。通过这种方式,Java类就可以实现多继承的关系。但是在继承类和实现接口的时候&#xff…

js符号转码_JS 文字符串转换unicode编码函数

AJAX传递中文字符串时必须把中文字符串编码成unicode,一般会用到JS的自带函数escape().不过找到了更好的函数来确决中文字符转换成unicode编码的函数function uniencode(text){text escape(text.toString()).replace(/\/g, "%2B");var matches text.match(/(%([0-9…

ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作

ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程。 1、创建项目 选择“文件” > “新建” > “项目”。 在“添加新项目”对话框中,在“已安装” “Visaul C#” “Web” 项目类型窗格中选择“ASP.NET Core Web 应用…

jsf集成spring_Spring和JSF集成:国际化和本地化

jsf集成spring如果您正在开发针对多种语言的JSF应用程序&#xff0c;那么您可能很熟悉<f&#xff1a;loadBundle>标记。 即使您的应用程序不支持使用消息捆绑包进行国际化仍然是一个好主意。 在<f&#xff1a;loadBundle>标签的作用下&#xff0c;它从Java java.ut…

java 设置两个方法互斥_分享两个操作Java枚举的实用方法

1. 前言Java枚举在开发中是非常实用的。今天再来分析几个小技巧并且回答一些同学的的疑问。首先要说明的是我的枚举建立在以下的范式之中&#xff1a;枚举统一接口范式2. 如何把枚举值绑定的下拉列表这种场景非常常见&#xff0c;如果你把状态、类别等属性封装成枚举的结构&…

微信小程序正确的异步request请求,根据经纬度获取地理位置信息

微信小程序的所有request请求都是异步的&#xff0c;不支持同步。但是在请求时可能会耗费一定时间&#xff0c;这样的话在获取返回数据时可能方法还没有执行完就已经进行赋值操作了。我遇到的就是拿到的数据为undefined。 解决办法&#xff0c;使用回调函数&#xff0c;等操作完…

Spring管理的交易说明-第2部分(JPA)

在本系列的第一部分中 &#xff0c;我展示了事务如何在普通JDBC中工作 。 然后&#xff0c;我展示了Spring如何管理基于JDBC的事务。 在本系列的第二部分中&#xff0c;我将首先展示事务如何在普通的JPA中工作。 然后展示Spring如何管理基于JPA的事务。 资金转移 为了帮助说明…

oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...

mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结1. MYSQL数据库1) 创建索引CREATE INDEX index_name ON table_name(column_list)CREATE UNIQUE INDEX index_name ON table_name(column_list)修改表的方式添加索引ALTER TABLE table_name ADD INDEX in…

CCC数字钥匙设计【BLE】--车主配对之BLE OOB配对

本文主要介绍CCC3.0采用BLE进行车主配对时&#xff0c;关于蓝牙OOB配对的内容。 首先&#xff0c;介绍下BLE Pairing的一些基础知识&#xff0c;有一些基本概念。之后&#xff0c;再着重介绍CCC规范定义的BLE OOB配对流程。 1、BLE Pairing基础知识 下面先简单介绍下BLE 5.0协…

mysql 重置密码模式_mysql--重置密码

解决Mysql忘记密码&#xff1a;1、首先停止正在运行的MySQL进程&#xff1a;[rootcml5 ~]# systemctl stop mysqld2、以安全模式启动MySQL&#xff1a;[rootcml5 ~]# /usr/local/mysql/bin/mysqld_safe--skip-grant-tables &##或者在my.cnf文件下添加&#xff0c;执行完后就…

Java EE 8中的MVC 1.0:使用Facelets入门

MVC 1.0是一个基于动作的Model-View-Controller Web框架&#xff0c;它将成为将来的Java EE 8的一部分。它将与基于组件的JSF框架并存&#xff0c;并提供构建面向HTML javascript的应用程序的替代方法完全控制网址。 这篇文章总结了使用Facelets代替默认的JSP作为MVC框架的视…

Linux 查看内存状态

# 查看系统内存 命令&#xff1a;free 注&#xff1a;默认k单位显示注&#xff1a;-m 以MB注&#xff1a;-g以GB 单位显示total used free shared buffers cached Mem: 497 463 33 0 13 124 -/ buffe…

python通用数据库连接_python连接数据库的几种方式!

# -*- coding: utf-8 -*-"""-------------------------------------------------File Name&#xff1a; Database.pyAuthor : LiSenDate&#xff1a; 2018/6/26 15:51:-------------------------------------------------"""database两个库&…

Altium Designer导入pcb原件之后都是绿的

转载于:https://www.cnblogs.com/chulin/p/8342041.html

中文文本校对源码java_文字校对应该怎么校对?

如果现在给你一篇纸质文档&#xff0c;老板让你把它做成电子版的&#xff0c;这应该不是啥难事&#xff0c;你做完之后要校验一下&#xff0c;于是你一边看纸质文档一边看电子文档很努力的校对&#xff0c;恩&#xff0c;好像没有什么问题。如果老板给你100篇这样的文档&#x…

EL表达式的11隐含对象

EL表达式在不同范围如何取值&#xff1a; <%pageContext.setAttribute("book", "红楼梦");request.setAttribute("book", "水浒传");session.setAttribute("book", "三国演义");application.setAttribute(&quo…

在JConsole和VisualVM中查看DiagnosticCommandMBean

我已经将JConsole用作合适的通用JMX客户端已有很多年了。 该工具通常随Oracle JDK一起提供&#xff0c;并且易于使用。 在JMX交互方面&#xff0c;JConsole优于VisualVM的最大优点是JConsole带有内置的MBeans选项卡&#xff0c;而必须为VisualVM中的相同功能应用插件。 但是&am…