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

Selenium向搜索输入框send_keys触发TimeoutException的技术问询

问题描述

我想通过代码向搜索输入框发送文本,但一直触发TimeoutException,多次尝试都无效。我试过用CSS_SELECTOR、XPATH、TAGNAME等方式定位元素,发现一个特殊现象:进入目标页面后,未手动点击该输入框时,浏览器控制台查询元素返回null;手动点击并检查元素后,控制台就能正常找到对应元素。

错误信息

Traceback (most recent call last):
  File "c:\Users\rana\OneDrive - \Desktop\auto\new.py", line 49, in <module>
    search_input = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div/div/div[2]/div[2]/div/div[1]/div[1]/div[1]/div[2]/input')))
  File "C:\Users\rana\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\support\wait.py", line 95, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
Stacktrace:
        GetHandleVerifier [0x006137C3+48947]
        (No symbol) [0x005A8551]
        (No symbol) [0x004AC92D]
        (No symbol) [0x004D9E38]
        (No symbol) [0x004D9EFB]
        (No symbol) [0x00508EF2]
        (No symbol) [0x004F50D4]
        (No symbol) [0x005075DA]
        (No symbol) [0x004F4E86]
        (No symbol) [0x004D16C7]
        (No symbol) [0x004D284D]
        GetHandleVerifier [0x0085FDF9+2458985]
        GetHandleVerifier [0x008A744F+2751423]
        GetHandleVerifier [0x008A1361+2726609]
        GetHandleVerifier [0x00690680+560624]
        (No symbol) [0x005B238C]
        (No symbol) [0x005AE268]
        (No symbol) [0x005AE392]
        (No symbol) [0x005A10B7]
        BaseThreadInitThunk [0x762400C9+25]
        RtlGetAppContainerNamedObjectPath [0x77157B1E+286]
        RtlGetAppContainerNamedObjectPath [0x77157AEE+238]

代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

options = Options()
options.add_experimental_option("detach",True)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),
options=options)


driver.maximize_window()
driver.get('https://10.225.244.12/mito/webpage/mito/home#no-back-button')

actions = ActionChains(driver)
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,'details-button'))).click()
driver.find_element(By.ID,'proceed-link').click()
if driver.title == "MITO":
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.modal-body')))
    js = 'return document.querySelector("div[class=modal-body]").textContent.includes("Session Expired")'
    if driver.execute_script(js):
        print('success')
        WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div/div/div[2]/button'))).click()
    else:
        print("session expired message not found")
    username = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, 'username')))
    passwd = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, 'password')))
    loginBtn = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, 'btnLogin')))
    time.sleep(3)
    username.send_keys("username")
    passwd.send_keys("password")
    loginBtn.click()
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#tree > ul > li:nth-child(9)'))).click()
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#tree > ul > li:nth-child(14)'))).click()
  
    driver.implicitly_wait(10)
 
        
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#tree > ul > li:nth-child(9)')))
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#tree > ul > li:nth-child(14)')))
    time.sleep(10)
    search_input = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div/div/div[2]/div[2]/div/div[1]/div[1]/div[1]/div[2]/input')))

    driver.execute_script("arguments[0].scrollIntoView().click();", search_input)
    print(f"Element  found, attempting to send keys {search_input}")
    search_input.send_keys("hello")
        
    
print("End of script")

解决思路

你遇到的问题核心是输入框所在DOM元素为动态加载,仅在用户交互(如点击)后才会被渲染到页面中。结合你观察到的现象,控制台在手动点击前查不到元素,说明该元素初始状态下可能不存在于DOM树,或处于隐藏/未初始化状态。可以尝试以下方案:

1. 先触发输入框所在区域的交互

模拟手动点击输入框的父容器,触发元素加载逻辑:

# 先定位输入框的父容器
parent_container = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div/div/div[2]/div[2]/div/div[1]/div[1]/div[1]/div[2]')))
parent_container.click()
# 再等待输入框出现并操作
search_input = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div/div/div[2]/div[2]/div/div[1]/div[1]/div[1]/div[2]/input')))
search_input.send_keys("hello")

2. 使用JavaScript直接操作元素

既然控制台在点击后能查到元素,说明JavaScript可以访问到,直接用JS强制设置输入值:

# 等待页面稳定后,用JS获取输入框元素
search_input = WebDriverWait(driver,20).until(lambda d: d.execute_script('return document.querySelector("div[class*=search-container] input")'))
# 直接设置输入值
driver.execute_script("arguments[0].value = 'hello';", search_input)

3. 替换绝对XPATH为相对定位

绝对XPATH依赖页面结构,微小变化就会失效,建议用输入框的属性(如placeholder、name)做相对定位:

# 假设输入框有placeholder属性
search_input = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, '//input[@placeholder="搜索关键词"]')))

4. 检查是否存在iframe

如果输入框嵌套在iframe中,必须先切换到iframe才能定位:

# 等待iframe加载并切换上下文
iframe = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.TAG_NAME, 'iframe')))
driver.switch_to.frame(iframe)
# 定位并操作输入框
search_input = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, '你的输入框相对XPATH')))
search_input.send_keys("hello")
# 操作完成后切回主文档
driver.switch_to.default_content()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:42:07