求助:Selenium+PyAutoGUI的SharePoint清理脚本无法循环执行
你的脚本只执行一次循环就停止,核心原因是finally块里的navegador.quit()会在每次循环结束后强制关闭浏览器。第一次循环完成(或抛出异常)后,浏览器实例被销毁,后续循环没有可用的浏览器环境,自然无法继续执行。
修复后的代码
将关闭浏览器的逻辑移到所有循环完成之后,确保整个循环过程中浏览器保持打开状态:
from seleniumwire import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import pyautogui time.sleep(5) num_repeticoes = 800 repeticao_atual = 0 # 初始化浏览器(仅执行一次) navegador = webdriver.Edge() navegador.get("https://mdiasbranco.sharepoint.com/sites/Controledearmazem-MDB/Lists/movimentacaoPallet_JBO/AllItems.aspx") navegador.maximize_window() try: while repeticao_atual < num_repeticoes: try: # 等待页面加载 WebDriverWait(navegador, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'body'))) # 点击标题列 linktitle = WebDriverWait(navegador, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="header15-title_1267"]')) ) linktitle.click() time.sleep(1) # 点击筛选按钮 botao_filtrar = WebDriverWait(navegador, 10).until( EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div/div/div/div/div/ul/li[4]/button')) ) botao_filtrar.click() time.sleep(1) # 切换到Excel复制内容 pyautogui.hotkey('alt', 'tab') time.sleep(1) pyautogui.click(x=114, y=236) time.sleep(1) pyautogui.hotkey('ctrl', 'c') time.sleep(1) pyautogui.hotkey('alt', 'tab') time.sleep(1) # 粘贴到筛选框 campo_filtro = WebDriverWait(navegador, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="combobox-id__824"]')) ) pyautogui.click(x=1049, y=205) pyautogui.hotkey('ctrl', 'v') time.sleep(2) pyautogui.press('enter') # 应用筛选 botao_filtrar2 = WebDriverWait(navegador, 10).until( EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div/div/div[2]/div[2]/div/div[3]/div/div/button[1]')) ) botao_filtrar2.click() time.sleep(6) # 选择所有项并删除 pyautogui.click(x=338, y=437) time.sleep(2) pyautogui.click(x=790, y=267) pyautogui.click(x=795, y=304) time.sleep(2) pyautogui.click(x=712, y=504) time.sleep(2) # 清除筛选 pyautogui.click(x=1241, y=398) time.sleep(2) # 切换到Excel标记已处理行 pyautogui.hotkey('alt', 'tab') time.sleep(2) pyautogui.click(x=16, y=237, button='right') time.sleep(2) pyautogui.click(x=73, y=459) pyautogui.hotkey('alt', 'tab') time.sleep(1) repeticao_atual += 1 print(f"Repetição {repeticao_atual} concluída") except Exception as e: print(f"Erro na repetição {repeticao_atual + 1}: {e}") repeticao_atual += 1 # 避免卡在同一轮循环 finally: # 所有循环完成后关闭浏览器 navegador.quit() print("Processo finalizado, navegador fechado")
关键修改点
- 将
navegador.quit()移到外层finally块,仅在所有循环结束后执行 - 外层添加
try-finally包裹整个循环逻辑,确保浏览器最终一定会被关闭 - 内部异常处理中增加
repeticao_atual += 1,避免因单次出错导致无限循环
额外优化建议
- 替换动态XPATH:
header15-title_1267、combobox-id__824这类ID是动态生成的,刷新页面后会失效,建议改用基于元素文本/类名的稳定选择器,例如//button[contains(text(), 'Filtrar')] - 弃用PyAutoGUI坐标操作:固定屏幕坐标在分辨率变化、窗口移位时会失效,建议用
openpyxl直接读取Excel内容,用Selenium直接操作SharePoint元素(替代坐标点击) - 减少硬编码sleep:用
WebDriverWait等待元素状态变化,提升脚本稳定性和执行效率
内容的提问来源于stack exchange,提问作者GUSTAVO TELES
相关产品推荐
相关产品推荐

