web UI自动化测试笔记
在当今数字化转型的浪潮中,Web 应用已经无处不在,而其质量保障的关键之一就是自动化测试。想象一下,如果每次都手动验证 UI 功能,不仅耗时耗力,还容易遗漏问题。Python 的强大生态为 Web UI 自动化测试提供了高效的解决方案。
如何用 Python 高效实现 Web UI 自动化测试?有哪些工具和最佳实践可以让测试变得更加简单和可靠?
随着 DevOps 和 CI/CD 的普及,Web UI 自动化测试已经成为企业构建高效开发和测试流程的核心环节之一。越来越多的公司要求测试人员掌握自动化技能,而 Python 作为易学易用的语言,成为测试工程师的首选。
Selenium WebDriver API
(一):元素定位
- id定位find_element_by_id();
- name定位find_element_by_name();
- class属性定位find_element_by_class_name();
- tag属性定位find_element_by_tag_name();
- 元素标签之前的文本信息来定位find_element_by_link_text();
- 取文本链接的一部分来定位find_element_by_partial_link_text();
- xpath多种定位策略 find_element_by_xpath();
- css选择器定位
①绝对路径:
find_element_by_xpath("html/body/div[2]/div[2]/div[3]/div[2]/form/input[1]"); 1
②元素属性:
find_element_by_xpath("//input[@id='qwe']"); find_element_by_xpath("//input[@name='qwe']"); find_element_by_xpath("//input[@class='qwe']"); find_element_by_xpath("//*[@id='qwe']"); 1 2 3 4
③层级属性:
find_element_by_xpath("//span[@class='qwe']/input"); find_element_by_xpath("//form[@id='qwe']/span[2]/input"); 1 2
④运算逻辑:
find_element_by_xpath("//input[@id='qwe' and @class='qwer']/span/input");
① css选择器定位
find_element_by_css_selector(); 1 其中css也有多种策略:
①class属性:
find_element_by_css_selector(".qwe"); 1
②id属性: find_element_by_css_selector("#qwe");
③标签名:find_element_by_css_selector("input");
A.父子关系:find_element_by_css_selector("span>input");
B.属性定位:find_element_by_css_selector('[type="submit"]');
C.组合定位:find_element_by_css_selector(" form.fm>span>input>input.qwe");
9.BY元素定位
以上提到的8种定位方法,webdriver还提供了另一套写法,即统一调用find_element()方法,通过BY来声明定位的方法,并且传入对应定位方法的定位参数。 使用BY之前需要插入BY类:
from selenium.webdriver.common.by import Byfind_element(BY.ID,"qwe");
find_element(BY.NAME,"qwe");
find_element(BY.CLASS_NAME,"qwe");
find_element(BY.TAG_NAME,"qwe");
find_element(BY.LINK_TEXT,"xxxxx");
find_element(BY.PARTIAL_LINK_TEXT,"dddd");
find_element(BY.XPATH,"//* [@id='qwe']");
find_element(BY.CSS_CELECTOR," span>input ");
(二):浏览器控制1
1.控制浏览器窗口大小
set_window_size();
如set_window_size(640,480); 即宽640,高480
maximize_window(); 窗口最大化,不需要参数,直接使用
2.控制浏览器进退、前进
back(); 返回
forwar(); 前进
如 driver.back(); 其中driver=webdriver.Chrome()
3.模拟浏览器刷新
refresh(); 如driver.refresh()类似F5
4.简单元素操作
①clear(); 清除文本
②send_keys(*value); 模拟按键输入
③click(); 单击元素
举例:
driver.find_element_by_id("qwe").clear()
driver.find_element_by_id("qwe").send_keys("tyyu")
driver.find_element_by_id("login").click()
5.webelement接口常用方法
size:返回元素的尺寸
text:获取元素的文本
get_attributte(name):获得属性
is_displayed():设置改元素是否用户可见
举例:
size=driver.find_element_by_id("qwe").size 获取输入框的尺寸
text=driver.find_element_by_id("qwe").text 获取文本信息
attributte = driver.find_element_by_id("qwe").get_ attributte('type') 可以是id、name、type或其他任意属性
result= driver.find_element_by_id("qwe"). is_displayed() 返回元素的结果是否可见,返回结果为Ture或者False
6.鼠标事件
perform(): 执行所有ActionChains中存储的行为
context_click(): 右击
double_click(): 双击
drag_and_drop(element, target
move_to_element(): 鼠标悬停
举例:
①rom selenium.webdriver.common.action_chains import ActionChains 先引入ActionChains类
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#...
#定位到要右击的元素
right_click = driver.find_element_by_id("qwe")
#对定位到的元素执行鼠标右击操作
ActionChains(driver).context_click(right_click).perform()
说明:
ActionChains(driver):调用这个类,将浏览器驱动driver作为参数传入
context_click(right_click):模拟邮件操作,在使用时需要指定元素定位
perfom():将指定所有ActionChains中存储的行为。
②above=driver.find_element_by_id("qwer")
ActionChains(driver).move_to_element(above).perfom()
其他方法类似
7.键盘事件
Keys类提供了键盘上所有的按键方法
from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE) 删除键
send_keys(Keys. SPACE) 空格键
send_keys(Keys.TAB) 制表键
send_keys(Keys.ESCAPE) 回退键
send_keys(Keys.ENTER) 回车键
send_keys(Keys.CONTROL,'a') 全选
send_keys(Keys.CONTROL,'c') 复制
send_keys(Keys.CONTROL,'x') 剪贴
send_keys(Keys.CONTROL,'v') 粘贴
send_keys(Keys.F1)
...
send_keys(Keys.F12) F1-F12
8.获得验证信息
title, URL, text
举例:
now_url=driver.current_url 获取当前页面URL
title=driver.title 获取当前页面title
text前边已经提及到,不赘述
(三):浏览器控制2
9.设置元素等待
①显式等待:WebDriverWait(driver,poll_fequency=0.5,ignored_exceptions=None)
②隐式等待:driver.implicitly_wait(time) time可自定义
③sleep休眠:sleep(time) time可自定义
10.定位一组元素
在之前定位单个元素的element后加s
find_elements_by_id();
find_elements_by_name();
find_elements_by_class_name();
find_elements_by_tag_name();
find_elements_by_link_text();
find_elements_by_partial_link_text();
find_elements_by_xpath();
find_elements_by_css_selector();
11.多表单切换
driver.swtich_to.frame()
12.多窗口切换
driver.switch_to.widow() 用于切换到相应的窗口
current_window_handle 获取当前窗口句柄
window_handles 返回所有窗口的句柄到当前会话
13.警告框处理
text:返回 alert/confirm/prompt中的文字信息
accept(): 接受现有警告框
dismiss(): 解散现有警告框
send_keys(keysToSend): 发送文本至警告框
14.上传文件
普通上传:将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器
插件上传:指基于Flash,JavaScript或Ajax等技术实现上传功能
①send_keys()
如:
from selenium import webdriver
import os
driver = webdriver.Chrome()
file_path='file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')
driver.quit()
②AutoIt实现上传 下载使用http://www.autoitscript.com/site/
15.下载文件
from selenium import webdriver
import os
fp=webdriver.Firefoxprofile()
fp.set_preference("browser.download.folderList",2)#0是默认路径,2是指定路径
fp.set_preference("browser.download.manager.showWhenStarting",False)#是否显示开始
fp.set_preference("browser.download.dir",os.getcwd())#用于指定所下载的文件的目录
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")#下载文件的类型
driver=webdriver.Firefox(firefox_profile=fp)
driver.get("http://pypi.Python.org/pypi/selenium")
driver.find_element_by_partial_link_text("selenium-2").click()
16.操作Cookie
WebDriver操作cookie的方法:
get_cookies(): 获取所有的cookie信息
get_cookie(name): 返回字典的key为“name”的cookie信息
add_cookie(cookie_dict):添加cookie。cookie_dict为字典对象,必须有name,value值
delete_cookie(name,optionsString):删除cookie信息
delete_all_cookies():删除所有的cookie信息
17.调用JavaScipt
调整浏览器滚动条位置
window.scrollTo(左边距,上边距)
18.处理HTML5的视频播放
load(),play(), pause() 加载,播放,暂停
19.窗口截图
driver.get_screenshot_as_file("D:\\xxxxx")#截取当前窗口,并指定截图图片的保存位置
20.关闭窗口
quit():退出相关程序和关闭所有窗口;
close():关闭当前窗口
21.验证码的处理
①去掉验证码
②设置万能验证码
③验证码识别技术
④记录cookie
简单实战
安装chromdriver.
一个简单的自动化测试脚本,来体会一下什么是web UI自动化测试,以及元素的基本操作
# #文件名称:test_baidu.py
# Function:打开百度网主页,在搜索栏输入“helloworld,from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import timedriver = webdriver.Chrome() # 打开Chrome浏览器
driver.get("https://www.baidu.com") # 输入百度网址
print("============验证浏览器的基本控制=-=======")def search():print("1、搜索helloworld.并回车......")time.sleep(2)driver.find_element_by_id("kw").send_keys("helloworld") # 输入“helloworld”time.sleep(2)driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜索time.sleep(2)driver.maximize_window() # 最大化当前窗def windows_size():print("2、浏览器窗口大小缩小为640*480......")time.sleep(2)driver.set_window_size(640, 480) # 控制浏览器显示尺寸为640*480time.sleep(0.5)driver.maximize_window() # 最大化当前窗time.sleep(2)def back_refresh():print("3、先进行浏览器后退,再次输入csdn进行搜索")driver.back()driver.find_element_by_id("kw").send_keys("csdn") # 输入csdntime.sleep(1)driver.refresh() # 刷新def serach_clear():print("4、清空输入的内容......")driver.find_element_by_id("kw").send_keys("csdn") # 输入csdntime.sleep(2)driver.find_element_by_id("kw").clear()time.sleep(0.5)def csdn():print("5、进入csdn官网")driver.find_element_by_id("kw").send_keys("csdn") # 输入csdntime.sleep(2)driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜索time.sleep(2)driver.find_element_by_xpath("//*[@id='1']/div/div[1]/h3/a[1]").click()time.sleep(2)windows = driver.window_handlesdriver.switch_to.window(windows[-1])now_url = driver.current_urlm_get_url = "https://www.csdn.net/"if now_url == m_get_url:print("经过判断,已经进入csdn官网!!")else:print("未进入到csdn官网,请检查代码!")search()
windows_size()
back_refresh()
serach_clear()
csdn()
driver.quit() # 关闭浏览器
问题:driver.find_element_by_xpathd的参数是怎么获取到的呢?
("//*[@id='1']/div/div[1]/h3/a[1]").click()
获取路径:
Web UI 自动化测试并不是一项简单的任务,但通过 Python 强大的生态系统,以及不断实践最佳实践,测试效率和质量都将显著提升。自动化不仅节省了时间,也为开发质量提供了更强有力的保障。
用自动化测试解放双手,让代码成为你的“眼睛”,精准发现问题,助力产品品质跃升新高度!
相关文章:

web UI自动化测试笔记
在当今数字化转型的浪潮中,Web 应用已经无处不在,而其质量保障的关键之一就是自动化测试。想象一下,如果每次都手动验证 UI 功能,不仅耗时耗力,还容易遗漏问题。Python 的强大生态为 Web UI 自动化测试提供了高效的解决…...

计算机网络 (60)蜂窝移动通信网
一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于,将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域,称为蜂窝小区。每个小区设置一个基站,负责本小区内移…...

计算机网络三张表(ARP表、MAC表、路由表)总结
参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…...

DRF开发避坑指南01
在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…...

批量提取多个 Excel 文件内指定单元格的数据
这篇文章将介绍如何从多个相同格式的Excel文件中,批量提取指定单元格的数据,合并后保存到新的工作薄。 全程0代码,可视化操作。 提取前: 提取后: 准备数据 这里准备了3个测试数据 开始提取 打开的卢易表࿰…...

#HarmonyOS篇:build-profile.json5里面配置productsoh-package.json5里面dependencies依赖引入
oh-package.json5 用于描述包名、版本、入口文件和依赖项等信息。 {"license": "","devDependencies": {},"author": "","name": "entry","description": "Please describe the basic…...

Spring集成Redis|通用Redis工具类
一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …...

Vue中设置报错页面和“Uncaught runtime errors”弹窗关闭
文章目录 前言操作步骤大纲1.使用Vue自带的报错捕获机制添加报错信息2.在接口报错部分添加相同机制3.把报错信息添加到Vuex中方便全局使用4.添加报错页面备用5.app页面添加if判断替换报错界面 效果备注:vue项目中Uncaught runtime errors:怎样关闭 前言 在开发Vue项…...

【力扣】219. 存在重复元素 II
题目 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在,返回 true ;否则,返回 false 。 示例 1: 输入:…...

头歌实训作业 算法设计与分析-贪心算法(第5关:求解流水作业调度问题)
问题描述 有 n 个作业(编号为1~n)要在由两台机器 M 1和 M 2 组成的流水线上完成加工。每个作业加工的顺序都是先在 M 1上加工,然后在 M 2 上加工。 M 1 和 M 2 加工作业 i 所需的时间分别为 a i 和 b i(1≤i≤n&am…...

Hadoop•搭建完全分布式集群
听说这里是目录哦 一、安装Hadoop🥕二、配置Hadoop系统环境变量🥮三、验证Hadoop系统环境变量是否配置成功🧁四、修改Hadoop配置文件🍭五、分发Hadoop安装目录🧋六、分发系统环境变量文件🍨七、格式化HDFS文…...

SQL-leetcode—1141. 查询近30天活跃用户数
1141. 查询近30天活跃用户数 表:Activity ---------------------- | Column Name | Type | ---------------------- | user_id | int | | session_id | int | | activity_date | date | | activity_type | enum | ---------------------- 该表没有包含重复数据。 …...

总结与展望,龙蜥社区第 30 次运营委员会会议线上召开
2025 年 1 月 20 日,龙蜥社区召开了第 30 次运营委员会线上会议,来自 24 家理事单位的 22 位委员及委员代表出席,本次会议由运营委员凝思软件李晨斌主持。会上总结和回顾了龙蜥社区 1 月运营发展情况,同步了龙蜥社区 3 大运营目标…...

idea对jar包内容进行反编译
1.先安装一下这个插件java Bytecode Decompiler 2.找到这个插件的路径,在idea的plugins下面的lib文件夹内:java-decompiler.jar。下面是我自己本地的插件路径,以作参考: D:\dev\utils\idea\IntelliJ IDEA 2020.1.3\plugins\java-d…...

c++----------------------多态
1.多态 1.1多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)…...

C语言 指针_野指针 指针运算
野指针: 概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的) 指针非法访问: int main() {int* p;//p没有初始化,就意味着没有明确的指向//一个局部变量不初始化,放…...

【JavaEE进阶】Spring留言板实现
目录 🎍预期结果 🍀前端代码 🎄约定前后端交互接口 🚩需求分析 🚩接口定义 🌳实现服务器端代码 🚩lombok介绍 🚩代码实现 🌴运行测试 🎄前端代码实…...

第25篇 基于ARM A9处理器用C语言实现中断<一>
Q:怎样理解基于ARM A9处理器用C语言实现中断的过程呢? A:同样以一段使用C语言实现中断的主程序为例介绍,和汇编语言实现中断一样这段代码也使用了定时器中断和按键中断。执行该主程序会在DE1-SoC的红色LED上显示流水灯…...

面向通感一体化的非均匀感知信号设计
文章目录 1 非均匀信号设计的背景分析1.1 基于OFDM波形的感知信号1.2 非均匀信号设计的必要性和可行性1.2 非均匀信号设计的必要性和可行性 3 通感一体化系统中的非均匀信号设计方法3.1 非均匀信号的设计流程(1)均匀感知信号设计(2࿰…...

修改docker共享内存shm-size
法1:在创建容器时增加共享内存大小 nvidia-docker run -it -p 10000:22 --name"zm" -v /home/zm:/data ufoym/deepo:all-cu101 /bin/bash --shm-size20G法2:修改正在运行的容器的共享内存设置 查看容器、共享内存 docker ps -a df -lh | gr…...

WIN11 UEFI漏洞被发现, 可以绕过安全启动机制
近日,一个新的UEFI漏洞被发现,可通过多个系统恢复工具传播,微软已经正式将该漏洞标记为追踪编号“CVE-2024-7344”。根据报告的说明,该漏洞能让攻击者绕过安全启动机制,并部署对操作系统隐形的引导工具包。 据TomsH…...

网安加·百家讲坛 | 樊山:数据安全之威胁建模
作者简介:樊山,锦联世纪教育能源工业互联网数字安全CSM(新能源运维师)课程特聘培训讲师,哈尔滨工业大学(深圳)信飞合创数据合规联合实验室特聘专家,武汉赛博网络安全人才研究中心资深专家;近24年…...

jQuery阶段总结(二维表+思维导图)
引言 经过23天的学习,期间有期末考试,有放假等插曲。本来应该在学校里学习,但是特殊原因,让回家了。但是在家学习的过程,虽然在学,很让我感觉到不一样。但是效果始终还是差点的,本来17、18号左右…...

【LLM】RedisSearch 向量相似性搜索在 SpringBoot 中的实现
整理不易,请不要吝啬你的赞和收藏。 1. 前言 写这篇文章挺不容易的,网络上对于 SpringBoot 实现 Redis 向量相似性搜索的文章总体来说篇幅较少,并且这些文章很多都写得很粗糙,或者不是我想要的实现方式,所以我不得不阅…...

如何为64位LabVIEW配置正确的驱动程序
在安装 64位 LabVIEW 后,确保驱动程序正确配置是关键。如果您首先安装了 32位 LabVIEW 和相关驱动,然后安装了 64位 LabVIEW,需要确保为 64位 LabVIEW 安装和配置适当的驱动程序,才能正常访问硬件设备。以下是详细步骤:…...

Redis(5,jedis和spring)
在前面的学习中,只是学习了各种redis的操作,都是在redis命令行客户端操作的,手动执行的,更多的时候就是使用redis的api(),进一步操作redis程序。 在java中实现的redis客户端有很多,…...

Git 小白入门教程
🎯 这篇文章详细介绍了版本控制的重要性,特别是通过Git实现的分布式版本控制相对于SVN集中式控制的优势。文章首先解释了版本控制的基本概念,强调了在文档或项目多版本迭代中备份与恢复任意版本的能力。接着,重点阐述了Git的历史背…...

Python从0到100(八十五):神经网络与迁移学习在猫狗分类中的应用
在人工智能的浩瀚宇宙中,深度学习犹如一颗璀璨的星辰,引领着机器学习和计算机视觉领域的前沿探索。而神经网络,作为深度学习的核心架构,更是以其强大的数据建模能力,成为解决复杂问题的重要工具。今天,我们…...

代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)
目录 一、链表理论基础 二、链表相交求解思路 三、相关算法题目 四、疑点 一、链表理论基础 代码随想录 二、链表相交求解思路 链表相交时,是结点的位置,也就是指针相同,不是结点的数值相同; 思路:定义两个指针…...

C++ 复习总结记录九
C 复习总结记录九 主要内容 1、list 介绍及使用 2、list 剖析及模拟实现 3、list 与 vector 对比 一 list 介绍及使用 List 相关文档 1、List 在任意位置进行插入和删除的序列式容器 O(1) ,且该容器可前后双向迭代 2、List 底层是带头双向循环链表ÿ…...