首页 > 编程语言 >Python+Selenium实现UI自动化

Python+Selenium实现UI自动化

时间:2024-01-02 16:37:53浏览次数:35  
标签:脚本 定位 Python Selenium element UI 页面 id 属性

自动化测试

Python+Selenium实现UI自动化_UI自动化

自动化测试是把以人为驱动的测试行为转化成机器执行的一种过程,通常在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较,再此过程中,为了节省人力,时间或硬件资源,提高测试效率,便引用了自动化测试的概念Selenium:是一套代码库,提供了各种驱动浏览器的方法,利用 python+selenium 结合。实现驱动浏览器代替我们手工测试,实现机器自己执行测试的功能Selenium 是属于 web 自动化也叫 ui 自动化,也叫功能自动化,只能驱动 pc 端的项目,不能驱动 app


元素定位:
元素定位是自动化测试的核心,想要操作一个元素,首先应该识别这个元素
Webdriver 提供了一系列的元素定位方法,常见的定位方法有以下几种
Find_element_by_id(‘属性值’)#利用 id 属性定位
Find_element_by_class_name()#利用 class,name 属性定位
Find_element_by_link_text()#利用连接名称定位
Find_element_by_partial_link_text()#利用部分链接名称定位
Find_element_by_name()#利用 name 属性定位
Find_element_by_tag_name()#利用标签名定位
Find_element_by_xpath()#利用标签路径定位
Find_element_by_css_selector()#利用 css 元素定位


元素操作:
Driver.find_element_by_id(‘’).click()#点击
Driver.find_element_by_id(‘’).send_keys(‘输入值’)#输入
Driver.find_element_by_id(‘’).clear()#清除内容
Driver.refresh()#刷新页面Driver.forward()#页面前进
Driver.back()#页面后退
Driver.quit():退出当前页面
Xpath 的绝对路径定位:
从 html 标签开始一级一级往下查找目标节点
#xpath 相对路径定位
相对路径使用方法:你可以不用 html 开始往下写路径,先找到一个可以确定的标签,从确
定的节点开始找你的目标路径
查找相对路径的下级目录:
//*[@id=’id 属性值’]/路径
定位 id
Driver.find_element_by_xpath(‘//*[@id=’id 属性值’]/路径’).click()
查找相对路径的上级目录
//*[@属性名=’属性值’]/../
查找相对路径的兄弟目录
//*[@属性名=’属性值’]/../div[1]
Css 定位
#根据 id 定位
Driver.find_element_by_css_selector(‘#id 值’).send_keys(‘值’)
#根据 class 定位
Driver.find_element_by_css_selector(‘.class 值’).send_keys(‘值’)
#通过属性来定位
Driver.find_element_by_css_selector(‘[属性=”属性值”]’).send_keys(‘值’)


自动化的测试流程:
针对项目流程设计测试用例(主要针对主流程的正向用例)编写测试脚本(把用例转化成自动化脚本)
导入测试框架(可以批量执行脚本)
生成测试报告(脚本自动生成报告)
鼠标悬停:
From selenium.webdriver.common.action_chains import ActionChains
#先导入模拟鼠标操作
变量=driver.find_element_by_link_text(‘属性值’)
#定位鼠标需要悬停的位置
ActionChains(浏览器驱动).move_to_element(变量).perform()
#模拟鼠标悬停
操作浏览器滚动条
变量=’window.scrollto(左右,上下)’
#控制滚动条位置
浏览器驱动.execute_script(变量)
#让你的滚动条跳转到指定位置
浏览器窗口最大化
浏览器驱动.maximize_window()
浏览器窗口设置指定大小
浏览器驱动.set_window_size(高度,宽度)
获取元素文本:
变量=标签定位语句
变量.text
例句:a=driver.find_element_by_id(‘xxx’)
Return a.text #抛出标签内容语法获取属性值:
变量=标签定位语句 #定位需要获取属性的标签
变量=变量.get_attribute(‘属性名’) #获取想要的属性值,赋给变量
get_attribute(属性):
例句:a=driver.find_element_by_id(‘xxx’) #把需要获取属性的标签赋给变量
B=A.get_attribute(‘属性名’) #输出标签的 name 属性
下拉菜单元素定位:
From selenium.webdriver.support.ui import Select
#导入下拉框定位方法 Select(S 要大写)
变量名=Select(driver.find_element_by_id(‘属性值’))
#定位选项框 Select(s 要大写)
s.select_by_values(‘values 值’) #选择 values=’20’的项:通过 values 属性定位
s.select_by_index(索引值) #选择第一项选项:通过选项的顺序选择,第一个为 0
s.select_by_visible_text(‘选项名’) #根据选项名称定位


下拉框的标签是<select>标签
Frame 嵌套页面元素定位
当你定位元素,各种语法都正确,就是定位不到元素时,可以考虑他是不是 frame 嵌套页面
在 F12(开发者选项中)搜索 iframe 标签,如果你要定位的内容在 iframe 标签内,那么就说
明你要定位的内容是嵌套页面
语法:
变量=driver.find_element_by_id(xx)

#定位 frame 嵌套页面
浏览器驱动.switch_to.frame(变量)

#进入嵌套页面
浏览器驱动.switch_to.default_content()#退出嵌套页面
页面等待:

1,强制等待:sleep(),不建议使用这种等待方式,太死板,严重影响程序执行的速度,
一般在调试脚本时使用

2,隐性等待:implicitly_wait()隐性等待对整个 driver 的周期都起作
用,所以只需要设置一次即可 driver.implicitly_wait()

3,显性等待:只等待一个元素,等到元素加载出来后,脚本才会运行,元素出来的早,脚
本运行的早,元素出来的晚,脚本就会等元素出来后在运行
使用显性等待需要先导入模块:
From selenium.webdriver.support import expected_conditions as EC

#判断元素是否存在
From selenium.webdriver.support.wait import WebDriverWait

#导入显性等待
From selenium.webdriver.common.by import By
#导入 BY 操作元素方法
WebDriverWait ( 浏 览 器 驱 动 , 最 长 等 待 时 间 , 刷 新 间 隔 ) .until
(EC.visibility_of_element_located((By.ID,’属性值’)))
by.定位法包括:By.ID By.XPATHBy.CSS_SELECTOR 等(id xpath 等。需要大写)
页面切换:当你的软件会打开新的页面时,你需要切换页面才能定位新窗口的内容
变量=driver.window_handles
#获取所有窗口句柄,获取到句柄组
driver.switch_to.window(变量[索引])
#切换到当前最新打开的窗口
页面截图:当你需要保留截图的时候,即可增加页面截图
driver.get_screenshot_as_file(filename):截取当前窗口

实例:driver.get_screenshot_as_file(‘d:\\aa\\bb\\xxx.jpg’)
你可以在脚本最后增加截图,保留测试结果
上传文件
就是在你需要上传文件的地方,利用 send_key()方法,写入文件所在路径实现上传功能
driver.find_element_by_css_selector(上传的文件的元素).send_keys(文件路径)
警告弹窗处理
先使用 driver.switch_to.alert 切换到警告弹窗上面(注意,有时候切换前需要加个等待)
accept()方法相当于点击确定
dismiss()相当于取消
send_keys()相当于在弹窗上的输入框输入文本
当你碰到页面弹出窗口,且窗口定位不到时,那么窗口一般就是警告弹窗
代码:
a=driver.switch_to.alert #切换 alert
a.send_keys(‘值’) #在弹窗的输入框中输入文本内容
a.accept() #确认,相当于点击确认按钮
a.dismiss() #取消,相当于点击取消按钮
unittest 三大功能:
testcase,此模块的作用是将用户导入的脚本转化成一个又一个测试用例
testsuite:此模块的作用是将转化后的用例,增加至同一测试组内
texttestrunner:此模块的作用是运行脚本,通过运行测试组,来实现批量执行测试用例
unittest 案例:
from 脚本模块 import 脚本
import unittest #导入 unittest 单元测试框架
class 用例类名(unittest.TestCase):


创建类,继承 testcase 的方法,用于把脚本转化成用例
def 用例名(self):
a=脚本类名()
a.脚本函数名()
if __name__==’__main__’: #if 下的代码只有在当前页面会运行
变量 1=unittest.TestSuite() #获取测试组
变量 1.addTest(用例类名(‘用例名’))#把测试用例增加至测试组中
变量 2=unittest.TextTestRunner()#继承运行模块
变量 2.run(变量 1)#运行测试组
setUp 函数:写在 setUp 下面的代码,会在每个用例执行前执行一次
tearDown:下载 tearDown 下的代码,会在每个用例执行后执行一次
断言:你可以提前让脚本抛出可以证明运行成功的值,在 unittest 的用例下增加断言如果实
际结果抛出的值和我们添加的预期结果符合判断,那么就证明脚本运行成功,否则就证明脚
本运行出错
self.assertEqual(值 1,值 2)#验证值 1=值 2,不等于则 fail
self.assertNotEqual(值 1,值 2)#验证值 1!=值 2,相等则 fail
self.assertIn(值 1,值 2)#值 1 包含在值 2 中
self.assertNotIn(值 1,值 2)#值 1 不包含在值 2 中
当你需要把写脚本,转化用例,生成测试报告一起编写的自动化脚本的过程,也就是自动化
完整的测试流程
第一步:首先根据需求设计回归用例(主要针对主功能进行正向用例设计)
第二步:根据设计的用例利用各种元素定位方法编写脚本,在编写脚本时,要让脚本抛出可
以证明运行成功的证明,如页面文本或指定属性,如有必要还要保留截图,且需要优化脚本,
把强制等待换成显性等待
第三步:把你写的脚本转入到 unittest 的 testcase 框架下,转化成测试用例,且每个用例下
增加响应断言用于判断执行结果
第四步:导入测试报告,创建空测试报告,把转换后的用例增加到测试组内,运行测试组且
把运行结果写进测试报告内,运行完毕后,直接去查看测试报告的结果即可,因为提前增加
了断言所以查看报告时也只需要重点关注报错的信息即可

在编写脚本,保存文件时,需要分开保存
创建文件夹:用于保存脚本
在额外创建文件夹:保存报告
在额外创建文件夹:保存截图

标签:脚本,定位,Python,Selenium,element,UI,页面,id,属性
From: https://blog.51cto.com/u_16489249/9070867

相关文章

  • Python爬虫 - 使用代理IP池维护虚拟用户
    在进行Web爬取时,使用代理IP是一种常见的策略,它可以帮助我们隐藏真实IP地址,绕过网站的访问限制,提高爬取效率。本文将介绍如何使用代理IP池维护虚拟用户,以在爬取过程中保持匿名性和稳定性。一、什么是代理IP池?代理IP池是一个包含多个代理IP的集合。这些代理IP通常是从公开或付费的代......
  • Python中怎么读取列表中某个值?
    Python中的列表是一种常见的数据结构,它可以存储同一类型或不同类型的数据。列表是Python中最常用的数据结构之一,可以简单地理解为一个由一系列元素组成的有序集合。那么Python中怎么读取列表中某个值?以下是具体内容介绍。1、使用in操作符Python中的in操作符可以用来检......
  • Python字符串操作:获取子序列的方法详解
    在Python中,处理字符串是一项常见的任务,其中一个常见的需求是从一个字符串中获取某一特定的子序列。这个子序列可以是一个连续的子字符串,也可以是不连续的一组字符。在这篇文章中,我们将探讨在Python中获取子序列的几种常见方法。1.切片操作Python中的切片操作是获取子序列的一种简便......
  • 使用Python找到和删除相似文件的方法
    在处理大量文件时,经常会遇到需要找到和删除相似文件的情况。本文将介绍如何使用Python编程语言来实现这一任务,以帮助提高文件管理的效率。导入必要的库我们首先需要导入以下两个Python标准库:importosimportfilecmpos库用于文件操作,包括获取文件路径、判断文件是否存在等功能。f......
  • Python爬虫技巧大全:提升效率、应对反爬与处理异常
    Python爬虫是一项强大的工具,但在实践中常常会遇到各种问题,如效率低下、反爬机制等。本文将介绍一些Python爬虫的技巧,帮助读者提升爬虫效率、应对反爬机制以及处理异常情况。一、提升爬虫效率1.使用多线程或异步编程:通过多线程或异步编程可以提高爬虫的并发性能,加快数据的获取速度。......
  • 如何用Python绘制小提琴图
    小提琴图(ViolinPlot)是一种常用的数据可视化方法,可以展示变量的分布情况,同时也能够比较不同类别之间的差异。本文将介绍如何使用Python绘制小提琴图,帮助读者更好地理解和运用这一数据可视化技巧。一、准备工作在开始绘制小提琴图之前,我们需要确保已经安装了必要的库,包括matplotlib......
  • Python库和模块的概念有何不同
     在Python编程中,我们经常听到“库”(Library)和“模块”(Module)这两个词,它们是Python程序中常用的概念。但是,它们之间有什么区别呢?本文将介绍Python中库和模块的概念、特点以及它们之间的不同之处。 一、库(Library)的概念 库指的是一组相关的模块集合,它们提供了一系列函数、类和方......
  • 实战案例!Python+SQL京东用户行为分析
    1、项目背景项目对京东电商运营数据集进行指标分析以了解用户购物行为特征,为运营决策提供支持建议。本文采用了MySQL和Python两种代码进行指标计算以适应不同的数据分析开发环境。2、数据集介绍数据集共有五个文件,包含了'2018-02-01'至'2018-04-15'之间的用户数据,数据已进行了脱敏......
  • python实现五子棋
    1:效果图2:代码"""五子棋之人机对战"""importsysimportrandomimportpygamefrompygame.localsimport*importpygame.gfxdrawfromcollectionsimportnamedtupleChessman=namedtuple('Chessman','NameValueColor')P......
  • 大模型工具_QUIVR
    https://github.com/StanGirard/quivr/24.5KStar1功能整体功能,想解决什么问题实现了前后端结合的RAG方案。构建能直接使用的应用。提出了“第二大脑”,具体实现也是RAG,但针对不同用户不同场景支持多个“大脑”并存,每个“大脑里”存储一个或多个文件,用户可使用指定的大脑提......