Wed 自动化测试常用函数实践(二)
Web 自动化测试常用函数实战(一)-CSDN博客
Wed 自动化测试常用函数实践(一)中梳理了元素定位(含 CSS Selector、XPath 等方式及对应函数、语法、实战案例与避坑要点)和操作测试对象(含点击、输入、清除、获取文本 / 属性 / 页面信息等函数及示例代码)相关核心内容,文章原文见链接,接下来,继续对剩下的内容进行学习。
回顾衔接实践(点击图片。跳转页面):
先打开:
后点击至“图片”:
百度图片元素地址:
首先正常打印:
我们会发现,没有变化:
是因为:
这就需要学习窗口知识。
三、窗口控制函数:管理浏览器多窗口
当脚本打开新窗口(如点击链接跳转新页面)时,默认操作仍在原窗口(
driver.get("https://www.baidu.com/")
)driver驱动标签页。对于程序来说它是不知道当前最新的窗口应该是哪一个。对于程序来说它怎么来识别每一个窗口呢?每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,可理解为窗口的 “身份证号”。所以,切换窗口,我们就可以通过句柄来切换。
3.1 切换窗口:switch_to.window()
核心流程:
- 获取当前窗口句柄(
current_window_handle
)。 - 获取所有窗口句柄(
window_handles
)。 - 遍历所有句柄,切换到非当前窗口的新句柄。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager#打开浏览器----驱动管理
ChromeIns=ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))driver.get("https://www.baidu.com/")#跳转界面标题和链接
print('前:'+driver.title)
print('前:'+driver.current_url)#页面
driver.find_element(By.CSS_SELECTOR,"#s-top-left > a:nth-child(6)").click()#获取当前页面_1
curHandle = driver.current_window_handle#获取所有页面_1_2
allHandle = driver.window_handles#遍历所有句柄,切换新的
for handle in allHandle:if handle != curHandle:#切换句柄driver.switch_to.window(handle)#观测跳转结果
print('后:'+driver.title)
print('后:'+driver.current_url)#关闭浏览器
driver.quit()
跳转成功:
避坑要点:
- 切换窗口后,后续操作均针对新窗口;
- 关闭窗口前需切换到该窗口:若要关闭新窗口,需先通过句柄切换到新窗口,再调用
driver.close()
。
3.2 窗口大小控制:最大化、最小化、自定义
#打开浏览器----驱动管理
ChromeIns=ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))driver.get("https://www.baidu.com/")#窗口变化设置
#窗口最大化
driver.maximize_window()
time.sleep(5)
#窗口最小化
driver.minimize_window()
time.sleep(5)
#窗口全屏
driver.fullscreen_window()
time.sleep(5)
#手动设置窗口大小
driver.set_window_size(1024,777)
time.sleep(5)#关闭浏览器
driver.quit()
运行无误:
3.3 屏幕截图:save_screenshot()
自动化脚本通常在后台运行,若报错无法直观查看场景,可通过抓拍截图记录错误场景(如元素未找到时截图)。
运行报错是一定的,但是如果将截图抓拍下来将会更加有依据,直观,并且可以更好的定位问题。
基础用法:
普通的:
#打开浏览器----驱动管理
ChromeIns=ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))driver.get("https://www.baidu.com/")#基础截图
filename = "./lx01.png"
driver.save_screenshot(filename)#关闭浏览器
driver.quit()
在同级路径下创建相册:
修改路径(路径+名称error.png):
# 保存截图到指定路径(相对路径,需提前创建images文件夹)
driver.save_screenshot("../images/error.png")
如果图片名字都是一样的,多次运行自动化脚本时,历史图片会被覆盖,在测试中会遇到问题图片被覆盖的情况,无法排查错误,于是可以将每次所生成的图片名字不一样,以当前时间命名文件。
高阶用法(带时间戳,避免文件名重复):
只打印:
datetime.datetime.now()时,时间包含空格,所以还需要对时间进行格式化。
import datetime
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager#打开浏览器----驱动管理
ChromeIns=ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))driver.get("https://www.baidu.com/")#高级截图
# 生成带时间戳的文件名(如autotest-20240520-143025.png)
filename = "图片-" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + ".png"
# 保存截图
driver.save_screenshot("./xiang ce/"+filename)#关闭浏览器
driver.quit()
连续运行两次:
3.4 关闭窗口:close()
与quit()
函数 | 说明 | 适用场景 |
---|---|---|
close() | 关闭当前窗口(仅关闭活跃窗口) | 关闭单个窗口后继续操作其他窗口 |
quit() | 关闭所有窗口(也就是关闭浏览器),销毁driver 对象 | 脚本执行结束后释放资源 |
运行完成,销毁:
注意:
四、弹窗处理函数:解决 “看不见的元素”
页面弹窗(如警告弹窗、确认弹窗、提示弹窗)不属于 Web 页面 DOM 元素,无法通过常规定位方式找到,需使用 Selenium 的Alert
接口处理。
1.页面无法定位弹窗元素
2.出现了弹窗元素,其他因素也无法定位
实践一下:
点击一次时,代码运行正确。
点击两次时,代码报错,因为无法定位,报错内容:
所以页面出现了弹窗,必须要先处理弹窗之后,才能定位到页面的元素。
切换到弹窗——关闭弹窗(确定/取消)
4.1 警告弹窗与确认弹窗
- 警告弹窗:仅含 “确定” 按钮(如 “操作成功” 提示);
- 确认弹窗:含 “确定” 和 “取消” 按钮(如 “是否删除该内容”)。
处理流程:
- 切换到弹窗:
alert = driver.switch_to.alert
- 确认弹窗:
alert.accept()
- 取消弹窗:
alert.dismiss()
再进行上述步骤:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager#打开浏览器----驱动管理
ChromeIns=ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))#driver.get("https://www.baidu.com/")#警告弹窗
driver.get("file:///D:/Code/test-project/8_31/alert.html")
driver.find_element(By.CSS_SELECTOR,"#tooltip").click()
time.sleep(3)
# 切换到弹窗
alert = driver.switch_to.alert
time.sleep(3)
# 点击“确定”
alert.accept()
time.sleep(3)
#弹窗关闭后执行
driver.find_element(By.CSS_SELECTOR,"#tooltip").click()
time.sleep(3)#关闭浏览器
driver.quit()
代码运行正常。
执行涵盖取消的弹窗:
点击确定:
点击取消:
运行无误,取消和确定不可同时进行:
#打开浏览器----驱动管理
ChromeIns=ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))#driver.get("https://www.baidu.com/")#确认弹窗
driver.get("file:///D:/Code/test-project/8_31/confirm.html")
driver.find_element(By.CSS_SELECTOR,"body > input[type=button]").click()
time.sleep(3)
# 切换到弹窗
alert = driver.switch_to.alert
time.sleep(3)
'''# 点击“确定”
alert.accept()
time.sleep(3)'''
# 点击“取消”
alert.dismiss()
time.sleep(3)#关闭浏览器
driver.quit()
4.2 提示弹窗(带输入框)
提示弹窗含输入框(如 “请输入姓名”),需先输入文本,再确认 / 取消。
alert = driver.switchTo.alert
alert.send_keys("hello")
alert.accept()
alert.dismiss()
实例:
点击确定:
点击取消则:
#打开浏览器----驱动管理
ChromeIns=ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))#driver.get("https://www.baidu.com/")#提示弹窗
driver.get("file:///D:/Code/test-project/8_31/Prompt.html")
time.sleep(3)
driver.find_element(By.CSS_SELECTOR,"body > input[type=button]").click()
time.sleep(3)
#输入+确定+取消
alert = driver.switch_to.alert
time.sleep(3)
alert.send_keys("lxt")
time.sleep(3)
alert.accept()
time.sleep(3)
#alert.dismiss()
#关闭浏览器
driver.quit()
弹窗中输入的过程,肉眼是看不见的,但是是输入了内容的。
代码运行无误: