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

news2024/11/20 23:20:13

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

安装selenium库和浏览器驱动 。
使用selenium提供的方法来控制浏览器窗口大小、后退、前进等。
使用selenium提供的方法来定位和操作页面元素,如点击、输入、获取属性等。
使用单元测试、日志系统、数据库等其他软件来配合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 = None
 
        self.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"

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!  

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

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

相关文章

如何建立自己的微信公众号

微信公众号是生活中常见的一种媒体形式&#xff0c;可以通过注册的方式来建立自己的微信公众号。 怎么注册 微信公众号注册的具体步骤如下&#xff1a; 1、在浏览器中搜索微信公众号&#xff0c;接着单击进入微信公众平台。 2、进入微信公众平台官网界面&#xff0c;接着单击…

【Acwing291】蒙德里安的梦想(状态压缩dp)详细讲解

题目描述 题目分析 显而易见的重要事实 首先&#xff0c;需要明白一个很重要的事实&#xff1a; 所有的摆放方案数所有横着摆放且合理的方案数 这是因为&#xff0c;横着的确定之后&#xff0c;竖着的一定会被唯一确定&#xff0c;举一个例子&#xff1a; ------唯一确定-…

自动化测试定位不到元素?可能是 frame 在搞鬼

很多人在用Splinter或Selenium定位页面元素的时候会遇到定位不到的问题&#xff0c;明明元素就在那儿&#xff0c;就是定位不到&#xff0c;这种情况很有可能是frame在搞鬼。 说白了就是网站上的网页A&#xff0c;又嵌入了其他网页B。你访问了网页A&#xff0c;在里面可以看到…

4G智慧电力物联网:建设高效智能,引领电力行业革新!

随着4G与物联网技术的快速发展为电力行业提供了更高效、可靠、智能化的解决方案。本文中智联物联将为大家分享智慧电力系统中的一些关键的物联网技术和通讯设备&#xff0c;如工业4G路由器、分布式发电站、数据采集传输、远程监控管理以及变电站监测。 光伏发电站是电力行业中重…

Golang struct 结构体注意事项和使用细节

结构体所有字段在内存当中是连续的 type Point struct {x, y int }type Rect struct {leftUp, rightDown Point }func main() {//r1会在内存当中有四个整数r1 : Rect{leftUp: Point{x: 1,y: 2,},rightDown: Point{x: 3,y: 4,},}//r1有四个int&#xff0c;在内存当中是连续分布的…

Vue2-快速搭建pc端后台管理系统

一.推荐二次开发框架 vue-element-admin Star(84k)vue-antd-admin Star(3.5k) 二.vue-element-admin 官网链接:https://panjiachen.github.io/vue-element-admin-site/zh/ 我这里搭建的是基础模版vue-admin-template(推荐) # 克隆项目 git clone https://github.com/PanJi…

使用多种工具进行JVM调优、线上故障排查的例子

1 FullGC调优 面试官&#xff1a;如何进行 JVM 调优&#xff08;附真实案例&#xff09; 2 使用arthas诊断案例 2.1 使用arthas确定某一个耗时的请求来自哪一个controller&#xff0c;并且分析以及代码优化 2.1.1 为什么要做第一步的“确定请求来源的controller”&#xff…

切换Debian的crontab的nano编辑器

Debian的crontab默认的编辑器是nano&#xff0c;用起来很不习惯,怎么才能转回vim呢? 用以下命令便可&#xff1a; #update-alternatives --config editor 出现以下所示的界面&#xff1a; 而后选择8使用/usr/bin/vim就能够了。 PS&#xff1a;若是你发现你的定时没有生效&…

全新土地销售活动 Turkishverse——在数字十字路口占据一席之地

准备好与来自该地区的众多世界知名合作伙伴一起探索土耳其文化和历史吧&#xff01; 简单介绍 ● 在这个弘扬土耳其文化和历史的新社区中&#xff0c;共有 433 块 LAND 可供出售&#xff0c;其中包括 □ 380 块标准 LAND □ 48 块优质 LAND □ 5 个 Estate ● LAND 销售抽…

通达信唐奇安通道指标公式,海龟交易法则的先驱

唐奇安通道&#xff08;Donchian Channel&#xff09;是由Richard Donchian发明的技术分析指标&#xff0c;用于确定价格的趋势和波动。著名的海龟交易法则就是基于唐奇安通道设计的&#xff0c;将通道作为交易系统的一部分&#xff0c;用于捕捉趋势信号。唐奇安通道由三条线组…

【腾讯云Cloud Studio实战训练营】React 快速构建点餐页面+Python 拼图小游戏

文章目录 一、腾讯云 Cloud Studio 概述1.1 腾讯云 Cloud Studio 简介1.2 腾讯云 Cloud Studio 功能特点1.3 腾讯云 Cloud Studio 产品优势 二、Cloud Studio界面功能介绍2.1 注册登录2.1.1 新注册用户有免费的3000分钟体验 2.2 界面功能介绍2.2.1 空间模板2.2.2 开发空间关闭空…

二甲医院信息管理系统源码 his系统源码 java+Angular+JavaScript

云HIS系统采用SaaS软件应用服务模式&#xff0c;提供软件应用服务多租户机制&#xff0c;实现一中心部署多机构使用。主要包含收费计费、药品管理、门诊医生工作站、住院医生工作站、护士工作站、数据统计、电子病历、医保接口等功能&#xff0c;能够满足医院及诊所日常业务开展…

VR智慧课堂 | 临床兽医学VR实验教学有哪些好处?

随着科技的不断发展&#xff0c;虚拟现实(VR)技术已经逐渐渗透到各个领域&#xff0c;为人们带来了前所未有的体验。在动物医学实验教学中&#xff0c;VR技术的应用也日益受到关注。本文将探讨临床兽医学VR实验教学的好处。 首先&#xff0c;VR技术能够提高动物医学实验的安全性…

常用数据库备份方法,sql数据库备份方法

在信息时代&#xff0c;数据成为了公司的主要资产。然而&#xff0c;数据的安全性和完整性也成为企业管理的重要组成部分。因此&#xff0c;数据库备份至关重要。本文将详细介绍几种常见的数据库备份方法。 全备份 全备份是指数据库中所有数据的备份&#xff0c;包括数据文件、…

为什么要使用依赖注入?直接new对象不香吗?为什么要把简单的问题复杂化?

作者&#xff1a;newki 为什么要使用依赖注入&#xff1f;直接new对象不香吗&#xff1f;为什么要把简单的问题复杂化&#xff1f; 你是不是在炫技,是不是像装13&#xff1f; 这还真不是&#xff0c;如果说我使用的Dagger2&#xff0c;还真是炫技&#xff0c;NB啊。Dagger的坑…

首轮征稿 | 2024年第二届先进无人飞行系统国际会议(ICAUAS 2024)

会议简介 Brief Introduction 2024年第二届先进无人飞行系统国际会议(ICAUAS 2024) 会议时间&#xff1a;2024年4月5日-7日 召开地点&#xff1a;中国武汉 大会官网&#xff1a;ICAUAS 2024-2024 2nd International Conference on Advanced Unmanned Aerial Systems 由华中科技…

Postgres数据库,使用序列时,没有按自增序列,而且数值很大

文章目录 前言处理前现象原因如何配置序列搞定&#xff0c;再见 前言 最近写了个全局获取操作日志的注解&#xff0c;写在了一个公共模块。但是奇怪的是在有的服务可以自增&#xff0c;而有的不可以。这回中间的过程咱就不过多描述了。 处理前现象 会生成这种id贼大的 原因…

怎么入门网络安全(黑客)?

目录&#xff1a; 一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习2.不要把深度学习作为入门第一课3.以黑客技能、兴趣为方向的自学误区&#xff1a;4.不要收集过多的资料二、学习网络安全的一些前期准备三…

微信开发之一键邀请好友加入群聊的技术实现

邀请群成员&#xff08;开启群验证&#xff09; 若群开启邀请确认&#xff0c;仅能通过本接口邀请群成员 请求URL&#xff1a; http://域名/addChatRoomMemberVerify 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuth…

抖音店铺怎么运营?一定要牢记这几个运营细节,能让你少走弯路!

我是王路飞。 新手做抖音小店&#xff0c;一直没做起来不出单的原因&#xff0c;绝大多数都是因为不了解流程&#xff0c;不知道每一步该干什么&#xff0c;以及要做好哪些细节。 不管做什么项目&#xff0c;先入门都是新手的第一要务&#xff0c;只有入门、跑通了整个流程&a…