Selenium运行数小时后超时:元素可见可点击仍无法定位
问题分析与解决方案
先修正XPATH语法错误
你写的XPATH //[@id="perk_target_4"]/div[2]/div[1]/div 存在语法问题,// 后需要指定元素类型(用*代表任意元素即可),正确写法应为 //*[@id="perk_target_4"]/div[2]/div[1]/div。不过你前一小时能正常运行,说明这个错误未触发(或浏览器兼容了错误写法),但仍建议修正。
长时间运行后定位失效的核心原因及解决办法
定位器依赖不稳定的层级/动态ID
游戏页面在长时间运行后,可能因动态刷新、加载新内容改变DOM层级,或者perk_target_4这类ID是动态生成的(后续可能变为perk_target_5)。建议更换为更稳定的定位方式,比如结合元素的class和文本:# XPATH结合class与文本定位 gold_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[contains(@class, "button_blue") and text()="Protein hapları"]'))) # 或用CSS选择器定位 gold_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.button_blue.pointer')))元素被动态加载进iframe
部分游戏会在运行过程中插入iframe,将按钮类元素移入其中。Selenium默认在主文档查找元素,自然无法定位。可添加iframe检查并切换上下文:# 遍历所有iframe,尝试切换后查找元素 for iframe in driver.find_elements(By.TAG_NAME, 'iframe'): try: driver.switch_to.frame(iframe) gold_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[contains(@class, "button_blue") and text()="Protein hapları"]'))) break except TimeoutException: driver.switch_to.default_content() # 操作完成后切回主文档 driver.switch_to.default_content()浏览器内存过载导致DOM异常
脚本运行一小时后,浏览器内存占用过高可能引发DOM渲染异常,导致Selenium无法正确识别元素。可定期重启浏览器驱动,比如每运行50次循环重启一次:loop_count = 0 while True: loop_count +=1 # 你的业务逻辑代码 if loop_count % 50 == 0: driver.quit() # 重新初始化驱动 driver = webdriver.Chrome() # 重新执行登录/进入游戏页面的逻辑元素可见但被透明层遮挡(不可点击)
游戏可能在按钮上层添加透明加载遮罩,肉眼无法察觉,但Selenium会判定元素不可点击。此时可通过JS直接触发点击:gold_btn = wait.until(EC.visibility_of_element_located((By.XPATH, '//div[contains(@class, "button_blue") and text()="Protein hapları"]'))) driver.execute_script("arguments[0].click();", gold_btn)
内容的提问来源于stack exchange,提问作者selcukwashere
相关产品推荐
相关产品推荐

