新鲜角度看问题:从Python角度解析Selenium原理

1965 篇文章 51 订阅
1221 篇文章 21 订阅

在这里插入图片描述

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/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/value(sessionId为会话id,从①中获取,id为元素id,从③获取)

请求数据:

{"value": ["selenium"]}

在这里插入图片描述

图片

图片

⑤ ele.click()

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

请求方式:POST

请求地址:http://localhost:post/session/ s e s s i o n I d / e l e m e n t / 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"]    # 返回会话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)

运行结果

在这里插入图片描述

在这里插入图片描述

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

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


好文推荐

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

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

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

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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值