测试常用函数(下)

目录

窗口操作

[1. 切换窗口](#1. 切换窗口)

[2. 设置窗口大小](#2. 设置窗口大小)

[3. 窗口切换(句柄复用)](#3. 窗口切换(句柄复用))

截图操作

[1. 基础截图(固定文件名)](#1. 基础截图(固定文件名))

[2. 进阶截图(按时间戳命名,避免重复)](#2. 进阶截图(按时间戳命名,避免重复))

[窗口关闭方法(close() vs quit())](#窗口关闭方法(close() vs quit()))

代码示例

注意事项

等待机制

一、强制等待(time.sleep())

二、隐式等待(implicitly_wait())

三、显示等待(WebDriverWait)

三种等待方法对比

浏览器导航

[1. 打开网站](#1. 打开网站)

[2. 浏览器前进、后退、刷新](#2. 浏览器前进、后退、刷新)

弹窗处理

​编辑

[三类弹窗全解析(警告 / 确认 / 选择)](#三类弹窗全解析(警告 / 确认 / 选择))

选择弹窗(Prompt)核心问题

[三类弹窗的 Python-Selenium 完整操作代码](#三类弹窗的 Python-Selenium 完整操作代码)

注意事项

文件上传

核心问题

[操作步骤 + 代码示例](#操作步骤 + 代码示例)

关键说明

浏览器参数设置:定制化启动行为

无头模式设置(无界面运行浏览器)

作用

[代码示例(以 Chrome 为例)](#代码示例(以 Chrome 为例))

页面加载策略(控制页面加载等待逻辑)

作用

三种加载策略说明

代码示例(设置加载策略)

结语


窗口操作

在多标签页场景下,Selenium 默认只操作 "当前窗口",想要切换到新打开的标签页,得先掌握 ** 窗口句柄(window handle)** 的用法。

1. 切换窗口

每个窗口对应一个唯一的handle字符串,通过current_window_handle获取当前页面句柄,sindow_handles可以获取所有窗口的句柄列表,再通过循环切换到目标窗口:

2. 设置窗口大小

通过下列函数可以控制窗口的尺寸,支持 "最大化、最小化、自定义尺寸":

python 复制代码
# 1. 窗口最大化
driver.maximize_window()

# 2. 窗口最小化
driver.minimize_window()

# 3. 窗口全屏(类似按F11进入全屏模式)
driver.fullscreen_window()

# 4. 手动设置窗口尺寸(宽1024px,高768px)
driver.set_window_size(1024, 768)

3. 窗口切换(句柄复用)

如果需要回到之前的窗口,同样可以通过句柄列表定位:

截图操作

自动化脚本部署在机器上运行时,报错后可通过截图记录错误场景,辅助定位问题。

1. 基础截图(固定文件名)
python 复制代码
# 保存截图到指定路径(脚本所在目录下的images文件夹)
driver.save_screenshot('./images/image.png')
  • 路径说明:./images/ 表示脚本所在目录下的images文件夹(需提前创建);image.png是截图文件名。
2. 进阶截图(按时间戳命名,避免重复)

通过时间戳生成唯一文件名,每次截图都不会覆盖:

python 复制代码
import datetime

# 生成包含时间戳的文件名(格式:autotest-年-月-日-时-分-秒.png)
filename = "autotest-" + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"
# 保存到指定文件夹
driver.save_screenshot("./images/" + filename)

窗口关闭方法(close() vs quit()

Selenium 中关闭窗口 / 浏览器有两个核心方法,功能不同:

方法 功能说明
driver.close() 关闭当前 driver 指向的标签页(仅关闭一个标签,浏览器进程可能仍在运行)。
driver.quit() 关闭整个浏览器及所有标签页,同时终止 driver 进程(彻底退出)。
代码示例
python 复制代码
# 打开新标签页(以百度图片为例)
driver.find_element(By.CSS_SELECTOR, "#s-top-left > a:nth-child(6)").click()
time.sleep(3)

# 关闭当前标签页(仅关闭百度图片标签)
driver.close()
time.sleep(3)

# 彻底关闭浏览器及所有标签
driver.quit()
注意事项
  • 执行driver.close()后,若还需操作其他标签页,需重新切换窗口句柄;
  • 脚本结束时,建议用driver.quit()彻底退出,避免残留浏览器进程。

等待机制

代码执行速度通常快于页面渲染,需通过等待方法避免 "元素未加载就操作" 的报错。

一、强制等待(time.sleep()
  • 语法time.sleep(秒数)

  • 作用:固定等待指定秒数,无论页面是否加载完成

  • 代码示例

    python 复制代码
    import time
    
    # 等待3秒后再执行后续代码
    time.sleep(3)
  • 优缺点

    • ✅ 优点:使用简单,调试时方便
    • ❌ 缺点:浪费时间、降低脚本效率(页面加载快也得等)
二、隐式等待(implicitly_wait()
  • 语法driver.implicitly_wait(秒数)

  • 作用:全局智能等待 ------ 在指定时间内不断尝试查找元素,找到则立即执行后续代码;超时未找到则报错

  • 代码示例

    python 复制代码
    # 全局隐式等待5秒(对所有元素生效)
    driver.implicitly_wait(5)
  • 特点

    • 作用域:整个脚本的所有元素(只要driver对象未被quit(),就一直生效)
    • 智能性:无需重复写等待代码,自动适配元素加载速度
三、显示等待(WebDriverWait
  • 语法WebDriverWait(driver, 超时秒数).until(条件)

  • 作用 :针对特定元素 / 条件的智能等待 ------ 在指定时间内,满足条件则执行后续代码;超时未满足则报错

  • 依赖 :需导入expected_conditions(常用简称EC

  • 代码示例

    python 复制代码
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    # 等待2秒内,指定XPATH的元素变为不可见
    wait = WebDriverWait(driver, 2)
    wait.until(
        EC.invisibility_of_element((By.XPATH, '//*[@id="2"]/div/div/div[3]/div[1]/div[1]/div'))
    )
  • 常用条件(EC类方法)

    方法 说明
    title_is(标题) 检查页面标题是否等于预期值
    title_contains(文本) 检查页面标题是否包含指定文本
    visibility_of_element_located(定位器) 检查元素是否存在于 DOM 且可见
    presence_of_element_located(定位器) 检查元素是否存在于 DOM(无需可见)
    visibility_of(元素对象) 检查已知存在的元素是否可见
    alert_is_present() 检查是否出现弹窗
  • 优缺点

    • ✅ 优点:灵活(可自定义等待条件)、精准(仅对指定元素 / 条件生效)
    • ❌ 缺点:写法相对复杂

三种等待方法对比

等待类型 作用范围 智能性 适用场景
强制等待 局部 ❌ 固定等待 临时调试、简单场景
隐式等待 全局 ✅ 智能 通用场景(脚本中只需写一次)
显示等待 局部(特定元素 / 条件) ✅ 智能 + 灵活 复杂场景(需自定义条件)

浏览器导航

1. 打开网站

通过driver.get()访问指定 URL:

python 复制代码
# 打开目标网站(示例:tool.lu)
driver.get("https://tool.lu/")
2. 浏览器前进、后退、刷新

通过driver对象的内置方法实现导航操作:

python 复制代码
# 后退到上一页(模拟浏览器"返回"按钮)
driver.back()

# 前进到下一页(模拟浏览器"前进"按钮)
driver.forward()

# 刷新当前页面(模拟浏览器"刷新"按钮)
driver.refresh()

弹窗处理

网页弹窗(Alert 类)无法用常规元素定位

三类弹窗全解析(警告 / 确认 / 选择)

弹窗类型 核心特点 操作选项 典型场景
警告弹窗(Alert) 仅含 "确定" 按钮,无输入框 仅可点击 "确定" 系统提示、操作结果告知
确认弹窗(Confirm) 含 "确定 + 取消" 按钮,无输入框 点击 "确定"/"取消" 危险操作二次确认(如删除、退出)
选择弹窗(Prompt) 含 "确定 + 取消" 按钮 + 输入框 输入文本 + 点击 "确定" / 直接点击 "取消" 需要用户输入内容后确认(如输入昵称、备注)

选择弹窗(Prompt)核心问题

  1. 相比警告 / 确认弹窗,多了「输入文本」的步骤,若跳过输入直接确认,输入框会提交空值;
  2. 同样存在 "阻塞页面" 问题,未处理弹窗时无法操作页面其他元素。

三类弹窗的 Python-Selenium 完整操作代码

python 复制代码
# ========== 1. 处理警告弹窗(Alert) ==========
# 切换到弹窗上下文
alert = driver.switch_to.alert
# 获取弹窗文本(可选)
print("警告弹窗内容:", alert.text)
# 点击"确定"关闭弹窗
alert.accept()

# ========== 2. 处理确认弹窗(Confirm) ==========
confirm_alert = driver.switch_to.alert
print("确认弹窗内容:", confirm_alert.text)
# 选择1:点击"确定"
confirm_alert.accept()
# 选择2:点击"取消"(注释掉上面的accept,启用下面的dismiss)
# confirm_alert.dismiss()

# ========== 3. 处理选择弹窗(Prompt) ==========
prompt_alert = driver.switch_to.alert
print("选择弹窗内容:", prompt_alert.text)
# 步骤1:向输入框输入内容(核心区别)
prompt_alert.send_keys("我是输入的内容")
# 步骤2:点击"确定"提交输入内容
prompt_alert.accept()
# 若想取消输入:注释上面两行,启用下面的dismiss
# prompt_alert.dismiss()

注意事项

  1. 操作弹窗前必须执行 driver.switch_to.alert 切换上下文,否则会报错;
  2. 弹窗处理完成后,上下文自动切回页面,无需手动切换;
  3. 若页面无弹窗时执行 switch_to.alert,会抛出 NoAlertPresentException 异常,建议加异常捕获:
python 复制代码
from selenium.common.exceptions import NoAlertPresentException

try:
    alert = driver.switch_to.alert
    alert.accept()
except NoAlertPresentException:
    print("当前页面无弹窗")
  • 警告弹窗:仅 accept()
  • 确认弹窗:accept() / dismiss() 二选一;
  • 选择弹窗:先 send_keys() 输入内容,再 accept()(或直接 dismiss() 取消);
  • 所有弹窗均需先切换上下文,处理后自动切回页面。

文件上传

核心问题

Selenium 无法识别系统自带的文件选择弹窗 (属于非 web 控件),但可以通过send_keys()直接传入文件路径实现上传。

操作步骤 + 代码示例
python 复制代码
from selenium.webdriver.common.by import By

# 1. 访问包含文件上传控件的页面(示例为本地HTML文件)
driver.get("file:///D:/file/selenium4html/selenium-html/upload.html")

# 2. 定位文件上传的<input type="file">元素
upload_ele = driver.find_element(By.CSS_SELECTOR, "body > div > div > input[type=file]")

# 3. 直接传入本地文件的完整路径(实现上传)
upload_ele.send_keys("D:\\file\\test.txt")
关键说明
  • 必须定位到页面中type="file"<input>元素(这是 web 控件,可被 Selenium 识别);
  • send_keys()的参数是本地文件的完整路径 + 文件名 (Windows 路径需用\\转义,或用原始字符串r"D:\file\test.txt");
  • 此方法无需点击 "选择文件" 按钮、无需操作系统弹窗,直接完成上传。

浏览器参数设置:定制化启动行为

无头模式设置(无界面运行浏览器)

作用

在不需要可视化界面的场景(如服务器运行、批量自动化),启动浏览器时不显示窗口,节省资源并提升效率。

代码示例(以 Chrome 为例)
python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 1. 创建Chrome选项对象
options = webdriver.ChromeOptions()
# 2. 添加无头模式参数
options.add_argument("--headless")
# 3. 启动Chrome浏览器(带无头模式)
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

页面加载策略(控制页面加载等待逻辑)

作用

通过设置加载策略,调整 Selenium 等待页面加载的规则,适配不同场景的效率需求。

三种加载策略说明
策略值 说明
normal 默认值,等待页面所有资源(DOM、图片、样式等) 完全下载完成
eager 仅等待DOM 结构加载完成,图像、样式等资源可后续加载(提升执行速度)
none 不等待页面加载,直接执行后续代码(完全不阻塞 WebDriver)
代码示例(设置加载策略)
python 复制代码
options = webdriver.ChromeOptions()
# 设置加载策略为"eager"(仅等待DOM加载)
options.page_load_strategy = "eager"

# 启动浏览器(应用加载策略)
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

结语

以上就是 Selenium 自动化测试中窗口、等待、导航、弹窗、文件上传、参数设置的核心操作,这些都是日常自动化脚本的 "基础骨架"------ 掌握这些,就能应对大部分常见的页面交互场景啦~

相关推荐
一位搞嵌入式的 genius15 小时前
深入理解 JavaScript 异步编程:从 Event Loop 到 Promise
开发语言·前端·javascript
m0_5649149215 小时前
Altium Designer,AD如何修改原理图右下角图纸标题栏?如何自定义标题栏?自定义原理图模版的使用方法
java·服务器·前端
飞升不如收破烂~15 小时前
# Spring Boot 跨域请求未到达后端问题排查记录
java·spring boot·后端
AllData公司负责人15 小时前
【亲测好用】数据集成管理能力演示
java·大数据·数据库·开源
阿蒙Amon15 小时前
C#每日面试题-值传递和引用传递的区别
java·面试·c#
aloha_78915 小时前
乐信面试准备
java·spring boot·python·面试·职场和发展·maven
输出输入15 小时前
git和git hub区别
服务器
方安乐15 小时前
react笔记之useCallback
前端·笔记·react.js
Knight_AL15 小时前
Spring Boot 多模块项目中优雅实现自动配置(基于 AutoConfiguration.imports)
java·spring boot·mybatis
短剑重铸之日15 小时前
《RocketMQ研读》面试篇
java·后端·面试·职场和发展·rocketmq