Selenium 特殊控件操作与 ActionChains 实践详解

1. 下拉框单选操作

(a) 使用 Selenium Select 类(标准 HTML <select> 标签)

Selenium 提供了内置的 Select 类用于操作标准下拉框,这种方式简单且直观。

复制代码
from selenium.webdriver.support.ui import Select

# 定位下拉框
dropdown = Select(driver.find_element("id", "dropdown_id"))

# 通过以下三种方式选择单个选项
dropdown.select_by_visible_text("Option Text")  # 根据选项文本选择
dropdown.select_by_value("option_value")        # 根据选项的 value 属性选择
dropdown.select_by_index(2)                     # 根据选项的索引(从 0 开始)选择

# 验证选择
assert dropdown.first_selected_option.text == "Option Text"
(b) 自定义下拉框操作(非 <select> 元素)

对于一些自定义的下拉框(如通过 <div><ul> 实现),需通过点击元素来实现。

复制代码
from selenium.webdriver.common.action_chains import ActionChains

# 点击下拉框以显示选项
dropdown = driver.find_element("xpath", "//div[@class='dropdown']")
ActionChains(driver).click(dropdown).perform()

# 选择指定选项
option = driver.find_element("xpath", "//li[text()='Option Text']")
ActionChains(driver).click(option).perform()

2. 下拉框多选操作

多选下拉框允许选择多个选项,以下是多种实现方式:

(a) 标准多选框(带 <select multiple> 标签)

使用 Select 类的多选功能:

复制代码
from selenium.webdriver.support.ui import Select

# 定位多选框
multi_select = Select(driver.find_element("id", "multi_select_id"))

# 选择多个选项
multi_select.select_by_visible_text("Option 1")
multi_select.select_by_visible_text("Option 2")

# 验证已选项
selected_options = [option.text for option in multi_select.all_selected_options]
assert "Option 1" in selected_options and "Option 2" in selected_options

取消选择:

复制代码
# 取消某个选项
multi_select.deselect_by_visible_text("Option 1")

# 取消所有选项
multi_select.deselect_all()
(b) 自定义多选框

对于通过自定义元素实现的多选框,通常需要结合按键操作(如 Ctrl 键)或单独点击多个选项。

方式 1:逐个点击选项
复制代码
# 定位并点击每个选项
options = driver.find_elements("xpath", "//ul[@class='multi-select']/li")
for option in options:
    if option.text in ["Option 1", "Option 2"]:
        ActionChains(driver).click(option).perform()
方式 2:使用键盘操作(按住 Ctrl 键)
复制代码
from selenium.webdriver.common.keys import Keys

# 定位多个选项
option1 = driver.find_element("xpath", "//li[text()='Option 1']")
option2 = driver.find_element("xpath", "//li[text()='Option 2']")

# 使用 Ctrl 键选择多个选项
ActionChains(driver).key_down(Keys.CONTROL).click(option1).click(option2).key_up(Keys.CONTROL).perform()

3. 时间控件操作(多种实现方式)

(a) 使用日期选择器点击指定日期

常见的时间控件通过点击显示的日历来选择日期。

复制代码
# 打开时间控件
date_picker = driver.find_element("id", "date_picker_id")
ActionChains(driver).click(date_picker).perform()

# 选择具体日期
specific_date = driver.find_element("xpath", "//td[@data-date='2025-01-01']")
ActionChains(driver).click(specific_date).perform()
(b) 输入日期字符串(通过输入框)

某些时间控件允许直接输入日期。

复制代码
# 定位时间输入框
date_input = driver.find_element("id", "date_input")

# 输入日期并提交
date_input.clear()
date_input.send_keys("2025-01-01")
date_input.send_keys(Keys.ENTER)
(c) 滑动时间控件(滑块式时间选择)

对于带滑块的时间选择控件,使用 drag_and_drop_by_offset

复制代码
# 定位滑块
slider = driver.find_element("id", "time_slider")

# 拖动滑块
ActionChains(driver).drag_and_drop_by_offset(slider, 50, 0).perform()

4. ActionChains 的详细应用场景

ActionChains 是 Selenium 处理复杂交互的核心工具。以下是针对不同场景的使用说明:

(a) 鼠标操作
  • 单击和双击:
复制代码
# 单击
element = driver.find_element("id", "clickable_element")
ActionChains(driver).click(element).perform()

# 双击
ActionChains(driver).double_click(element).perform()
  • 右键点击:
复制代码
# 右键点击
ActionChains(driver).context_click(element).perform()
  • 悬停操作:
复制代码
# 鼠标悬停
hover_element = driver.find_element("id", "hoverable_element")
ActionChains(driver).move_to_element(hover_element).perform()
(b) 键盘操作
  • 组合按键:
复制代码
from selenium.webdriver.common.keys import Keys

# 按住 Shift 键并输入文本
input_box = driver.find_element("id", "input_box")
ActionChains(driver).key_down(Keys.SHIFT).send_keys_to_element(input_box, "text").key_up(Keys.SHIFT).perform()
  • 快捷键操作:
复制代码
# Ctrl + A 全选
input_box = driver.find_element("id", "input_box")
ActionChains(driver).click(input_box).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()
(c) 拖放操作
  • 基本拖放:
复制代码
source = driver.find_element("id", "drag_source")
target = driver.find_element("id", "drop_target")
ActionChains(driver).drag_and_drop(source, target).perform()
  • 拖放到指定偏移位置:
复制代码
ActionChains(driver).drag_and_drop_by_offset(source, 100, 0).perform()

通过结合以上不同方式,可以实现从简单到复杂的自动化交互,满足各种 UI 测试场景的需求。

相关推荐
你我一见如故16 小时前
仿QQ音乐桌面客户端——测试报告
python·selenium
测试199819 小时前
接口自动化测试的全面解析与实战指南
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
YakProject1 天前
如何让 AI Agent 跑得更快???
人工智能·测试工具·网络安全·agent·yakit·yaklang
测试19982 天前
Selenium 无法定位元素的几种解决方案
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
慧都小项2 天前
夜间Web回归跑到一半停了?TestComplete 15.83提升批量测试稳定性
前端·测试工具·数据挖掘·回归·汽车·web
Luminbox紫创测控2 天前
汽车前照灯阳光灼烧:光学热仿真与太阳光模拟器验证
人工智能·测试工具·汽车·安全性测试·测试标准
东莞市奥普新音频技术有限公司2 天前
国产音频分析仪怎么选?从性能参数、测试软件到自动化能力
人工智能·科技·测试工具·自动化·音视频·音频
flower_drop2 天前
测试 Android,不必再在 ADB、投屏、日志之间来回切换
测试工具
我的xiaodoujiao2 天前
Django 基础知识详细图文教程 1-Django 介绍
后端·python·学习·测试工具·django
belldeep3 天前
python:Selenium 4.47 编码新的写法
python·selenium