You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用Selenium Select函数无法选择动态下拉列表值

Selenium动态下拉列表选择失败问题求助

我在编写Selenium自动化脚本时,尝试通过Select函数选择页面中的动态下拉列表选项,但该操作始终无法生效。已尝试多种调试方式仍未找到问题根源,附上相关代码,恳请各位提供帮助,谢谢!

原代码

from selenium import webdriver  
import time  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.remote.webelement import WebElement

driver = webdriver.Chrome('chromedriver')
driver.get('https://devbusiness.tunai.io/login')
time.sleep(2)
driver.maximize_window()

# Create variables for login credentials.
username = "your username"
password = "your password"

username = driver.find_element(By.NAME, "loginUsername");
username.send_keys("kevin@tunai");

password = driver.find_element(By.NAME, "loginPassword");
password.send_keys("xxxxx");

login = driver.find_element(By.XPATH,"//*[@id='app']/div/div/div/div/div/div[2]/form/div[4]/button");
login.submit();
time.sleep(2)

# Wait for login process to complete. 
WebDriverWait(driver=driver, timeout=10).until(
    lambda x: x.execute_script("return document.readyState === 'complete'")
)
# Verify that the login was successful.
error_message = "Incorrect username or password."
# Retrieve any errors found. 
errors = driver.find_elements(By.CLASS_NAME, "flash-error")

# When errors are found, the login will fail. 
if any(error_message in e.text for e in errors): 
    print("[!] Login failed")
else:
    print("[+] Login successful")

driver.get("https://devbusiness.tunai.io/dashboard/salon_menu_service")

service = driver.find_element(By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/button")
service.click();
driver.find_element(By.TAG_NAME,"input").send_keys("Hair Dying")

price = driver.find_element(By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/div/div[2]/div/div/form/div[1]/div[1]/div/div[1]/div[2]/div[1]/div/div/input")
price.clear()
price.send_keys("50")

baseprice = driver.find_element(By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/div/div[2]/div/div/form/div[1]/div[1]/div/div[1]/div[2]/div[2]/div/div/input")
baseprice.clear()
baseprice.send_keys("10")

category = driver.find_element(By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/div/div[2]/div/div/form/div[1]/div[1]/div/div[1]/div[3]/div/div/div/div[2]")
Select.select_by_visible_text("Category 2 - BeautyPOS")
time.sleep(3)

问题分析与修复方案

核心问题点

  1. Select类使用错误:原代码直接调用Select.select_by_visible_text()类方法,正确用法是先实例化Select对象,传入对应的下拉元素后再调用选择方法。
  2. 动态下拉可能非原生<select>标签:很多前端框架(如Element UI、Ant Design)的下拉是用div模拟的,原生Select类无法识别这类元素,需改用点击交互方式。
  3. 等待机制不合理:大量使用time.sleep(),无法确保元素加载完成且可交互,应替换为WebDriverWait+预期条件。

修复后的代码

from selenium import webdriver  
import time  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.remote.webelement import WebElement

driver = webdriver.Chrome('chromedriver')
driver.get('https://devbusiness.tunai.io/login')
driver.maximize_window()

# 登录操作
username = driver.find_element(By.NAME, "loginUsername")
username.send_keys("kevin@tunai")

password = driver.find_element(By.NAME, "loginPassword")
password.send_keys("xxxxx")

login = driver.find_element(By.XPATH,"//*[@id='app']/div/div/div/div/div/div[2]/form/div[4]/button")
login.submit()

# 等待登录完成,改用元素存在判断更可靠
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "page-content")))

# 验证登录结果
error_message = "Incorrect username or password."
errors = driver.find_elements(By.CLASS_NAME, "flash-error")
if any(error_message in e.text for e in errors): 
    print("[!] 登录失败")
else:
    print("[+] 登录成功")

driver.get("https://devbusiness.tunai.io/dashboard/salon_menu_service")

# 等待服务按钮可点击
service = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/button")))
service.click()

# 输入服务名称,优化定位精度
service_input = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='输入服务名称']")))
service_input.send_keys("Hair Dying")

# 处理价格输入
price = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/div/div[2]/div/div/form/div[1]/div[1]/div/div[1]/div[2]/div[1]/div/div/input")))
price.clear()
price.send_keys("50")

baseprice = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/div/div[2]/div/div/form/div[1]/div[1]/div/div[1]/div[2]/div[2]/div/div/input")))
baseprice.clear()
baseprice.send_keys("10")

# 兼容处理下拉列表:优先尝试原生Select,失败则用点击方式
try:
    # 定位原生select元素(需调整xpath到实际的select标签)
    category_element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/div/div[2]/div/div/form/div[1]/div[1]/div/div[1]/div[3]/div/div/div/div[2]/select")))
    select_category = Select(category_element)
    select_category.select_by_visible_text("Category 2 - BeautyPOS")
except:
    # 模拟下拉框的处理方式
    # 点击下拉触发器展开选项
    dropdown_trigger = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='page-content']/div/div[2]/div[1]/div[1]/div/div[2]/div/div/form/div[1]/div[1]/div/div[1]/div[3]/div/div/div")))
    dropdown_trigger.click()
    # 等待目标选项并点击
    target_option = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='Category 2 - BeautyPOS']")))
    target_option.click()

time.sleep(3)
driver.quit()

关键修复说明

  • 修正Select类调用逻辑:必须先实例化Select(元素对象),再调用select_by_visible_text()方法。
  • 替换所有time.sleep()为WebDriverWait+预期条件,确保元素加载完成后再操作,提升稳定性。
  • 增加非原生下拉框的兼容处理:如果原生Select无效,改用点击下拉触发器+选择目标选项的方式。
  • 优化元素定位精度,避免By.TAG_NAME这类宽泛定位,减少元素匹配错误。

内容的提问来源于stack exchange,提问作者Carl Carl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:20:42