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

Selenium脚本仅首次运行正常,后续首行点击失败排查求助

问题分析:Selenium重复运行时首个表格行点击失败

问题现象

  • 电脑启动后首次运行脚本,可正常处理所有带booking state0类的表格行,点击后弹出模态框完成操作
  • 第二次及之后运行时,会跳过首个可点击行并报错,其余行可正常处理

错误栈

Error processing state0 booking 1: Message: 
Stacktrace:
    GetHandleVerifier [0x00007FF62116FB05+28789]
    (No symbol) [0x00007FF6210D86E0]
    (No symbol) [0x00007FF620F7592A]
    (No symbol) [0x00007FF620FC930E]
    (No symbol) [0x00007FF620FC95FC]
    (No symbol) [0x00007FF6210128A7]
    (No symbol) [0x00007FF620FEF47F]
    (No symbol) [0x00007FF62100F654]
    (No symbol) [0x00007FF620FEF1E3]
    (No symbol) [0x00007FF620FBA938]
    (No symbol) [0x00007FF620FBBAA1]
    GetHandleVerifier [0x00007FF6214A933D+3410093]
    GetHandleVerifier [0x00007FF6214BE7DD+3497293]
    GetHandleVerifier [0x00007FF6214B2A73+3448803]
    GetHandleVerifier [0x00007FF621237BBB+848171]
    (No symbol) [0x00007FF6210E3C3F]
    (No symbol) [0x00007FF6210DF6E4]
    (No symbol) [0x00007FF6210DF87D]
    (No symbol) [0x00007FF6210CED49]
    BaseThreadInitThunk [0x00007FFF19B453E0+16]
    RtlUserThreadStart [0x00007FFF1B0C485B+43]

所用脚本

bookings = driver.find_elements(By.XPATH, '//tr[contains(@class, "booking state0")]')
print(f"Number of bookings with state0: {len(bookings)}")

for index, booking in enumerate(bookings):
    print(f"Booking {index}: {booking.get_attribute('outerHTML')}")

# Loop to process state0 bookings
for index, booking in enumerate(bookings):
    try:
        WebDriverWait(driver, 3).until(
            EC.element_to_be_clickable(booking)
        )
        ActionChains(driver).move_to_element(booking).perform()
        booking.click()

        time.sleep(5)

        # Wait for the check-in button to be available and click it
        check_in_button = WebDriverWait(driver, 5).until(
            EC.element_to_be_clickable((By.XPATH, '//button[contains(@class, "btn-success")]'))
        )
        check_in_button.click()
        time.sleep(3)

        # Close the modal dialog after check-in
        close_button = WebDriverWait(driver, 5).until(
            EC.element_to_be_clickable(
                (By.XPATH, '//button[@type="button" and @class="btn btn-light" and @data-dismiss="modal"]')
            )
        )
        # 注:原脚本此处缺少close_button.click()调用

目标HTML结构

<table class="table table-hover">
    <tbody><tr>
        <th class="text-center"><a href="?search_query=2866111&amp;order_by=booking_id&amp;order=ASC">Booking ID </a></th>
        <th class="text-center"><a href="?search_query=2866111&amp;order_by=room_name&amp;order=ASC">Room</a></th>
        <th class="text-center"><a href="?search_query=2866111&amp;order_by=check_in_date&amp;order=ASC">Check In</a></th>
        <th class="text-center"><a href="?search_query=2866111&amp;order_by=check_out_date&amp;order=ASC">Check Out</a></th>
        <th><a href="?search_query=2866111&amp;order_by=customer_name&amp;order=ASC">Customer</a></th>
        
    </tr>       
                        <tr class="booking state0" data-booking-id="2866111">
                        
                        <td class="text-center">2866111</td>
                        <td class="text-center">V NR-1</td>
                        <td class="text-center">2025-01-09 15:00:00</td>
                        <td class="text-center">2025-01-10 12:00:00</td>
                        <td>ilvars F</td>
                    </tr>
    </tbody></table>

已尝试的无效方案

  • 增加首次点击延迟
  • 使用JavaScript强制点击:
for booking in bookings:
    try:
        # Scroll into view and force the click using JavaScript
        driver.execute_script("arguments[0].scrollIntoView(true);", booking)
        driver.execute_script("arguments[0].click();", booking)
        print("Clicked booking via JavaScript")
        time.sleep(1)
    except Exception as e:
        print(f"Error clicking booking with JavaScript: {e}")
  • 点击行内具体元素

可能的原因

  1. 元素引用过期
    首次运行后,页面缓存或会话变化导致提前获取的bookings列表中首个元素的DOM引用失效。第二次运行时,元素视觉上存在,但Selenium无法识别旧引用。
  • 解决思路:不要一次性获取所有元素,每次循环前重新定位当前待处理的首个booking state0行,处理完再重新获取下一个。
  1. 会话残留/缓存问题
    首次启动是全新浏览器会话,第二次运行时缓存或会话保留了之前的模态框状态、元素焦点,导致首个行的点击事件被屏蔽。
  • 解决思路:每次运行前清除浏览器缓存,或每次启动新的driver实例,不复用旧会话。
  1. 元素交互状态异常
    第二次运行时,首个行可能被隐藏元素(如弹窗遮罩、悬浮导航)覆盖,虽然element_to_be_clickable返回true,但实际无法触发点击。
  • 解决思路:点击前确保元素完全可见,增加滚动到元素顶部的操作,或等待页面所有动态元素加载完成。
  1. 脚本逻辑漏洞
    原脚本中关闭模态框的close_button定位后未执行click(),可能导致首次运行后模态框未完全关闭,第二次运行时首个行被遮罩。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:54:53