前言
- 在
Web
自动化测试中,模拟用户与下拉框(也称为选择框或下拉列表)的交互是一个常见的任务。Selenium
是一个流行的自动化测试工具,它可以通过模拟用户行为来与Web
页面进行交互。本文将介绍在使用Selenium
无头浏览器时,如何有效地进行下拉框选择。
版本说明
Python 3.12.0
最常见的方案
- 网上最常见的方案都是说使用
Select
来选择下拉框,下面是一个简单的示例:
一个简单的html页面
代码语言:html复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Select Dropdown Page</title>
</head>
<body>
<h1>Select Dropdown Example</h1>
<label for="dropdown"></label><select id="dropdown">
<option value="option1">Option 1</option>
<option value="option2">Option 2</option>
<option value="option3">Option 3</option>
</select>
<p id="selectedOption">Selected Option: </p>
<script>
document.getElementById("dropdown").addEventListener("change", function () {
var selectedOption = document.getElementById("selectedOption");
selectedOption.innerText = "Selected Option: " this.value;
});
</script>
</body>
</html>
selenium
使用Select
选择,这里我们使用select_by_visible_text
方法:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
# 初始化WebDriver,指定chrome_options
driver = webdriver.Chrome()
# 打开测试页面
driver.get("xxxxxxx")
# 选择下拉框中的选项
def select_option_by_visible_text(selector, option_text):
select = Select(driver.find_element(By.CSS_SELECTOR, selector))
select.select_by_visible_text(option_text)
# 示例:通过可见文本选择下拉框选项
select_option_by_visible_text("#dropdown", "Option 2")
# 进行其他操作,例如提交表单等
# ...
time.sleep(1000)
# 关闭浏览器
driver.quit()
存在的问题
- 但现实当中我们进行自动化测试、或者爬虫下拉框的时候网页代码可不会这么简单,比如你可能会遇到下面的问题:
1、标签无法选中 ElementNotInteractableException: Message: element not interactable 元素不可见
2、在框架当中可能无法使用 Select,你可能会去选择直接填充输入框,当你高高兴兴填充完你会发现第三个问题
3、填充好的下拉框无法选中,因为下拉选择可能会需要触发对应的事件,当然你也可以去慢慢尝试找到需要执行的事件
- 其实这些你都不需要去做,下面我将介绍一个最强解决方案。
最强解决方案
- 最强的方案其实就是最单纯的方案,即模拟用户的点击过程:
# 拿到可以点击出下拉框的元素标签进行点击 显示下拉框
# 获取所有下拉框元素,遍历选择你需要的元素进行点击选中
# input_1 样式选择器 点击显示下拉框
# select_1 样式选择器 获取所有下拉框元素
# 需要匹配的元素
def auto_fill_select(input_1, select_1, text):
print("开始填充:" text)
WebDriverWait(driver, 60).until(
EC.presence_of_element_located((By.CSS_SELECTOR, input_1))).click()
selects = WebDriverWait(driver, 60).until(
EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, select_1))
)
for element in selects:
if element.text == text:
element.click()
break
- 这里还有一个问题没有解答:样式选择器元素不可见的问题
ElementNotInteractableException
其实这是因为某些样式布局需要在一定条件下才会出现,你需要保证当你使用某个样式选择器时,它存在页面上
又或者你代码中的速度太快,新的样式还没有加载出来,那么你也可能选择不到,你可以暂时的等待元素加载
比如:下拉的元素可能只有下拉框出现时才可以获取
个人简介