软件测试面试真题 | Selenium 的工作原理是什么?

news2024/11/19 9:34:57

搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核

Selenium 通常被我们用做测试web的自动化测试工具,其实 Selenium 不仅仅是个API,它是一组工具集合,它是由三大组件组成

  • WebDriver: 可以模拟真正的用户去操作浏览器页面,主要是通过控制浏览器厂商提供的 driver 来控制浏览器
  • Selenium IDE: 是安装在浏览器上一个扩展工具,可以将操作浏览器的过程录制下来,可以导出不同的语言,不同的框架格式
  • Selenium Grid: 可以在不同电脑上执行测试用例,实现分布式并发执行测试用例的效果。

Web自动化测试的意义

通常我们所说的 Web 自动化测试,就是使用 Selenium WebDriver 来对浏览器进行自动化控制。可以调用 Selenium API 操作浏览器,解放人力成本(比如,打开一个 baidu.com,然后找到搜索框,输入搜索内容,验证结果等一连串的用户行为),它的意义体现在如下几个方面:

  • 回归测试

  • 可以执行手工测试很难实现或者很耗时的测试工作,比如并发测试、压力测试

  • 能够更好的利用资源,节省时间和人力成本

Selenium 工作原理

如图所示,Selenium 实现自动化测试,主要由三部分在工作:

  • 客户端脚本(Client)

  • 浏览器驱动(Driver)

  • 浏览器(Browser)

  1. 开始执行测试时,测试用例会作为 Client 端,Selenium 启动浏览器,后台会同时启动一个 Selenium 的 Remote Server 绑定到浏览器上,RemoteServer 是用来监听代码端 (Client) 发来的操作请求

  2. 当代码发送一个 http request 请求给 Server,Server 会解析这个请求,然后转发给 webdriver,由 webdriver 来实际驱动浏览器执行操作(webdriver 就是不同的浏览器厂商提供的不同的 driver 驱动)

  3. webdriver 操作完浏览器的执行结果,会返回给 server ,最终结果返回给 client 端

这是一套完整的流程,所以搭建测试环境的时候,一定要先下载【浏览器对应】的 WebDriver。

为什么能够支持多种浏览器?

  • Selenium WebDriver 是典型的 Server-Client 模式,Server 端就是 Remote Server

  • 浏览器的厂商们给我们提供叫做 driver 的中间件, 通过编写脚本,去给这个中间件发送请求(遵循WebDriver Wire 协议 )实现对浏览器的控制

举个例子,比如约定的协议 /session/{session id}/element 是查找元素, /session/{session id}/element/{element id}/click 是点击元素

  • 通过这个中间件可以直接驱动浏览器执行各种操作,比如点击,滑动, 输入,下拉等等。

  • 通过这个中间件,我们可以控制浏览器

我们可以通过写脚本,去给这个中间件(chrome - chromedrive , firefox-geckodriver)发送请求,那这个请求是如何发送的呢?遵循一个特定的协议进行通讯,

举个例子,提前约定好一个协议 ,你发给我的请求遵循一个特定的协议格式 ,比如约定的协议 /session/{sessionid}/find 就是查找元素,/click 就是点击元素,(这个协议就是 Webdriver 协议)

代码演示

可以通过代码看一下具体工作过程

  • 第一步:下载对应的 chromedriver 并配置环境变量

  • 第二步:打印 DEBUG 级别的日志

  • 第三步:创建 driver

  • 第四步:打开浏览器

  • 第五步:driver.quit()退出操作

代码:

# 创建文件 demo.py   ****不要创建以test_开头*****

from selenium import webdriver

import logging

logging.basicConfig(level=logging.DEBUG)  # 打印源码中的日志

driver = webdriver.Chrome() # 打开浏览器

driver.get("https://www.ceshiren.com") # 访问 测试人论坛

结果:

1. DeprecationWarning: executable_path has been deprecated, please pass in a Service object

  driver = webdriver.Chrome(executable_path="D:\\mydriver\\chromedriver.exe") # 打开浏览器

2. DEBUG:selenium.webdriver.remote.remote_connection:POST http://localhost:53116/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "pageLoadStrategy": "normal", "goog:chromeOptions": {"extensions": [], "args": []}}}}

3. DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): localhost:53116

4. DEBUG:urllib3.connectionpool:http://localhost:53116 "POST /session HTTP/1.1" 200 788

5. DEBUG:selenium.webdriver.remote.remote_connection:Remote response: status=200 | data={"value":{"capabilities":{"acceptInsecureCerts":false,"browserName":"chrome","browserVersion":"106.0.5249.119","chrome":{"chromedriverVersion":"106.0.5249.61 (511755355844955cd3e264779baf0dd38212a4d0-refs/branch-heads/5249@{#569})","userDataDir":"C:\\Users\\xixi\\AppData\\Local\\Temp\\scoped_dir9520_379661371"},"goog:chromeOptions":{"debuggerAddress":"localhost:53119"},"networkConnectionEnabled":false,"pageLoadStrategy":"normal","platformName":"windows","proxy":{},"setWindowRect":true,"strictFileInteractability":false,"timeouts":{"implicit":0,"pageLoad":300000,"script":30000},"unhandledPromptBehavior":"dismiss and notify","webauthn:extension:credBlob":true,"webauthn:extension:largeBlob":true,"webauthn:virtualAuthenticators":true},"sessionId":"fea574de37447a010cc20ab992cb9ce9"}} | headers=HTTPHeaderDict({'Content-Length': '788', 'Content-Type': 'application/json; charset=utf-8', 'cache-control': 'no-cache'})

6. DEBUG:selenium.webdriver.remote.remote_connection:Finished Request

7. DEBUG:selenium.webdriver.remote.remote_connection:POST http://localhost:53116/session/fea574de37447a010cc20ab992cb9ce9/url {"url": "https://www.ceshiren.com"}

8. DEBUG:urllib3.connectionpool:http://localhost:53116 "POST /session/fea574de37447a010cc20ab992cb9ce9/url HTTP/1.1" 200 14

9. DEBUG:selenium.webdriver.remote.remote_connection:Remote response: status=200 | data={"value":null} | headers=HTTPHeaderDict({'Content-Length': '14', 'Content-Type': 'application/json; charset=utf-8', 'cache-control': 'no-cache'})

10. DEBUG:selenium.webdriver.remote.remote_connection:Finished Request

日志解析

  • DEBUG:selenium.webdriver.remote.remote_connection: 开始请求的标识

  • Finished Request 是一次请求结束的标识

  • 首先,第二行发送 POST 请求,带着参数,创建一个http 连接,第五行得到响应状态码为200,并得到响应对象,第六行结束第一次请求

  • 然后,第七行,发送一个post请求,打开网址,第9行,得到响应状态码200,以及响应数据,第10行结束第二次请求

模拟Selenium 底层请求过程

import requests

# 请求地址(打开浏览器)

driver_url = 'http://127.0.0.1:53119/session'

# 打开浏览器的请求参数

driver_value = {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}}

# 发送求清

response_session = requests.post(driver_url, json = driver_value)

result = response_session.json()

sessionId = result['value']['sessionId']

print(f"sessionId ===>> {sessionId}")

# 访问 [测试人论坛]请求地址

url = 'http://127.0.0.1:53119/session/'+sessionId+'/url'

# # 访问我的博客的请求参数

value = {"url": "https://www.ceshiren.com"}

response1 = requests.post(url = url,json = value)

print(response1)
  • 首先模拟发送一个 http 请求,请求 session 对象

  • 从结果中解析出 sessionid

  • 再使用这个 sessionid 发送一个请求,打开页面,得到响应结果

  • 其它操作也是一样(参考w3c webdriver协议)

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

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

相关文章

机械转码日记【24】继承

目录 前言 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 4.1构造函数 5.设计一个不能被继承的类 6.继承与…

瑞吉外卖(三) 分类管理

瑞吉外卖 分类管理瑞吉外卖 分类管理 需求分析自动填充 代码思想ThreadLocal 的 引入瑞吉外卖 分类管理 需求分析 对于当前的多个Model,存在了多个相同的字段 比如说:更新时间,创建时间, 更新人等 这些重复的业务可以通过统一的接…

已有项目eclipse开发配置步骤

已有项目eclipse开发配置步骤 前提:jdk8安装、tomcat8安装 1、eclipse打开已有项目 File->import->Existing Projects into Workspace 说明:我这里已经打开项目了 2、配置Properties 项目根目录右击->点击Properties Java Build Path -&…

【僵尸进程和文件系统调用】

目录虚拟空间物理空间僵尸进程僵尸进程产生僵尸进程的解决孤儿进程文件系统调用虚拟空间物理空间 内存与磁盘的运行速度1:20 x86 32位 4G–> 物理内存:寻址能力4G 4G供内核1G,用户态的3G, 虚拟空间4G,虚拟空间可以…

周阳老师JUC并发编程

1. 序章 1)JUC是什么? java.util.concurrent在并发编程中使用的工具包 对JUC知识的高阶内容讲解和实战增强 2)为什么学习并用好多线程极其重要? 硬件方面: 摩尔定律: 它是由英特尔创始人之一Gordon Moore(戈登摩尔…

Linux 下编译实现C/Fortran调用动态库

目录 FORTRAN语言 生成动态库Demo 查看动态库中的函数 Fortran语言 FORTRAN语言是Formula Translation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。 FORTRAN语言是…

样式补充(精灵图、背景图片、阴影),项目前置认知、结构搭建

一、网页制作 根目录 图片文件夹&#xff1a;images 样式文件夹&#xff1a;CSS 首页&#xff1a;index.html <link rel"stylesheet" href"./CSS/index.css"> 二、项目样式补充 1. 精灵图 场景&#xff1a;项目中将多张小图片&#xff0c;合并…

基于粒子群算法训练常规自动编码器附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

docker安装mysql,tomcat,redis,nginx

docker安装常用应用安装mysql解决docker mysql5.7中文乱码的问题开启防火墙指定端口docker MySQL容器被删除后数据恢复docker 配置MySQL主从创建master创建slave配置主从测试安装tomcat安装redis安装nginx安装mysql docker安装之前&#xff0c;需要查看宿主机上是否已安装&…

基于matlab仿真多普勒效应及其影响(附源码)

目录 一、介绍 二、估计直升机的叶片速度 三、直升机回声模拟 四、叶片返回微多普勒分析 五、汽车雷达中的行人识别 六、行人微多普勒提取 七、总结 八、程序 本例介绍了由于目标旋转而对目标进行雷达回波时微多普勒效应的基本概念。可以使用微多普勒特征来帮助识别目标…

UE4 回合游戏项目 16- 控制玩家

在上一节&#xff08;UE4 回合游戏项目 15- 生成玩家、控制玩家&#xff09;基础上&#xff0c;继续完善控制玩家的步骤 步骤&#xff1a; 1.打开1lantu&#xff0c;将Alpha的值设为1&#xff0c;这样玩家控制的角色会随着鼠标的移动而产生一个偏头的效果 2.接下来给角色添加…

java设计模式之原型模式

一&#xff1a;原型模式 1.什么是原型模式? 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 基本介绍 1.原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0…

STM32CubeMX学习笔记(47)——USB接口使用(MSC基于内部Flash模拟U盘)

一、USB简介 USB&#xff08;Universal Serial BUS&#xff09;通用串行总线&#xff0c;是一个外部总线标准&#xff0c;用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、…

数据库知识之图的创建以及各种遍历、生成树的形成

利用邻接矩阵创建图并打印输出利用递归完成dfs算法遍历利用非递归完成bfs算法遍历利用prim算法得出最小生成树利用kruskal算法得出最小生成树 #include <iostream> #include <cstdlib>//包含一些特定函数 #include <string> //邻接矩阵结构存储图 #defin…

量子计算(六):量子计算软件介绍

文章目录 量子计算软件介绍 一、量子语言 二、量子软件开发包 三、量子云平台 量子计算软件介绍 一、量子语言 由于当前量子计算机的通用体系架构未得到统一&#xff0c;在硬件层面上的技术路线也未最终确定&#xff0c;所以目前还无法确定哪种量子机器指令集相对更科学、…

2010年408大题总结

2010年408大题第41题第42题第43题第44题第45题第46题第47题第41题 这个考的是散列表&#xff08;巧了&#xff0c;我没复习&#xff0c;这就去看&#xff09; 第一个要记住的是装填因子&#xff0c;关键字个数/装填因子 数组长度 第二个是线性探测再散列&#xff0c;表示如果当…

Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)

觉得有帮助请点赞关注收藏~~~ 一、反编译 编译是把代码编译为程序&#xff0c;反编译是把程序破解为代码。 下面介绍反编译的完整过程 首先准备反编译的三个工具&#xff0c;分别是apktool&#xff0c;dex2jar&#xff0c;jd-gui 注意下载它们的最新版本 apktool 对APK文件解…

ASEMI整流桥UD6KB100,UD6KB100尺寸,UD6KB100特征

编辑-Z ASEMI整流桥UD6KB100参数&#xff1a; 型号&#xff1a;UD6KB100 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1000V RMS反向电压VR(RMS)&#xff1a;700 平均整流输出电流&#xff08;IO&#xff09;&#xff1a;6A 峰值正向浪涌电流&#xff…

imx6ull内置温度传感器实践1:输出一个采样

前言 先写代码&#xff0c;然后再一个问题&#xff0c;一个问题分析。不是应该先分析问题&#xff0c;再写代码吗&#xff1f;因为笨呗。分析不明白。只有看到现象&#xff0c;才能明白手册上说的是啥意思。 实例1 主要完成以下几个事情 1 创建一个misc驱动 2 在驱动中将寄存…

【HDU No. 1232】 畅通工程

【HDU No. 1232】 畅通工程 杭电OJ 题目地址 【题意】 现有城镇道路统计表&#xff0c;表中列出了每条直接相连的城镇道路。“畅通工程”的目标是使全省任意两个城镇间都可以通过道路连接&#xff08;间接通过路连接也可以&#xff09;。问最少还需要建设多少条道路&#xff…