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
相关产品推荐
相关产品推荐

