软件测试框架实战:Python+Slenium搭建Web自动化测试框架全教程

Python+Selenium是一种流行的Web自动化测试框架,可以模拟真实的用户操作,对网页进行功能和样式的验证。要通过selenium测试网页,需要以下几个步骤:

  1. 安装selenium库和浏览器驱动 。
  2. 使用selenium提供的方法来控制浏览器窗口大小、后退、前进等。
  3. 使用selenium提供的方法来定位和操作页面元素,如点击、输入、获取属性等。
  4. 使用单元测试、日志系统、数据库等其他软件来配合selenium进行数据驱动的测试和POM设计模式。

一、selenium库和驱动的安装方法

使用pip命令安装selenium库。例如,可以在命令行输入

pip install selenium

或者

pip3 install selenium

下载和安装浏览器驱动程序。例如,如果我们使用的是Chrome浏览器,你可以从官网下载对应版本的chromedriver,并将其放在python的安装路径下

二、通过selenium控制浏览器的具体执行方法

导入selenium的webdriver模块。

from selenium import webdriver

创建一个webdriver对象,指定要使用的浏览器来打开Chrome浏览器。并使用webdriver对象的方法来操作浏览器。

web = webdriver.Chrome()

访问一个网址

web.get(url)

后退一步

web.back()

案例1:selenium控制浏览器

假设我们要用selenium控制Chrome浏览器,打开百度网站,输入关键词并搜索,然后关闭浏览器。可以参考以下代码:

#导入selenium的webdriver模块
from selenium import webdriver#创建一个webdriver对象,指定使用Chrome浏览器
web = webdriver.Chrome()#访问百度网站
web.get('https://www.baidu.com/')#找到搜索框元素,并输入关键词
search_box = web.find_element_by_id('kw')
search_box.send_keys('selenium')#找到搜索按钮元素,并点击
search_button = web.find_element_by_id('su')
search_button.click()#关闭浏览器
web.quit()

三、Selenium如何定位和操作页面元素

selenium可以使用多种方法来定位和操作页面元素,比如id、name、类名、css选择器、链接文本、标签名、xpath等。你可以根据元素的属性或者位置来选择合适的方法。

案例2:页面定位

比如,如果你要定位百度首页的搜索框:

#通过id定位
search_box = web.find_element_by_id('kw')
#通过name定位
search_box = web.find_element_by_name('wd')
#通过css选择器定位
search_box = web.find_element_by_css_selector('#kw')

如果我们需要操作页面元素,比如输入文本或者点击按钮,可以使用以下代码:

#在搜索框中输入文本
search_box.send_keys('selenium')
#找到搜索按钮并点击
search_button = web.find_element_by_id('su')
search_button.click()

案例3:Selenium操作下拉框

如果我们需要处理select标签的下拉框,我们可以使用selenium提供的select模块,它有三种方法来选择下拉框中的选项:根据索引、值或者文本属性

例如,我们要选择下面这个下拉框中的“北京”选项:

<select id="city"><option value="sh">上海</option><option value="bj">北京</option><option value="gz">广州</option>
</select>

可以使用以下代码:

#导入select模块
from selenium.webdriver.support.select import Select
#定位到下拉框元素
city = web.find_element_by_id('city')
#创建Select对象
select = Select(city)
#根据索引选择第二个选项(索引从0开始)
select.select_by_index(1)
#或者根据值选择'bj'选项
select.select_by_value('bj')
#或者根据文本属性选择'北京'选项
select.select_by_visible_text('北京')

如果我们要处理的下拉框,非select标签的下拉框,比如ul-li标签的下拉框,你可以通过模拟鼠标点击的方式实现操作。比如,选择下面这个下拉框中的“Python”选项:

<div class="dropdown"><button class="btn btn-default dropdown-toggle" type="button" id="menu1" data-toggle="dropdown">编程语言<span class="caret"></span></button><ul class="dropdown-menu" role="menu" aria-labelledby="menu1"><li role="presentation"><a role="menuitem" tabindex="-1" href="#">Java</a></li><li role="presentation"><a role="menuitem" tabindex="-1" href="#">Python</a></li><li role="presentation"><a role="menuitem" tabindex="-1" href="#">C++</a></li></ul>
</div>

可以使用以下代码实现:

//定位到按钮元素并点击展开下拉框
WebElement button = driver.findElement(By.id("menu1"));
button.click();
//定位到列表元素并获取所有子元素(即选项)
WebElement list = driver.findElement(By.className("dropdown-menu"));
List<WebElement> options = list.findElements(By.tagName("li"));
//遍历所有子元素,找到文本为'Python'的选项并点击
for (WebElement option : options) {if (option.getText().equals("Python")) {option.click();break;}
}

四、数据驱动测试和POM模式

使用单元测试、日志系统、数据库等其他软件来配合selenium进行数据驱动的测试和POM设计模式,具体需要以下几个步骤:

1、建立一个工程结构,将代码与数据分离,每个页面对应一个类。

  • 新建一个项目,每个页面对应一个包(package),每个包下面有一个__init__.py文件。
  • 在每个包下面创建一个类,封装页面元素和操作。
  • 在根目录下创建一个baseinfo文件夹,存放常量和配置信息。
  • 在根目录下创建一个testcase文件夹,存放测试用例。
  • 在根目录下创建一个report文件夹,存放测试报告。

2、使用unittest框架来组织和运行测试用例,使用setUp和tearDown方法来初始化和清理环境。

  • 使用unittest.main()函数,它会自动寻找当前模块中以test开头的测试方法并执行。
  • 使用TestSuite类,它可以将多个测试用例或者测试类添加到一个测试套件中,并使用TestRunner类来执行
  • 使用TestLoader类,它可以根据给定的模式或者目录来加载测试用例,并返回一个TestSuite对象
  • 使用discover()函数,它可以自动发现给定目录下的所有测试用例,并返回一个TestSuite对象。

3、使用POM设计模式来封装页面元素和操作,将页面对象作为参数传递给测试用例。

  • 创建一个页面类,继承object类,定义页面元素的定位器和操作方法。
  • 创建一个测试类,继承unittest.TestCase类,导入页面类,并在setUp方法中初始化浏览器驱动和页面对象。
  • 在测试方法中,调用页面对象的操作方法,并使用断言验证测试结果。
  • 在tearDown方法中,关闭浏览器驱动。

4、使用DDT或Yaml等工具来读取外部数据源,如数据库、Excel、CSV等,并使用装饰器或参数化方法来驱动测试用例。

使用DDT或Yaml等工具来读取外部数据源,使用装饰器或参数化方法来驱动测试用例,是一种数据驱动测试的方式,可以实现测试数据和用例代码的分离,方便后期维护。

以下是使用这种方式读取Excel数据的一般步骤:

  • 创建一个Excel文件,存放测试数据,每行对应一个测试场景,每列对应一个参数。
  • 创建一个读取Excel文件的类,使用openpyxl库或其他库来操作Excel文件,返回一个列表或字典类型的数据。
  • 创建一个测试类,继承unittest.TestCase类,并在类前面使用@ddt装饰器。
  • 在测试方法前面使用@data或@file_data装饰器,并传入读取Excel文件的类返回的数据。
  • 在测试方法中定义一个参数用来接收用例数据,并调用requests库或其他库发送请求,并使用断言验证响应结果。

DDT是一个数据驱动测试的装饰器,可以用来装饰测试方法,参数是文件名或列表。文件可以是json或yaml类型。如果文件是列表,列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。如果文件是字典,字典的key会作为测试用例方法的后缀显示,字典的value会作为测试用例参数。

Yaml是一种数据格式,类似txt,excel,json。它只有两种数据类型:map对象(键值对,冒号后需要有空格)和list列表对象(以-开头)。读取之后是一个不定长的字典形式。

案例4:DDT Yaml接口测试

下面是一个使用DDT和Yaml进行接口测试的代码示例:

import unittest
from ddt import ddt,data,file_data
import requests
import yaml@ddt
class TestApi(unittest.TestCase):@file_data('test_data.yml')def test_api(self,**kwargs):url = kwargs.get('url')method = kwargs.get('method')data = kwargs.get('data')expect = kwargs.get('expect')if method.lower() == 'get':res = requests.get(url,params=data)elif method.lower() == 'post':res = requests.post(url,data=data)else:res = Noneself.assertEqual(res.json(),expect)if __name__ == '__main__':unittest.main()

test_data.yml文件内容如下:

test_01:url: "http://httpbin.org/get"method: "get"data: {"name":"Tom","age":18}expect: {"args":{"age":"18","name":"Tom"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Host":"httpbin.org","User-Agent":"python-requests/2.26.0","X-Amzn-Trace-Id":"Root=1-61d7f9c8-6a9b0e8a4f7c3b6d5e0a4f7c"},"origin":"223.104.63.230","url":"http://httpbin.org/get?name=Tom&age=18"}
test_02:url: "http://httpbin.org/post"method: "post"data: {"username":"admin","password":123456}expect: {"args":{},"data":"","files":{},"form":{"password":"123456","username":"admin"}
​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

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

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

相关文章

【NeurIPS 2023】PromptIR: Prompting for All-in-One Blind Image Restoration

PromptIR: Prompting for All-in-One Blind Image Restoration&#xff0c; NeurIPS 2023 论文&#xff1a;https://arxiv.org/abs/2306.13090 代码&#xff1a;https://github.com/va1shn9v/promptir 解读&#xff1a;即插即用系列 | PromptIR&#xff1a;MBZUAI提出一种基…

非得让你会之MyBatis插件与Java动态代理

引言 咱们今天聊聊Java动态代理&#xff0c;这东西在开发中真的太常见了。比如Spring AOP、RPC&#xff0c;它们都离不开动态代理。然后&#xff0c;咱们再来说说MyBatis插件&#xff0c;这可是MyBatis框架中的一个超实用的功能&#xff0c;它就像是给MyBatis加了个“超能力”…

基于WebSocket实现客户聊天室

目录 一、实现聊天室原理 二、聊天室前端代码 三、聊天室后端代码&#xff08;重点&#xff09; 四、聊天室实现效果展示 一、实现聊天室原理 1.1 介绍websocket协议 websocket是一种通信协议&#xff0c;再通过websocket实现弹幕聊天室时候&#xff0c;实现原理是客户端首…

Unity Image - 镜像

1、为什么要使用镜像 在游戏开发过程中&#xff0c;我们经常会为了节省 美术图片资源大小&#xff0c;美术会将两边相同的图片进行切一半来处理。如下所示一个按钮 需要 400 * 236&#xff0c;然而美术只需要切一张 74*236的大小就可以了。这样一来图集就可以容纳更多的图片。…

HarmonyOs 4 (一) 认识HarmonyOs

目录 一 HarmonyOs 背景1.1 发展时间线1.2 背景分析1.2.1 新场景1.2.2 新挑战1.2.3 鸿蒙生态迎接挑战 二 HarmonyOS简介2.1 OpenHarmony2.2 HarmonyOS Connect2.3 HarmonyOS Next**2.4 ArkTS &#xff08;重点掌握&#xff09;****2.5 ArkUI** 三 鸿蒙生态应用核心技术理念**3.…

SmartSoftHelp8,数据库字段详细文档自动生成工具

数据库开发文档自动生成 包括数据库设计详细信息&#xff1a; 数据库字段名称&#xff0c;数据类型&#xff0c;大小&#xff0c;是否主键&#xff0c;说明等 一键自动生成开发需求文档 导出html 格式方便查询 下载地址 https://pan.baidu.com/s/1zBgeYsqWnSlNgiKPR2lUYg…

Spring---更简单的存储和读取对象

文章目录 存储Bean对象配置扫描路径添加注解存储Bean对象使用类注解为什么需要五个类注解呢&#xff1f;Bean命名规则 使用方法注解重命名Bean 读取Bean对象属性注入Setter注入构造方法注入注入多个相同类型的BeanAutowired vs Resource 存储Bean对象 配置扫描路径 注&#xf…

maven下载和安装

maven下载和安装 一、概述 Maven是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来…

conda环境下 ERROR: CMake must be installed to build dlib问题解决

1 问题描述 在构建video_retalking项目过程中&#xff0c;使用命令安装依赖包时&#xff0c;运行依赖安装命令&#xff1a; pip install -r requirements.txt 出现如下错误&#xff1a; Building wheels for collected packages: face-alignment, dlib, ffmpy, futureBuil…

【HuggingFace Transformer库学习笔记】基础组件学习:Tokenizer

基础组件——Tokenizer &#xff08;1&#xff09;模型加载 from transformers import AutoTokenizersen "弱小的我也有大梦想!" # 从HuggingFace加载&#xff0c;输入模型名称&#xff0c;即可加载对于的分词器 tokenizer AutoTokenizer.from_pretrained("m…

〖大前端 - 基础入门三大核心之JS篇㊸〗- DOM事件对象及它的属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

【稳定检索|投稿优惠】2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)

2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024) 2024 International Conference on Biological Neuroengineering and Health Big Data(ICBNHBD) 一、【会议简介】 2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)&#xff0c;这场科学盛宴&#xff0c;会议在中…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功&#xff0c;同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题&#xff0c;因为ts切片数据是保存在oss中的&#xff0c;我使用的是自己的oss账号&#xff0c;同事使用的是公司…

Azure Machine Learning - 使用 REST API 创建 Azure AI 搜索索引

本文介绍如何使用 Azure AI 搜索 REST AP和用于发送和接收请求的 REST 客户端以交互方式构建请求。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&…

Python 安装mysqlclient 错误 无法打开包括文件: “mysql.h”: 解决方法

解决方案&#xff1a;python最新3.12.0不支持mysqlclient 请下载 python3.9.9 版本 高速下载地址CNPM Binaries Mirror 官方下载地址Welcome to Python.org 下载完成后将python添加到环境变量 pycharm 虚拟环境下的python版本切换到你刚才下载的3.9.9的python版本 Avai…

C++动态内存管理new,delete

C动态内存管理new&#xff0c;delete 1.C/C内存分布2.C语言中的内存管理方式3.C中的内存管理方式new&#xff0c;delete3.1C中的内置类型new&#xff0c;delete3.2new&#xff0c;delete操作自定义类型3.3 new和delete匹配 4. operator new与operator delete函数4.1new和delete…

反转链表的实现

题目描述&#xff1a; 给出一个链表的头节点&#xff0c;将其反转&#xff0c;并返回新的头节点 思路1&#xff1a;反转地址 将每个节点里的地址由指向下一个节点变为指向前一个节点 定义三个结构体指针n1,n2,n3,n1表示改后指针的地址&#xff0c;n2表示要修改结构体里next的…

PT读spef报PARA-006如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 There are multiple causes that can trigger PARA-006 errors. Here is a checklist. 1) SPEF reading order Functionally, the parasitic files can be read in any order. For best stitching…

百度飞桨(张江)人工智能产业赋能中心入驻申请

中心如何赋能 百度飞桨&#xff08;张江&#xff09;人工智能产业赋能中心是浦东“大企业开放创新中心计划”首批企业代表&#xff0c;百度和张江集团将联合为入驻初创企业及生态合作伙伴提供以下服务&#xff1a; 降低AI使用门槛 通过“百度飞桨人工智能公共技术平台”&#x…

解决git与huggingface项目下载速度慢或者失败的问题

git clone 项目报错 比如使用git clone 下载项目&#xff1a; git clone https://github.com/ChuRuaNh0/FastSam_Awsome_TensorRT.git有时候会报以下错误&#xff1a; fatal: unable to access ‘https://github.com/xxx.git/’: Failed to connect to github.com port 443 …