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&order_by=booking_id&order=ASC">Booking ID </a></th> <th class="text-center"><a href="?search_query=2866111&order_by=room_name&order=ASC">Room</a></th> <th class="text-center"><a href="?search_query=2866111&order_by=check_in_date&order=ASC">Check In</a></th> <th class="text-center"><a href="?search_query=2866111&order_by=check_out_date&order=ASC">Check Out</a></th> <th><a href="?search_query=2866111&order_by=customer_name&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}")
- 点击行内具体元素
可能的原因
- 元素引用过期
首次运行后,页面缓存或会话变化导致提前获取的bookings列表中首个元素的DOM引用失效。第二次运行时,元素视觉上存在,但Selenium无法识别旧引用。
- 解决思路:不要一次性获取所有元素,每次循环前重新定位当前待处理的首个
booking state0行,处理完再重新获取下一个。
- 会话残留/缓存问题
首次启动是全新浏览器会话,第二次运行时缓存或会话保留了之前的模态框状态、元素焦点,导致首个行的点击事件被屏蔽。
- 解决思路:每次运行前清除浏览器缓存,或每次启动新的driver实例,不复用旧会话。
- 元素交互状态异常
第二次运行时,首个行可能被隐藏元素(如弹窗遮罩、悬浮导航)覆盖,虽然element_to_be_clickable返回true,但实际无法触发点击。
- 解决思路:点击前确保元素完全可见,增加滚动到元素顶部的操作,或等待页面所有动态元素加载完成。
- 脚本逻辑漏洞
原脚本中关闭模态框的close_button定位后未执行click(),可能导致首次运行后模态框未完全关闭,第二次运行时首个行被遮罩。
内容的提问来源于stack exchange,提问作者Ilvars
相关产品推荐
相关产品推荐

