Selenium调用send_keys无法触发NSE网站自动补全建议问题
解决方法
1. 模拟真实输入节奏,替换固定延迟
NSE的搜索接口可能对输入频率做了检测,固定sleep的节奏不符合真实用户行为。改用随机小延迟模拟自然打字:
from random import uniform # ... 其他代码保持不变 search_box = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#hsa-symbol"))) search_box.click() search_box.clear() # 逐字符输入,每个字符后加0.3-0.8秒随机延迟 for char in "ITC": search_box.send_keys(char) sleep(uniform(0.3, 0.8))
2. 触发完整输入事件,避免事件缺失
有些网站的自动补全需要input或keyup事件触发,Selenium默认的send_keys可能没完全模拟。可以用JavaScript手动触发事件:
# 直接设置值并触发input事件 search_box = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#hsa-symbol"))) search_box.click() driver.execute_script(""" arguments[0].value = 'ITC'; arguments[0].dispatchEvent(new Event('input')); """, search_box)
3. 等待建议列表内容加载完成,而非仅元素存在
原代码只等待列表容器存在,不保证内容已加载。改用visibility_of_element_located,并等待有效选项出现:
# 等待列表可见 WebDriverWait(driver, 15).until( EC.visibility_of_element_located((By.ID, "hsa-symbol_listbox")) ) # 等待非"No record found"的选项出现,超时则忽略 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#hsa-symbol_listbox li:not(.ui-autocomplete-no-results)")) ) except: pass suggestion_list = driver.find_element(By.ID, "hsa-symbol_listbox") print(suggestion_list.text)
4. 统一搜索框定位,避免元素失效
原代码重复定位搜索框可能导致StaleElementReferenceException,直接复用同一个可交互元素:
# 合并定位逻辑,只定位一次可交互的搜索框 search_box = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#hsa-symbol"))) search_box.click() search_box.clear() # 后续直接使用该元素输入 search_box.send_keys("ITC")
5. 更新ChromeDriver与浏览器版本
原代码使用的Chrome 91版本过于老旧,可能存在兼容性问题。确保Chrome浏览器和ChromeDriver版本完全匹配(建议使用最新稳定版)。
内容的提问来源于stack exchange,提问作者Krishnendu Dutta
相关产品推荐
相关产品推荐

