1. 自动化测试基础操作概述作为一名从事自动化测试开发多年的工程师我深知掌握Selenium的基础操作是构建稳定测试框架的基石。很多新手测试工程师在刚开始接触UI自动化时往往急于编写复杂的测试用例却忽略了这些看似简单但至关重要的基础操作。窗口控制、截图保存、弹窗处理和等待机制这四大基础操作构成了Web自动化测试最核心的骨架。在实际项目中我见过太多因为基础操作使用不当导致的测试失败案例。比如窗口大小设置不合理导致元素定位失败、截图命名不规范导致问题追溯困难、弹窗处理不及时引发脚本阻塞以及等待策略不当造成的测试结果不稳定。这些问题看似简单却可能让整个自动化测试项目功亏一篑。本文将基于PythonSelenium组合深入剖析这些基础操作的最佳实践。不同于官方文档的简单示例我会分享在实际企业级项目中验证过的代码模式和避坑经验。无论你是刚入门自动化测试的新手还是希望优化现有测试框架的资深工程师这些内容都将为你提供可直接落地的解决方案。2. 窗口控制实战详解2.1 窗口大小控制的四种方式窗口控制是UI自动化测试的第一步合理的窗口尺寸能确保元素定位的准确性。Selenium提供了四种窗口控制方法每种都有其特定使用场景# 窗口最大化 - 适用于需要全屏操作的测试场景 driver.maximize_window() # 窗口最小化 - 多窗口操作时临时隐藏当前窗口 driver.minimize_window() # 窗口全屏 - 类似F11全屏效果与最大化的区别在于不显示浏览器地址栏 driver.fullscreen_window() # 自定义窗口尺寸 - 精确控制浏览器窗口分辨率 driver.set_window_size(1024, 768)重要提示在移动端测试模拟时必须使用set_window_size设置特定的移动设备分辨率最大化或全屏会导致测试环境与真实设备不符。2.2 企业级窗口控制实践在实际项目中我推荐采用以下窗口控制策略初始化标准化在测试用例的setUp方法中固定窗口尺寸确保测试环境一致性响应式测试针对响应式网页编写分辨率遍历测试逻辑多窗口协同结合窗口句柄管理实现多窗口切换测试def setUp(self): # 初始化固定分辨率 self.driver.set_window_size(1366, 768) def test_responsive(self): # 测试不同分辨率下的页面表现 for width, height in [(1024,768), (1920,1080), (375,812)]: self.driver.set_window_size(width, height) # 执行分辨率相关断言 ...2.3 窗口控制常见问题排查问题1set_window_size在某些浏览器上不生效解决方案确保在get()打开页面之前设置窗口尺寸问题2多显示器环境下窗口位置异常解决方案使用driver.set_window_position(x, y)校准窗口位置问题3Headless模式下窗口控制无效解决方案在ChromeOptions中添加--window-size参数options webdriver.ChromeOptions() options.add_argument(--headless) options.add_argument(--window-size1920,1080)3. 智能截图机制深度解析3.1 基础截图方法与问题最简单的截图方法虽然容易实现但在实际项目中会暴露严重问题driver.save_screenshot(./error.png) # 固定文件名会导致历史截图被覆盖这种写法存在三个致命缺陷多次运行会覆盖历史截图无法区分不同测试用例的截图缺少时间维度信息难以追溯问题3.2 企业级截图解决方案我推荐采用以下截图命名规范已在多个大型项目中验证import datetime def take_screenshot(driver, case_name): timestamp datetime.datetime.now().strftime(%Y%m%d_%H%M%S) filename fscreenshot/{case_name}_{timestamp}.png driver.save_screenshot(filename) return filename进阶技巧截图与日志系统集成失败用例自动截图截图与测试报告关联# 在测试框架中集成自动截图 try: # 测试操作 ... except Exception as e: take_screenshot(driver, self._testMethodName) raise e3.3 截图优化实践全屏截图问题当页面高度超过屏幕高度时传统截图只能截取可视区域解决方案使用JavaScript获取完整页面高度后截图# 获取完整页面高度 total_height driver.execute_script(return document.body.scrollHeight) # 设置窗口高度 driver.set_window_size(driver.get_window_size()[width], total_height) # 执行截图 driver.save_screenshot(fullpage.png)元素局部截图有时只需要特定元素的截图from PIL import Image element driver.find_element(By.ID, target) location element.location size element.size driver.save_screenshot(full.png) # 使用PIL进行图片裁剪 image Image.open(full.png) left location[x] top location[y] right location[x] size[width] bottom location[y] size[height] image image.crop((left, top, right, bottom)) image.save(element.png)4. 弹窗处理高级技巧4.1 弹窗类型识别与处理Web应用中常见的弹窗有三种类型浏览器原生alert/confirm/prompt自定义模态对话框非模态Toast提示对于原生弹窗必须使用switch_to.alert处理alert driver.switch_to.alert alert.accept() # 确认 alert.dismiss() # 取消 alert.send_keys(input text) # prompt输入4.2 弹窗处理最佳实践实践1封装弹窗处理工具类class AlertHelper: staticmethod def accept_alert(driver, timeout3): try: WebDriverWait(driver, timeout).until(EC.alert_is_present()) alert driver.switch_to.alert alert.accept() return True except TimeoutException: return False实践2处理不可预测弹窗def safe_click(element): try: element.click() except UnexpectedAlertPresentException: AlertHelper.accept_alert(driver) element.click() # 弹窗关闭后重试点击4.3 自定义弹窗处理对于非原生弹窗需要按普通元素定位处理# 关闭自定义弹窗 close_btn driver.find_element(By.CSS_SELECTOR, .modal .close) close_btn.click()典型问题弹窗有动画效果导致点击失败 解决方案添加显式等待确保元素可点击WebDriverWait(driver, 3).until( EC.element_to_be_clickable((By.CSS_SELECTOR, .modal .close)) ).click()5. 等待机制深度优化5.1 三种等待机制对比等待类型作用范围超时行为适用场景强制等待(time.sleep)单次等待固定等待调试阶段隐式等待(implicitly_wait)全局元素查找查找元素超时报错简单页面显式等待(WebDriverWait)单次条件条件不满足时报错复杂异步5.2 企业级等待策略黄金法则禁止混用隐式和显式等待生产环境避免使用time.sleep为不同操作设置合理的超时时间推荐配置# 全局隐式等待(基础元素查找) driver.implicitly_wait(5) # 关键操作显式等待(复杂条件) def wait_for_ajax(driver): WebDriverWait(driver, 10).until( lambda d: d.execute_script(return jQuery.active 0) )5.3 高级等待场景场景1等待页面完全加载WebDriverWait(driver, 10).until( lambda d: d.execute_script(return document.readyState) complete )场景2等待元素包含特定文本WebDriverWait(driver, 5).until( EC.text_to_be_present_in_element((By.ID, status), 成功) )场景3等待多个元素中的任意一个出现WebDriverWait(driver, 5).until( EC.any_of( EC.presence_of_element_located((By.ID, element1)), EC.presence_of_element_located((By.CLASS_NAME, element2)) ) )6. 综合实战完整测试用例示例下面展示一个整合了所有基础操作的完整测试用例import unittest import datetime from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class BaiduSearchTest(unittest.TestCase): classmethod def setUpClass(cls): cls.driver webdriver.Chrome() cls.driver.set_window_size(1366, 768) cls.driver.implicitly_wait(5) def test_search_operation(self): try: # 访问百度 self.driver.get(https://www.baidu.com) # 等待搜索框可见 search_box WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located((By.ID, kw)) ) # 输入搜索词 search_box.send_keys(自动化测试) # 等待搜索按钮可点击 search_btn WebDriverWait(self.driver, 5).until( EC.element_to_be_clickable((By.ID, su)) ) search_btn.click() # 等待结果加载 WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.XPATH, //div[idcontent_left])) ) # 断言结果 self.assertIn(自动化测试, self.driver.title) except Exception as e: # 失败时自动截图 timestamp datetime.datetime.now().strftime(%Y%m%d_%H%M%S) self.driver.save_screenshot(ffail_{self._testMethodName}_{timestamp}.png) raise e classmethod def tearDownClass(cls): cls.driver.quit() if __name__ __main__: unittest.main()在这个综合示例中我们实现了标准化的测试初始化和清理合理的窗口尺寸设置智能的混合等待策略自动化的失败截图机制完善的异常处理流程这些基础操作的熟练运用将大幅提升你的自动化测试脚本的稳定性和可维护性。记住好的自动化测试不是由复杂的逻辑堆砌而成而是建立在扎实的基础操作之上。
企业数字化 ERP 产品动态
相关推荐
1.05M还是258K?上下文窗口与Token计数实测 上周有个做代码助手的朋友甩给我两张截图,一张写着 1.05M,一张写着 258K,问同一个模型怎么会有两个上下文长度。我第一反应是这俩数字根本不在一个维度上——1.05M 落在 1,048,576 附近,258K 落在 262,144 附近,两个都… · 2026/11/4 4:09:35
GitHub全球宕机事件深度分析:数据库运维与高可用架构的教训 1. 事件背景与影响范围2023年1月25日,全球最大的代码托管平台GitHub经历了长达8小时23分钟的全球性服务中断,这是该平台自2008年成立以来最严重的一次事故。作为承载超过1亿开发者、托管4亿个代码仓库的基础设施,这次宕机直接导致全球76%的互… · 2026/11/4 4:09:35
蓝牙键盘连接电脑全解析:配对原理、多系统操作与排障指南 蓝牙键盘怎么连接电脑,这个问题看着简单,但我身边至少有五六个人在不同场合被它绊住过:有人插上接收器以为大功告成,结果键盘根本没进入配对模式;有人在系统里搜到了设备,点连接转两圈就失败;还… · 2026/11/4 4:09:35
5个步骤快速上手Hermes Agent:AI助手与量子机器学习框架的完美融合 5个步骤快速上手Hermes Agent:AI助手与量子机器学习框架的完美融合
想要一个能与你共同成长的AI助手吗?Hermes Agent正是这样一个强大的开源AI代理工具,它不仅能帮你处理日常任务,还能轻松集成PennyLane与Qiskit等量子机器学习框… · 2026/11/4 6:09:22
NapCatQQ群管理:加群、禁言、公告4个高频场景的自动化操作指南 NapCatQQ群管理:加群、禁言、公告4个高频场景的自动化操作指南 【免费下载链接】NapCatQQ Modern protocol-side framework based on NTQQ 项目地址: https://gitcode.com/gh_mirrors/na/NapCatQQ
NapCatQQ是基于NTQQ的OneBot框架,把QQ群管理动作… · 2026/11/4 6:09:22
Babel 配置实战:大型项目构建提速的 5 个决策点 Babel 配置实战:大型项目构建提速的 5 个决策点 【免费下载链接】babel-handbook :blue_book: A guided handbook on how to use Babel and how to create plugins for Babel. 项目地址: https://gitcode.com/gh_mirrors/ba/babel-handbook
当一次 clone 后的… · 2026/11/4 6:09:22
Jasna 视频修复 GUI 实战指南:从首启卡红行到激活支持者模型,一次讲透 Jasna 视频修复 GUI 实战指南:从首启卡红行到激活支持者模型,一次讲透 【免费下载链接】jasna Video restoration tool 项目地址: https://gitcode.com/GitHub_Trending/ja/jasna
第一次打开 Jasna,启动窗口卡在"检查中"十几… · 2026/11/4 6:09:22
OpenGlass 拆解:$25 把普通眼镜改成 AI 智能眼镜的完整方案 OpenGlass 拆解:$25 把普通眼镜改成 AI 智能眼镜的完整方案 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass
OpenGlass 这个项目,用一块 XIAO ESP32 S3… · 2026/11/4 6:09:22
Hermes Agent安全最佳实践:终端沙箱、权限管理与命令审计全攻略 Hermes Agent安全最佳实践:终端沙箱、权限管理与命令审计全攻略
Hermes Agent作为一款强大的AI代理工具,在提供高效自动化能力的同时,安全防护至关重要。本文将从终端沙箱隔离、权限精细管控和命令行为审计三个维度,为你全面解析… · 2026/11/4 6:08:22
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46