目录

一、为什么 90% 的 UI 自动化脚本活不过 3 个月?

二、Selenium必会 API 速查

三、实践

四、10 大高频异常“症状 → 病因 → 处方”

五、可复用的工具函数

六、面试高频追问(附标准答案)

一、为什么 90% 的 UI 自动化脚本活不过 3 个月?

  • 元素定位“玄学”——今天跑通、明天 404

  • 等待策略“拍脑袋”——隐式、显式、sleep 乱用一通

  • 验证码、iframe、多窗口、动态 ID……一步一坑

本文主要关于常见Selenium应用API和常见问题处理。


二、Selenium必会 API 速查

  •     定位元素
    • element = 浏览器对象.find_element(by=By.定位方式,value="属性值")
  • 常见操作

    • 模拟点击:element.click()

    • 模拟输入:element.send_keys()

    • 模拟清除:element.clear()

  • 浏览器操作

    • 浏览器最大化driver.maximize_window()

    • 浏览器刷新driver.refresh()

    • 浏览器前进:driver.forward()

    • 浏览器后退:driver.back()

    • 获取标题:driver.title

    • 获取网页地址:driver.current_url

  • 页面元素判断

    • 元素是否可见:element.is_displayed()

    • 元素是否可用:element.is_enabled()

    • 元素是否选中element.is_selected ()

  • 滚动条处理

    • 定义js字符串:js = "window.scrollTo(0,1000)"

    • 执行js字符串:driver.execute_script(js)

  • 弹出框处理

    • 自定义弹框:通过元素定位后直接处理

    • JS弹框

      • alert:告警框

      • confirm:确认框

      • prompt:普通提示框

alert= driver.switch_to.alert #获取弹出框对象,三种弹出框,在对象获取的时候都一样
alert.text #获取弹出框文本
alert.accept() #接受弹出框,弹出框处理方法
alert.dismiss() #取消弹出框,弹出框处理方法,确认框没有取消按钮,取消方法一样生效
  • 鼠标操作

#导包
from selenium.webdriver import Actionchains#实例化鼠标对象
action = ActionChains(driver)#调用鼠标方法,element表示元素对象
action.move_to_element(element) #鼠标悬停action.context_click(element) #鼠标右击action.double_click(element) #鼠标双击action.drag_and_drop(source, target) #拖拽#执行鼠标操作,调用鼠标方法并不会去执行鼠标操作,必须调用perform才会执行
action.perform()
  • 下拉框操作

    Select类:只适用于HTML原生态的下拉框,即<select>+<option>的组合标签

    #1.导包
    from selenium.webdriver.support.select import Select#2.创建select对象
    select = Select(element)#3.选择选项
    select.select_by_index(index) #根据下标select.select_by_value(value) #根据选项value属性值select.select_by_visible_text(text) #根据选项文本

三、实践

场景推荐写法(Selenium 4 新语法)一句话提醒
元素定位driver.find_element(By.CSS_SELECTOR, "#username")拒绝 find_element_by_* 老语法,PyCharm 已标黄
等待元素可见WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//button[text()='立即购买']")))显式等待优先,隐式等待只做“兜底”
下拉框Select(driver.find_element(By.ID, "city")).select_by_visible_text("上海")仅适用于原生 <select>,自定义组件请用点击组合
鼠标悬停ActionChains(driver).move_to_element(menu).perform()99% 的“悬浮才显示”坑都能用这一行解决
滚动到元素driver.execute_script("arguments[0].scrollIntoView({block:'center'});", element)滚动到中心,避免被固定 header 遮挡
新窗口driver.switch_to.window(driver.window_handles[-1])句柄按出现顺序压栈,-1 永远是最新窗口
frame 切回driver.switch_to.default_content()嵌套 frame 请一层一层切,别“跳级”
截图取证driver.save_screenshot(f"./evidence/{case_name}_{timestamp}.png")目录提前建好,png 无损且 Jenkins 可预览
高亮标记driver.execute_script("arguments[0].setAttribute('style', 'border:3px solid red');", elem)失败截图前高亮,一眼看出哪个元素出错

四、10 大高频异常“症状 → 病因 → 处方”

症状病因定位清单(按概率排序)处方(复制即用)
NoSuchElementException1. 动态 ID / 随机 class

 
1. 改用 CSS “稳态”属性,[data-testid="loginBtn"]
 
ElementClickIntercepted被蒙层/吐司/固定 header 遮挡滚动到中心 + JS 点击:driver.execute_script("arguments[0].click()", elem)
StaleElementReferenceDOM 整片刷新(Vue/React)重新定位 + 显式等待,禁止把 WebElement 当“长期变量”
TimeoutException显式等待条件写错用 EC.presence_of_element_located 还是 visibility_of_element_located?前者只判 DOM,后者判可视
验证码阻挡公司无白名单① 万能验证码 8888 配置
 
文件上传弹窗不是网页元素直接 send_keys(绝对路径) 到 <input type=file>,AutoIt 已过时
下载弹窗Chrome 每次询问启动参数加:prefs = {"download.default_directory": "/tmp", "download.prompt_for_download": False}
内存暴涨未关窗口、日志堆积每条用例结束 driver.quit() + 日志轮转
多线程串包全局静态 driver用 threading.local() 或 pytest-xdist 的 --dist=loadgroup
360/安全软件拦截WebDriver 被识别加启动参数:--disable-blink-features=AutomationControlled + 替换 cdc_ 变量(Selenium-Stealth)

五、可复用的工具函数

# utils/selenium_helper.py
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutExceptionclass SeleniumHelper:def __init__(self, driver):self.driver = driverdef wait_and_click(self, locator: tuple, timeout=10):"""等待元素可见并点击"""WebDriverWait(self.driver, timeout).until(EC.visibility_of_element_located(locator)).click()def wait_iframe_and_switch(self, iframe_locator: tuple, timeout=10):"""等待 iframe 出现并切换进入"""WebDriverWait(self.driver, timeout).until(EC.frame_to_be_available_and_switch_to_it(iframe_locator))def back_to_default_content(self):self.driver.switch_to.default_content()def upload_file(self, input_locator: tuple, file_path: str):"""原生上传"""self.driver.find_element(*input_locator).send_keys(file_path)def set_cookies_from_dict(self, cookies: dict):"""一键注入登录态,跳过验证码"""self.driver.get("https://xxx.com")  # 先访问同域空白页for k, v in cookies.items():self.driver.add_cookie({"name": k, "value": v})self.driver.refresh()

六、面试高频追问(附标准答案)

  1. 隐式等待与显式等待能否同时用?
    答:可以,但隐式等待会拖慢显式等待的轮询效率,Selenium 官方建议二选一;生产环境统一用显式等待。

  2. 如何判断元素是否在 iframe?
    答:Chrome DevTools → Elements → 搜索 //iframe,看目标节点是否被 <iframe> 包裹;脚本里捕获 NoSuchElementException 后重试 driver.switch_to.frame()

  3. 验证码到底要不要自动化?
    答:QA 职责是“测试业务主路径”,不是“破解验证码”。优先让开发配置万能验证码或关闭验证码;次选注入 Cookie;OCR 识别成本最高,ROI 最低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95294.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95294.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95294.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序】微信小程序基于双token的API请求封装与无感刷新实现方案

文章目录前言一、设计思路二、执行流程三、核心模块3.1 全局配置3.2 request封装3.2.1 request方法配置参数3.2.2 请求预处理3.2.3 核心请求流程3.3 刷新accessToken3.4 辅助方法四、api封装示例总结前言 现代前后端分离的模式中&#xff0c;一般都是采用token的方式实现API的…

基于单片机醉酒驾驶检测系统/酒精检测/防疲劳驾驶设计

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 该设计基于单片机开发&#xff0c;旨在通过实时检测驾驶员酒精浓度&#xff0c;预防酒后驾驶行为…

第6章:垃圾回收分析与调优

1. 垃圾回收基础 1.1 Java 垃圾回收概述 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;是 Java 虚拟机自动内存管理的核心机制。理解 GC 的工作原理对于 Java 应用性能调优至关重要。 1.1.1 垃圾回收的目标 自动内存管理&#xff1a;无需手动释放内存防止…

ROS2核心模块-动作通信、参数服务

动作通信 机器人导航到某个目标点,此过程需要一个节点A发布目标信息&#xff0c;然后一个节点B接收到请求并控制移动&#xff0c;最终响应目标达成状态信息。 乍一看&#xff0c;这好像是服务通信实现&#xff0c;因为需求中要A发送目标&#xff0c;B执行并返回结果&#xff0c…

word文档封面中文件编号等标题和内容无法对齐

问题 word文档封面中文件编号等标题和内容无法对齐&#xff0c;因为标题使用的是底纹不是文件内容。 解决办法 字体大小、行距两者配合就可以解决。

163起融资,梅卡曼德融资额夺冠,钉钉、百度智能云10周年,汉桑科技IPO| 2025年8月人工智能投融资观察 · 极新月报

“ 二级的活跃会传导到一级吗&#xff1f;”文&#xff5c;云舒&小鱼编辑 | 小白出品&#xff5c;极新8月重点关注&#xff1a;1、八月人工智能领域投融资事件163起&#xff0c;披露金额76.8亿人民币。2、亿级人民币以上金额的投资事件共20起 。3、八月人工智能领域发生一起…

微信小程序预览和分享文件

预览文档previewFile(val) { let item val.currentTarget.dataset.item wx.downloadFile({url: item.filePath, // 替换为实际的文件地址success: function (res) {let filePath ${wx.env.USER_DATA_PATH}/${item.fileName}|| res.tempFilePath //查看的文件名wx.openDocumen…

开源 C++ QT Widget 开发(十二)图表--环境监测表盘

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 C QT Widget 开发&#xff08;一&#xff09;工程文件结构-CSDN博客 开源…

ARMv8架构01 - ARM64架构寄存器基础

一 、ARM64架构基础 1 ARMv8 A 架构介绍 ARMv8 - A是ARM公司发布的第一代支持64位处理器的指令集和架构。它在扩充64位寄存器的同时提供对上一代架构指令集的兼容&#xff0c;因而能同时提供运行 32位 和 64位应用程序的执行环境。 超大物理地址空间&#xff08;large Physical…

flutter专栏--深入剖析你的第一个flutter应用

使用fvm管理flutter版本 如果你有使用多版本flutter的需求&#xff0c;那么fvm将会给你提供较大的帮助。下面我列举一下mac flutter3.35.2的版本的操作命令&#xff0c;完成之后&#xff0c;你将可以随意切换flutter版本 # 下载fvm相关的依赖 brew tap leoafarias/fvm brew …

MongoDB 聚合查询超时:索引优化与分片策略的踩坑记录

人们眼中的天才之所以卓越非凡&#xff0c;并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 &#x1f31f; Hello&#xff0c;我是Xxtaoaooo&#xff01; &#x1f308; “代码是逻辑的诗篇&#xff…

Augmentcode免费额度AI开发WordPress商城实战

Augment AI开发WordPress商城实战&#xff1a;从零构建到免费额度续杯完整指南 前言 在AI编程工具日益普及的今天&#xff0c;如何高效利用这些工具来开发实际项目成为了开发者关注的焦点。本文将详细介绍如何使用Augment AI从零开始构建一个功能完整的WordPress商城系统&#…

【C++八股文】数据结构篇

一、单例模式优化实现 原代码问题分析 ​内存序重排序风险​&#xff1a;双重检查锁在C中可能因指令重排导致半初始化对象被访问​锁粒度过大​&#xff1a;每次获取实例都需要加锁&#xff0c;影响性能​线程安全性不足​&#xff1a;未考虑C11前的内存模型问题 改进方案&a…

并发编程——15 线程池ForkJoinPool实战及其工作原理分析

1 一道算法题引发的思考及其实现 1.1 算法题 问&#xff1a;如何充分利用多核 CPU 的性能&#xff0c;快速对一个2千万大小的数组进行排序&#xff1f; 这道题可以通过归并排序来解决&#xff1b; 1.2 什么是归并排序&#xff1f; 归并排序&#xff08;Merge Sort&#xff…

Kafka面试精讲 Day 6:Kafka日志存储结构与索引机制

【Kafka面试精讲 Day 6】Kafka日志存储结构与索引机制 在“Kafka面试精讲”系列的第6天&#xff0c;我们将深入剖析 Kafka的日志存储结构与索引机制。这是Kafka高性能、高吞吐量背后的核心设计之一&#xff0c;也是中高级面试中的高频考点。面试官常通过这个问题考察候选人是否…

Linux 字符设备驱动框架学习记录(三)

Linux字符设备驱动开发新框架详解 一、新旧驱动框架对比 传统字符设备驱动流程 手动分配设备号 (register_chrdev_region)实现file_operations结构体使用mknod手动创建设备节点 新式驱动框架优势 自动设备号分配&#xff1a;动态申请避免冲突自动节点创建&#xff1a;通过class…

《计算机网络安全》实验报告一 现代网络安全挑战 拒绝服务与分布式拒绝服务攻击的演变与防御策略(1)

目 录 摘 要 一、研究背景与目的 1.1 介绍拒绝服务&#xff08;DoS&#xff09;和分布式拒绝服务&#xff08;DDoS&#xff09;攻击的背景 &#xff08;1&#xff09;拒绝服务攻击&#xff08;DoS&#xff09;  &#xff08;2&#xff09;分布式拒绝服务攻击&#xff0…

深度学习篇---模型组成部分

模型组成部分&#xff1a;在 PyTorch 框架下进行图像分类任务时&#xff0c;深度学习代码通常由几个核心部分组成。这些部分中有些可以在不同网络间复用&#xff0c;有些则需要根据具体任务或网络结构进行修改。下面我将用通俗易懂的方式介绍这些组成部分&#xff1a;1. 数据准…

关于ANDROUD APPIUM安装细则

1&#xff0c;可以先参考一下连接 PythonAppium自动化完整教程_appium python教程-CSDN博客 2&#xff0c;appium 需要对应的版本的node&#xff0c;可以用nvm对node 进行版本隔离 3&#xff0c;对应需要安装android stuido 和对应的sdk &#xff0c;按照以上连接进行下载安…

八、算法设计与分析

1 算法设计与分析的基本概念 1.1 算法 定义 &#xff1a;算法是对特定问题求解步骤的一种描述&#xff0c;是有限指令序列&#xff0c;每条指令表示一个或多个操作。特性 &#xff1a; 有穷性&#xff1a;算法需在有限步骤和时间内结束。确定性&#xff1a;指令无歧义&#xff…