Selenium模拟按下向下箭头和回车键无响应如何解决?
问题原因
- 输入搜索关键词后,站点的联想下拉列表需要异步加载渲染,输入文本后立即触发箭头按键时,下拉列表还未完全加载,按键事件无对应可交互的联想项,因此不会生效。
- 无间隔连续触发两次按键事件,部分站点的前端事件监听逻辑无法响应过快的连续输入,会直接丢弃事件。
解决方法
优先选择直接点击联想项的方案,比模拟按键兼容性更高、稳定性更强,修改后的代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from webdriver_manager.chrome import ChromeDriverManager import time link = "https://www.bcassessment.ca/" options = Options() options.add_argument("start-maximized") options.add_argument('window-size=1920x1080') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') srv=Service(ChromeDriverManager().install()) driver = webdriver.Chrome (service=srv, options=options) waitWebDriver = WebDriverWait (driver, 10) driver.get (link) # 定位搜索框并输入关键词 search_input = waitWebDriver.until(EC.element_to_be_clickable((By.XPATH, "//input[@id= 'rsbSearch']"))) search_input.send_keys("106 Maple") # 等待第一个联想项加载完成后直接点击 first_suggest_item = waitWebDriver.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "li.rsbListItem:first-child"))) first_suggest_item.click() time.sleep(500)
如果必须使用模拟按键的实现方式,只需要在各操作之间加入短暂等待,保证前端逻辑完成渲染和事件响应即可,对应代码替换如下:
search_input.send_keys("106 Maple") # 等待下拉列表渲染完成 time.sleep(0.5) search_input.send_keys(Keys.ARROW_DOWN) # 等待联想项选中状态触发 time.sleep(0.2) search_input.send_keys(Keys.ENTER)
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

