🌈 赏金任务发布 2023-01-09

赏金任务每周更新,请持续关注哦

活动时间

  • 2023年1月9日 - 2023年1月13日24:00

活动奖品

  • 100元京东购物卡

本周任务

  • 任务: 面试题问答

  • 题目: Selenium 的工作原理是什么?

  • 参与方式:本帖下方回复你的答案即可

本问题参与赏金活动,详情点击 🌈 赏金活动上线啦 丨做赏金任务挑战千元奖金 查看活动介绍

XHY{SB~WI)(V8LTWX}Z7MG(1)
Selenium将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),所以就像真正的用户在操作一样。
webdriver是按照server–client的经典设计模式设计的:
server端就是remote server,可以是任意的浏览器:我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待client发送请求并做出相应;
client端简单说来就是我们的测试代码中的一些行为,比如打开浏览器,转跳到特定的url等操作是以http请求的方式发送给被server端(也就是被测浏览器)server接受请求,并执行相应操作,并在response中返回执行状态、返回值等信息;
Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。

  • 第一步selenium client(python语言编写的自动化测试脚本)初始化一个service服务,通过Webdriver启动浏览器驱动程序chromedriver.exe
  • 第二步通过RemoteWebDriver向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id
  • 第三步打开浏览器,绑定特定的端口,把启动后的浏览器作为webdriver的remote server
  • 第四步打开浏览器后,所有的selenium的操作(访问地址,查找元素等)均通过RemoteConnection链接到remote server,然后使用execute方法调用_request方法通过urlib3向remote server发送请求
  • 第五步浏览器通过请求的内容执行对应动作
  • 把执行的动作结果通过浏览器驱动程序返回给测试脚本


selenium工作原理:

  • 测试脚本,可以是python,java编写的脚本程序(也可以叫做client端)
  • 浏览器驱动, 这个驱动是根据不同的浏览器开发的,不同的浏览器使用不同的webdriver驱动程序且需要对应相应的浏览器版本。
  • 浏览器,目前selenium支持市面上大多数浏览器,如:火狐,谷歌,IE等

我们使用Selenium实现自动化测试,主要需要3个东西

1.测试脚本,可以是python,java编写的脚本程序(也可以叫做client端)

2.浏览器驱动, 这个驱动是根据不同的浏览器开发的,不同的浏览器使用不同的webdriver驱动程序且需要对应相应的浏览器版本,比如:geckodriver.exe(chrome)
我们可以把WebDriver驱动浏览器类比成出租车司机开出租车。
在开出租车时有三个角色:

**乘客:**他/她告诉出租车司机去哪里,大概怎么走

**出租车司机:**他按照乘客的要求来操控出租车

**出租车:**出租车按照司机的操控完成真正的行驶,把乘客送到目的地
image

selenium原理

3.浏览器,目前selenium支持市面上大多数浏览器,如:火狐,谷歌,IE等

selenium脚本

先看一个简单的代码

from selenium import webdriver dr = webdriver.Chrome() # 打开浏览器

执行上述代码,我们会发现程序打开了Chrome浏览器

前提:你已经正确配置了chrome的驱动和对应版本, 下载的浏览器驱动放到python的根目录下,便于程序在执行驱动的时候查找(因为你安装python软件时配置过环境变量

那么selenium是如何实现这个过程的呢?通过下图理解selenium的工作原理

image

用Selenium实现自动化,主要需要三个东西:

1.自动化测试代码:自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动,IE驱动)

2.浏览器驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器

3.浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。

测试代码中包含了各种期望的对浏览器界面的操作,例如点击。测试代码通过给Webdriver发送指令,让Webdriver知道想要做的操作,而Webdriver根据这些操作在浏览器界面上进行控制,由此测试代码达到了在浏览器界面上操作的目的。

Selenium脚本执行时后端实现的流程:

1.对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动
2.浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
3.HTTP Server接收到请求后根据请求来具体操控对应的浏览器
4.浏览器执行具体的测试步骤
5.浏览器将步骤执行结果返回给HTTP Server
6.HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息。

WebDriver基于的协议:JSON Wire protocol

JSON Wire protocol是在http协议基础上,对http请求及响应的body部分的数据的进一步规范。body部分主要传送具体的数据,在WebDriver中这些数据都是以JSON的形式存在并进行传送的,这就是JSON Wire protocol。所以在Client和Server之间,只要是基于JSON Wire Protocol来传递数据,就与具体的脚本语言无关了,这样同一个浏览器的驱动就即可以处理Java语言的脚本,也可以处理Python语言的脚本了。

1 Like

Selenium工作的过程中有三个角色,

其一便是跟我们最近的自动化测试代码:自动化测试代码发送请求给浏览器的驱动;

其二便是浏览器的驱动:每个浏览器都有自己的驱动,均以exe文件形式存在,比如谷歌的chromedriver.exe、火狐的geckodriver.exe、IE的IEDriverServer.exe,它来解析这些自动化测试的代码,解析后把它们发送给浏览器;

其三便是浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。

image

  1. 开始执行测试时,测试用例会作为Client端,用例调用 Selenium 库的API, 完成对浏览器驱动的启动,此是驱动会开通一个端口,用来接收请求
  2. 当浏览器驱动Driver 接收到客户端Client的请求,会将请求通过另一端口实现转发,转发给浏览器,执行相应的指令
  3. 浏览器执行完成相应指令,会将结果返回给浏览器驱动,浏览器驱动最终将结果返回给Client。
  4. 客户端在向浏览器驱动发送请求的时候遵循了一个协议 WebDriver WireProtocal

image

关闭