Selenium工作流程


Selenium工作原理

客户端和服务端之间实际是通过http协议进行通信,服务端的接口文档可参考:

https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelement

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

selenium实际已封装好各种操作接口的请求函数,用户只需通过指定的方法传入数据即可。

如get、click、find_element实际都是封装了整个http请求过程的方法。

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

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

从源码角度剖析Selenium原理

说明

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

通过Selenium实现工作流

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

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/sessionId/element/sessionId/element/id/value(sessionId为会话id,从①中获取,id为元素id,从③获取)

请求数据:

{"value": ["selenium"]}

⑤ ele.click()

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

请求方式:POST

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

请求数据:无

通过requests模块实操验证

代码实现

 # 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"]    # 返回会话idsleep(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)

运行结果

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!喜欢软件测试的小伙伴们,可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

新鲜角度看问题:从Python角度解析Selenium原理相关推荐

  1. python julia_从Julia角度看机器学习的python经验

    python julia I recently went through some machine learning training with Python, and wanted to refle ...

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

    1.selenium工作流程 2.selenium工作原理(1)客户端和服务端之间实际是通过http协议进行通信,服务端的接口文档可参考: https://github.com/SeleniumHQ/ ...

  3. [Python]ConfigParser解析配置文件

    近期发现非常多接口配置都硬编码在souce file中了,于是就看了下python怎么解析配置文件,重构下这一块. 这个应该是早就要作的... 配置文件: [mysqld] user = mysql ...

  4. go conn 读取byte数组后是否要_【技术推荐】正向角度看Go逆向

    Go语言具有开发效率高,运行速度快,跨平台等优点,因此正越来越多的被攻击者所使用,其生成的是可直接运行的二进制文件,因此对它的分析类似于普通C语言可执行文件分析,但是又有所不同,本文将会使用正向与逆向 ...

  5. 2015年《大数据》高被引论文Top10文章No.2——大数据时代的数据挖掘 —— 从应用的角度看大数据挖掘(下)...

    2015年<大数据>高被引论文Top10文章展示 [编者按]本刊将把2015年<大数据>高被引论文Top10的文章陆续发布,欢迎大家关注!本文为高被引Top10论文的No.2, ...

  6. 【2015年第4期】大数据时代的数据挖掘 —— 从应用的角度看大数据挖掘(下)...

    大数据时代的数据挖掘 -- 从应用的角度看大数据挖掘(下) 李 涛1,2,曾春秋1,2,周武柏1,2,周绮凤3,郑 理1,2 1. 南京邮电大学计算机学院 南京 210023:2. 美国佛罗里达国际大 ...

  7. 【技术推荐】正向角度看Go逆向

    Go语言具有开发效率高,运行速度快,跨平台等优点,因此正越来越多的被攻击者所使用,其生成的是可直接运行的二进制文件,因此对它的分析类似于普通C语言可执行文件分析,但是又有所不同,本文将会使用正向与逆向 ...

  8. 2021北大软微计算机考研感想——从另一角度看考研

    2021北大软微考研感想--从另一角度看考研 其实这篇经验帖的主体内容是我在初试备考期间就已经写好了的,拟录取结果出来后做了一些必要的修改和整理,主要是纠结于什么该说.什么不该说,尽可能地消除一些主观 ...

  9. 从软件工程角度看大前端技术栈

    从软件工程角度看大前端技术栈 优秀人才不缺工作机会,只缺适合自己的好机会.但是他们往往没有精力从海量机会中找到最适合的那个. 100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「 ...

最新文章

  1. 魔改ResNet反超Transformer再掀架构之争!作者说“没一处是创新”,这些优化trick值得学...
  2. Webkit Flex伸缩盒模型属性备忘
  3. 一个基于docker的bedrock minecraft PE 服务器
  4. BUUCTF(pwn)bjdctf_2020_babystack2
  5. c++ string 与 char 互转 以及base64
  6. CSocket文件传输 分段传输的关键代码
  7. 银屑病相关饮食调研-毛蕊花的药用部位没查清-还需更新
  8. 你买过假芯片吗?元器件专家为您揭秘假冒芯片的套路!
  9. K-D Tree学习笔记
  10. 如何选择适合自己的CMS建站系统
  11. 为什么HashMap会产生死循环?
  12. 将整个表单设置为只读_如何将Git的界面语言设置为中文?
  13. 医学AI又一突破,微软开源生物医学NLP基准:BLURB
  14. C语言控制台窗口图形界面编程(八):鼠标事件
  15. 安装nginx make install 报错/usr/include/fastdfs/fdfs_define.h:15:27: fatal error: common_define.h: No su
  16. Origin打断图像的y坐标和在柱状图上显示数字
  17. linux系统下,我也用虚拟机——linux虚拟机随笔
  18. 数据结构实验报告:顺序表基本操作的实现
  19. web服务器和app服务器
  20. Transformer课程 第8课 NER案例模型训练及预测

热门文章

  1. python闭包的应用场景_Python闭包函数定义与用法分析
  2. java构建大根堆_构建大根堆
  3. gnu grub version 2.0.2设置启动顺序_如何修复grub异常
  4. python编程单词排序_Python编程20:字典的遍历和排序
  5. 台式电脑屏幕怎么调亮度_电脑屏幕亮度到底怎么调才最好?
  6. java 关闭中断_Raspberry pi使用中断方法关闭(关闭时出现垃圾代码)
  7. 步进电机的加速时间是怎么样的?
  8. C++程序员应该掌握的东西
  9. springboot 2.0 Redis command timed out的解决
  10. spring boot 使用 com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别