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…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

