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 By
find_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 time
driver = 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*480
time.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") # 输入csdn
time.sleep(1)
driver.refresh() # 刷新
def serach_clear():
print("4、清空输入的内容......")
driver.find_element_by_id("kw").send_keys("csdn") # 输入csdn
time.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") # 输入csdn
time.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_handles
driver.switch_to.window(windows[-1])
now_url = driver.current_url
m_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 强大的生态系统,以及不断实践最佳实践,测试效率和质量都将显著提升。自动化不仅节省了时间,也为开发质量提供了更强有力的保障。
用自动化测试解放双手,让代码成为你的“眼睛”,精准发现问题,助力产品品质跃升新高度!