Selenium循环发消息异常:第二个用户无法输入消息的问题排查
循环发送私信时第二个用户无法输入消息的解决方法
问题描述
循环读取用户ID拼接私信链接,给第一个用户发消息正常,但第二个用户页面加载后无法输入消息,触发元素点击拦截错误。
原代码
while True: user = str(list.readline()) if not user: break web.get(baseeitaa + user) # text bar textbar = web.find_element(By.XPATH, '//*[@id="column-center"]/div/div/div[4]/div/div[1]/div[7]/div[1]/div[1]') textbar.send_keys(newmsg) time.sleep(1) # send button sendb = web.find_element(By.XPATH, '//*[@id="column-center"]/div/div/div[4]/div/div[4]/button/div') sendb.click() time.sleep(5)
报错信息
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <div class="c-ripple"></div> is not clickable at point (840, 652). Other element would receive the click: <div contenteditable="true" class="input-message-input scrollable scrollable-y i18n no-scrollbar" dir="auto" data-placeholder="پیام" style="transition-duration: 181ms; height: 37px;"></div> (Session info: chrome=137.0.7151.41) Stacktrace: GetHandleVerifier [0x0x7ff63e5991f5+2853845] GetHandleVerifier [0x0x7ff63e2f3ac0+79008] (No symbol) [0x0x7ff63e0b9bda] (No symbol) [0x0x7ff63e1180e9] (No symbol) [0x0x7ff63e115a8b] (No symbol) [0x0x7ff63e112ad1] (No symbol) [0x0x7ff63e1119d1] (No symbol) [0x0x7ff63e103004] (No symbol) [0x0x7ff63e1384ba] (No symbol) [0x0x7ff63e1028b6] (No symbol) [0x0x7ff63e1386d0] (No symbol) [0x0x7ff63e1608f5] (No symbol) [0x0x7ff63e138293] (No symbol) [0x0x7ff63e101061] (No symbol) [0x0x7ff63e101df3] GetHandleVerifier [0x0x7ff63e5c410d+3029741] GetHandleVerifier [0x0x7ff63e5be52d+3006221] GetHandleVerifier [0x0x7ff63e5dd5b2+3133330] GetHandleVerifier [0x0x7ff63e30d98e+185198] GetHandleVerifier [0x0x7ff63e314edf+215231] GetHandleVerifier [0x0x7ff63e2fc324+113924] GetHandleVerifier [0x0x7ff63e2fc4d9+114361] GetHandleVerifier [0x0x7ff63e2e3208+11240] BaseThreadInitThunk [0x0x7ff94f797374+20] RtlUserThreadStart [0x0x7ff94fabcc91+33]
问题分析
原代码在同一窗口跳转不同用户页面,容易出现DOM未完全刷新、元素状态残留的问题,导致输入框无法正常获取焦点,触发点击拦截错误。
调试后可用代码
通过为每个用户打开独立新窗口,隔离页面环境,同时增加输入框点击确保焦点:
while True: user = str(list.readline()) if not user: break web.execute_script("window.open('')") web.switch_to.window(web.window_handles[1]) web.get(baseeitaa + user) log.write('opened the user:' + user + '\n') time.sleep(2) textbar = web.find_element(By.XPATH, '//*[@id="column-center"]/div/div/div[4]/div/div[1]/div[7]/div[1]/div[1]') textbar.click() # 确保输入框获得焦点 textbar.send_keys(newmsg) log.write('type the message:' + newmsg + '\n') time.sleep(1) # send button sendb = web.find_element(By.XPATH, '//*[@id="column-center"]/div/div/div[4]/div/div[4]/button/div') sendb.click() log.write('send the message:' + newmsg + '\n') time.sleep(1) web.close() web.switch_to.window(web.window_handles[0])
补充说明
time.sleep用于等待页面加载,需根据网络速度调整时长,确保元素完全渲染后再执行操作。- 新窗口方式彻底隔离了每个用户的页面状态,避免了同一窗口跳转带来的DOM残留问题。
内容的提问来源于stack exchange,提问作者محمد مهدی شیخی
相关产品推荐
相关产品推荐

