Selenium Python:每日启动浏览器后10秒轮询XPath异常处理
解决方案:每日定时启动浏览器并轮询检测元素
你的核心问题是没有实现启动浏览器后的持续轮询逻辑,原代码仅在浏览器启动时检测一次元素,之后就结束了。下面是修正后的完整代码,同时优化了几个细节:
关键修改点
- 新增浏览器启动后的10秒轮询循环,持续检测指定XPath元素
- 用WebDriver自带的
driver.refresh()替代pyautogui坐标点击,避免屏幕分辨率变化导致的失效 - 确保
NoSuchElementException正确导入,修复原代码可能的异常捕获失效问题 - 补充完整URL协议,避免浏览器无法正确访问目标页面
修正后的代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException # 必须导入该异常 from webdriver_manager.chrome import ChromeDriverManager import schedule import time def code(): options = Options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) driver.get("https://example.com") # 补充完整URL协议 driver.set_window_position(0, 0) driver.set_window_size(750, 512) # 启动持续轮询逻辑 while True: try: # 检测指定XPath元素 driver.find_element(By.XPATH, "/html/body/div/div/div/div/div[2]/div/div/div[2]/div[2]/div[1]/span/button/span") print("元素检测成功,等待下一次轮询") except NoSuchElementException: print("未检测到元素,执行刷新操作") driver.refresh() # 用WebDriver原生方法刷新,比pyautogui更可靠 time.sleep(10) # 每10秒轮询一次 # 每日19:37启动任务 schedule.every().day.at("19:37").do(code) # 保持调度器运行 while True: schedule.run_pending() time.sleep(1)
额外说明
- 轮询终止设置:如果需要在检测到元素后停止轮询,可以在
print("元素检测成功...")后添加break语句 - 异常扩展捕获:若担心其他未知异常导致程序崩溃,可在
NoSuchElementException捕获后添加except Exception兜底,但不建议滥用 - pyautogui替代原因:坐标点击依赖当前屏幕分辨率和窗口固定位置,一旦窗口移动或分辨率调整就会失效,而
driver.refresh()直接操作浏览器,稳定性和通用性更高
内容的提问来源于stack exchange,提问作者D3AD_SHOT
相关产品推荐
相关产品推荐

