当前位置: 首页 > news >正文

Wed 自动化测试常用函数实践(二)

Web 自动化测试常用函数实战(一)-CSDN博客

Wed 自动化测试常用函数实践(一)中梳理了元素定位(含 CSS Selector、XPath 等方式及对应函数、语法、实战案例与避坑要点)和操作测试对象(含点击、输入、清除、获取文本 / 属性 / 页面信息等函数及示例代码)相关核心内容,文章原文见链接,接下来,继续对剩下的内容进行学习。

回顾衔接实践(点击图片。跳转页面):

先打开:

后点击至“图片”:

百度图片元素地址:

首先正常打印:

我们会发现,没有变化:

是因为:

这就需要学习窗口知识。

三、窗口控制函数:管理浏览器多窗口

当脚本打开新窗口(如点击链接跳转新页面)时,默认操作仍在原窗口(

driver.get("https://www.baidu.com/")

)driver驱动标签页。对于程序来说它是不知道当前最新的窗口应该是哪一个。对于程序来说它怎么来识别每一个窗口呢?每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,可理解为窗口的 “身份证号”。所以,切换窗口,我们就可以通过句柄来切换。

3.1 切换窗口:switch_to.window()

核心流程:

  1. 获取当前窗口句柄(current_window_handle)。
  2. 获取所有窗口句柄(window_handles)。
  3. 遍历所有句柄,切换到非当前窗口的新句柄。
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 警告弹窗与确认弹窗

  • 警告弹窗:仅含 “确定” 按钮(如 “操作成功” 提示);
  • 确认弹窗:含 “确定” 和 “取消” 按钮(如 “是否删除该内容”)。

处理流程:

  1. 切换到弹窗:alert = driver.switch_to.alert
  2. 确认弹窗:alert.accept()
  3. 取消弹窗: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()

弹窗中输入的过程,肉眼是看不见的,但是是输入了内容的。

代码运行无误:

http://www.dtcms.com/a/354243.html

相关文章:

  • 嵌入式开发学习 C++:day01
  • 【SystemUI】启动屏幕录制会自动开启投屏
  • 主流配置中心对比
  • 百度测试岗位--面试真题分析
  • JS逆向-反调试绕过事件检测无限Debug篡改猴Hook替换指向匹配修改条件断点
  • 泊松分布知识点讲解
  • Android WPS Office 18.20
  • 【Win软件 - 系统 - 网络】 Windows怎么禁止某个应用联网
  • 洛谷P13849 [CERC 2023] Equal Schedules题解
  • python接口自动化测试报告插件使用
  • CSS扩大点击热区示例
  • 明远智睿 RK3506 核心板:高集成度与强实时性的嵌入式解决方案
  • 【小白笔记】Hugging Face 下载:Git 到镜像网站的
  • 4-3.Python 数据容器 - 集合 set(集合 set 概述、集合的定义、集合的遍历、集合的常用方法)
  • Yolo系列 —— 使用自制数据集训练yolo模型
  • 2021/07 JLPT听力原文 问题一 1番
  • MQTT broker 安装与基础配置实战指南(一)
  • Java:IO流——增强篇
  • anaconda本身有一个python环境(base),想用别的环境就是用anaconda命令行往anaconda里创建虚拟环境
  • 英伟达 spectrum xgs 以太网 的含义和解释
  • 互联网大厂AI面试:从大模型原理到场景应用的深度解析
  • WPF 程序用户权限模块利用MarkupExtension实现控制控件显示
  • 嵌入式分层架构下的AT指令模块设计与实现
  • 使用Nginx搭建图片传输服务:配置与优化指南
  • Content-Type是application/x-www-form-urlencoded表示从前端到后端提交的是表单的形式
  • 微服务的编程测评系统17-判题功能-代码沙箱
  • 除自身以外数组的乘积是什么意思
  • 算法刷题常见错误
  • Linux 打包及压缩基础知识总结
  • 车间生产管理遇到的问题及改善方案有哪些?