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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:34:55