软件测试入门到精通-第10周-ui自动化测试-下拉框操作
·
《"点我展开"的艺术:网页下拉框开发与测试全指南》
一、下拉框:网页交互的"折叠菜单大师"

1.1 为什么我们需要下拉框?

想象一下你在填写一个地址表单,如果所有省份、城市、区县选项都平铺展示,那页面长度恐怕要赶上《战争与和平》了!下拉框就像网页版的瑞士军刀:
- 空间魔术师:把100个选项压缩成一个点击按钮
- 防呆设计:让用户只能在预设选项中选择,避免"火星省"这样的奇葩输入
- 视觉清爽剂:比起满屏的单选框,下拉框让界面更简洁优雅
经典战场案例:
- 淘宝收货地址三级联动(省→市→区)
- 航班预订网站的时间选择器
- 企业CRM系统的分类筛选器

1.2 下拉框的"双子星"架构
| 类型 | 技术DNA | 识别特征 |
|---|---|---|
| 标准派 | <select>搭配<option>标签组 | 右键检查能看到标准HTML结构 |
| 整容派 | DIV+CSS+JS打造的视觉系组件 | 通常有炫酷的动画效果 |
注:所谓"整容派"是指那些为了美观完全重写的下拉组件,比如京东城市选择器那个会下雪的特效
二、驯服原生下拉框:Select类三大杀招
2.1 标准select结构解剖课
<!-- 像汉堡一样简单的结构 -->
<select id="burger">
<option value="cheese">芝士汉堡</option>
<option value="double">双层牛肉堡</option>
<option value="spicy">辣味鸡腿堡</option>
</select>

关键点速记:
value是后台识别的暗号- 显示文本是给用户看的"外号"
- 一个select标签就是一个完整的汉堡套餐
2.2 Selenium操作三板斧

方案A:土法炼钢式(不推荐)
# 像没学过快捷键的键盘侠
driver.find_element(By.ID, "burger").click()
time.sleep(2) # 祈祷2秒够用
driver.find_element(By.XPATH, "//option[text()='辣味鸡腿堡']").click()
痛点清单:
- 代码像老太太的裹脚布
- sleep是定时炸弹
- 维护起来想撞墙
方案B:专业工具流(强烈推荐)
from selenium.webdriver.support.ui import Select
# 像米其林大厨一样优雅
burger_menu = Select(driver.find_element(By.ID, "burger"))
burger_menu.select_by_visible_text("双层牛肉堡") # 按文字点餐
# 或者 burger_menu.select_by_value("double") # 按编号点餐
# 又或者 burger_menu.select_by_index(2) # 按顺序点餐(从0开始)

三大绝技对比表:
| 方法名 | 适用场景 | 坑点预警 |
|---|---|---|
| select_by_visible_text() | 选项文字固定时 | 注意多空格问题 |
| select_by_value() | 需要获取后台传值时 | value可能有特殊编码 |
| select_by_index() | 快速测试时 | 顺序变更会引发灾难 |
三、应对自定义下拉框:游击战手册
3.1 识别自定义组件
典型症状:
- 右键检查看不到
<select>标签 - 有
<div class="fancy-dropdown">这类可疑分子 - 展开时有滑动动画效果
3.2 实战五步擒拿手
以美团城市选择器为例:
# 第一步:找到那个欠点的按钮
dropdown_trigger = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ".city-picker"))
)
# 第二步:温柔地点它一下
dropdown_trigger.click()
# 第三步:等选项加载完成(像等外卖一样耐心)
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".city-list"))
)
# 第四步:精准锁定目标(比如选"深圳市")
driver.find_element(By.XPATH, "//li[contains(text(),'深圳')]").click()
# 第五步:确认选择生效(像检查外卖是否少放了辣椒)
WebDriverWait(driver, 10).until(
lambda d: "深圳" in d.find_element(By.CSS_SELECTOR, ".selected-city").text
)
进阶技巧:
- 对付动态加载:多用WebDriverWait少用sleep
- 处理滚动加载:先滚动再点击
- 应对奇葩定位:试试相对XPath或兄弟节点选择
四、下拉框武林排行榜
| 比武项目 | 标准派 | 整容派 |
|---|---|---|
| 开发难度 | ⭐(简单) | ⭐⭐⭐⭐(复杂) |
| 自动化友好度 | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| 颜值水平 | 🎨(Windows 98风格) | 🎨🎨🎨(苹果专卖店风格) |
| 典型代表 | 政府网站表单 | 电商/社交平台 |
五、项目实战生存法则
-
先问再打:遇到下拉框先F12看看是标准select还是自定义组件
-
装备选择:
- 标准派:直接上Select类武器
- 整容派:准备XPath/CSS定位工具包
-
防坑指南:
# 典型坑1:选项动态加载 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.TAG_NAME, "option")) ) # 典型坑2:iframe嵌套 driver.switch_to.frame("iframe-container") -
调试秘籍:
# 打印所有选项检查是否加载成功 options = driver.find_elements(By.TAG_NAME, "option") print([opt.text for opt in options])
终极心法口诀:
标准select用Select,花式组件靠定位
动态加载要等待,iframe里别迷路
先查结构再编码,少走弯路省时间
掌握了这些技巧,你就能在各类下拉框挑战中游刃有余了!下次遇到难搞的下拉框时,记得深吸一口气,默念:“这不过是又一个等待被征服的小组件而已”。
《Selenium玩转下拉框:从"选择困难症"到"精准狙击手"》
——让代码帮你做选择题的艺术
“当测试遇到下拉框,就像直男陪女友逛街——选项太多,选择太难!”
▎开胃菜:认准你的"猎物"
1.1 谁才是你的"菜"?
- 一见钟情型:标准
<select>标签包着<option>小可爱们(HTML原生款) - 高冷拒绝型:那些用JS/Bootstrap搞的花里胡哨"伪下拉框"(需要特殊追求技巧)
举个栗子🌰:
<!-- 这是你能撩的 -->
<select id="city">
<option value="sh">上海</option>
<option value="bj">北京</option>
</select>
<!-- 这是你需要曲线救国的 -->
<div class="fancy-dropdown">...</div> <!-- 需要click()攻略 -->
1.2 为什么它值得爱?
- 效率之王:找准
<select>这个"丈母娘",所有<option>闺女随你挑 - 代码优雅:不用写一堆
find_elements像查户口
▎主菜:三大追求秘籍
2.1 基础操作三连击
from selenium.webdriver.support.select import Select
# 第一步:先搞定"丈母娘"
city_select = Select(driver.find_element(By.ID, "city")) # 注意是Select不是SELECT!
# 第二步:选妃大法(任选其一)
city_select.select_by_index(0) # 霸道总裁式:"我就要第一个!"
city_select.select_by_value("bj") # 务实派:"我要北京户口那个"
city_select.select_by_visible_text("上海") # 浪漫主义:"我要名字最好听的那个"
2.2 方法选择困难症门诊
| 撩妹方式 | 适用场景 | 翻车风险 |
|---|---|---|
| 按颜值顺序 | 选项少且不常变 | 万一小姐姐换座位就尴尬了 |
| 查户口本 | 选项有明确value值 | 大小写不对可能吃闭门羹 |
| 直接叫名字 | 文本固定且可见 | 最稳妥的方式 |
专家建议💡:能叫名字就别查户口,能查户口就别数座位!
▎甜点:实战生存指南
3.1 经典翻车现场
# 错误示范1:认错丈母娘
select = Select(driver.find_element(By.TAG_NAME, "option")) # 这是直接找闺女,会被打
# 错误示范2:记错方法名
select.deselect_by_visible_text("北京") # 这是分手不是追求!
# 错误示范3:急性子操作
select.select_by_index(1)
submit_button.click() # 可能还没选完就提交了!
3.2 老司机保命技巧
- 确认眼神:操作前加个
time.sleep(1)给页面反应时间 - 双重验证:选完用
first_selected_option确认是否成功 - B计划:对于自定义下拉框,准备
click()+send_keys()组合拳
▎餐后总结:选择的艺术
口诀速记:
“原生下拉选妈妈(select),
三种方法任你搭。
自定义的玩点击,
手速要快别拖拉!”
考试重点标记:
- ⚠️
Select()只吃<select>元素 - 💯
select_by_visible_text是老师最爱考点 - 🚫
index方式就像用生日选对象——容易出错
附赠:高频率装X代码模板
def smart_select(driver, element, method, value):
""" 智能选择下拉框的瑞士军刀 """
select = Select(driver.find_element(*element))
{
'index': select.select_by_index,
'value': select.select_by_value,
'text': select.select_by_visible_text
}[method](value)
return f"成功选择:{select.first_selected_option.text}"
# 使用示例
smart_select(driver, (By.ID, "city"), "text", "北京")
最后叮嘱:遇到动态加载的下拉框,记得加上WebDriverWait这颗"后悔药"哦!
更多推荐
所有评论(0)