You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Selenium+PyAutoGUI的SharePoint清理脚本无法循环执行

解决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")

关键修改点

  1. 将navegador.quit()移到外层finally块,仅在所有循环结束后执行
  2. 外层添加try-finally包裹整个循环逻辑,确保浏览器最终一定会被关闭
  3. 内部异常处理中增加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:39:52