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

Selenium WebDriver的Keys在Windows可用但Mac失效的原因及解决办法

问题描述

从selenium.webdriver.common.keys import Keys导入的Keys.ARROW_DOWN在Windows环境可正常触发下拉列表的选择事件,但在Mac环境中,下拉列表虽被点击,却无法触发向下箭头事件。需要实现跨Windows/Mac环境的兼容运行。

相关代码片段:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get("https://permits.mynevadacounty.com/CitizenAccess/Cap/CapHome.aspx?module=Building&TabName=Building")
wait = WebDriverWait(driver, 20)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "img[src='/CitizenAccess/nc-horizontal.png']")))
wait.until(EC.element_to_be_clickable((By.ID, "ctl00_PlaceHolderMain_lblGSLoadASI"))).click()
wait.until(EC.visibility_of_element_located((By.ID, "ctl00_PlaceHolderMain_divGSASITResult")))

# 日期输入逻辑省略...

res_commer_select = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_PlaceHolderMain_asiGSForm_NEVCO_ddl_0_0")))
res_commer_select.click()
# 该行在Mac环境失效
res_commer_select.send_keys(Keys.ARROW_DOWN)

time.sleep(10)
driver.quit()

可能原因与解决方案

1. 检查ChromeDriver与Chrome版本兼容性

Mac环境下ChromeDriver和Chrome浏览器版本不匹配是常见原因。执行以下步骤确认:

  • 打开Chrome,通过「设置→关于Chrome」查看浏览器版本
  • 终端执行chromedriver --version查看驱动版本
  • 确保两者主版本号一致(如Chrome 119对应ChromeDriver 119),不一致则下载对应版本的ChromeDriver替换。

2. 使用Select类处理标准下拉框(优先推荐)

如果目标元素是标准<select>标签,直接用Selenium的Select类操作,跨环境兼容性远优于模拟键盘:

from selenium.webdriver.support.ui import Select

# 替换原有的click+send_keys逻辑
res_commer_select = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_PlaceHolderMain_asiGSForm_NEVCO_ddl_0_0")))
select = Select(res_commer_select)
# 可通过索引、值或文本选择选项
select.select_by_index(1)  # 选择第二个选项(索引从0开始)
# 或 select.select_by_value("选项对应value值")
# 或 select.select_by_visible_text("选项显示文本")

3. 针对自定义下拉框的替代方案

如果是前端自定义的下拉框(非<select>标签),尝试以下两种方式:

方式一:用ActionChains模拟按键

from selenium.webdriver.common.action_chains import ActionChains

res_commer_select = wait.until(EC.element_to_be_clickable((By.ID, "ctl00_PlaceHolderMain_asiGSForm_NEVCO_ddl_0_0")))
res_commer_select.click()
# 等待下拉选项加载完成
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "下拉选项的CSS选择器")))
# 用ActionChains发送箭头键
ActionChains(driver).send_keys(Keys.ARROW_DOWN).perform()

方式二:直接定位并点击目标选项

跳过模拟键盘操作,直接找到下拉列表中的目标选项元素点击:

res_commer_select = wait.until(EC.element_to_be_clickable((By.ID, "ctl00_PlaceHolderMain_asiGSForm_NEVCO_ddl_0_0")))
res_commer_select.click()
# 等待选项出现后直接点击
target_option = wait.until(EC.element_to_be_clickable((By.XPATH, "//xpath定位到目标选项")))
target_option.click()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:48:11