复杂控件交互:处理 UI 自动化中的各类「特殊需求」
在 Web UI 自动化中,不仅需要点击按钮、输入文字,还经常需要处理下拉选择、单/复选框以及繁琐的 Iframe 嵌套结构。
1. 下拉框选择 (Select)
Selenium 提供了 Select 类,专门用于处理标准的 HTML <select> 标签。
PYTHON
from selenium.webdriver.support.select import Select
# 1. 定位元素并初始化对象
select_ele = driver.find_element(By.ID, 's1Id')
s_obj = Select(select_ele)
# 2. 选择方法
s_obj.select_by_visible_text('Option 3') # 最贴近人类行为(推荐)
s_obj.select_by_value('v3') # 效率最高(适合后端数据驱动)
2. 单选框 (Radio) 与 复选框 (Checkbox)
本质上,这些控件仍然是 <input> 标签,操作核心是:检查状态 -> 点击。
幂等性操作
使用 .is_selected() 来确保你的操作是幂等的(即重复执行结果一致)。
PYTHON
checkbox = driver.find_element(By.ID, 'checkbox1')
if not checkbox.is_selected():
checkbox.click()
3. Iframe 窗口切换
Iframe(内联框架)是自动化中的「隐形门」。直接定位报错通常是因为你还没从主 HTML 「跨进」框架。
- 进入框架:
driver.switch_to.frame(id/name/element) - 退出到顶层:
driver.switch_to.default_content()
如何验证切换成功?(Evidence Chain)
- 进入验证: 切换后,尝试定位框架内特有的元素(如 ID 为
frame_header的文本)。如果定位成功,说明已进入。 - 退出验证: 退出后,尝试定位主页面特有的元素。
4. 多窗口处理:Handle 机制
当点击链接打开新标签页时,WebDriver 的焦点仍然留在原窗口。
PYTHON
# 获取当前所有窗口的句柄
all_handles = driver.window_handles
# 切换到最新的窗口
driver.switch_to.window(all_handles[-1])
验证证据:
检查 driver.title 或 driver.current_url 是否符合新页面的预期,作为切换成功的断言依据。
5. 自动化「黑科技」:JS 注入
应对只读属性 (readonly) 或复杂的日期控件,JS 是最后的杀手锏。
PYTHON
# 去除只读属性
js_code = "document.getElementById('date_picker').removeAttribute('readonly');"
driver.execute_script(js_code)
综合实战建议
- 切换后遗症: 进入 Iframe 后,如果代码需要操作主页面元素,必须先执行
switch_to.default_content()。 - 等待窗口加载: 切换新窗口前,建议使用显式等待
EC.number_of_windows_to_be(2),确保新窗口已完全弹出。
继续阅读: Web自动化-鼠标键盘模拟与滚动机制