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

使用Selenium与PyAutoGUI的Excel/Safari自动化Python脚本报错排查

自动化Excel与Safari脚本错误排查及修正

问题概述

编写了用于自动化Excel和Safari操作的Python脚本,已开启Safari远程自动化,但运行报错。预期流程:

  • 复制Excel当前选中单元格内容
  • 在Safari打开指定URL,粘贴内容到输入框并提交表单
  • 等待结果div生成后,复制其中span元素内容
  • 返回Excel,向右粘贴内容,再向下左移单元格,重复10次

环境信息:Python 3.11.1、macOS 13.0.1,已安装selenium和pyautogui库。

报错原因分析

当前报错为:

Traceback (most recent call last):
  File "/Users/jamesthompson/Desktop/script.py", line 16, in <module>
    press("cmd", "c")
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pyautogui/__init__.py", line 598, in wrapper
    returnVal = wrappedFunction(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pyautogui/__init__.py", line 1606, in press
    for i in range(presses):
TypeError: 'str' object cannot be interpreted as an integer

核心问题是**pyautogui.press()函数用法错误**:该函数第二个参数是重复按键的次数(整数类型),但你传入了第二个按键"c",导致类型转换失败。组合按键需要用pyautogui.hotkey()函数实现。

此外脚本还存在其他潜在问题:代码缩进错误、selenium无法通过快捷键粘贴内容、低效的元素等待方式、切换应用的逻辑不稳定等。

修正方案

1. 修复组合按键调用

将所有组合按键的press()替换为hotkey():

  • 原代码:press("cmd", "c") → 改为 hotkey("cmd", "c")
  • 原代码:press("cmd", "w") → 改为 hotkey("cmd", "w")
  • 原代码:press("cmd", "v") → 改为 hotkey("cmd", "v")

2. 修正代码缩进

for循环内的所有代码必须统一缩进(Python要求严格的缩进规范),原代码中press("cmd", "c")未缩进,会导致语法错误。

3. 修复网页内容粘贴逻辑

Selenium的send_keys()不支持系统级粘贴快捷键,需先获取剪贴板内容再输入:

  • 安装pyperclip库(用于跨平台剪贴板操作):
    pip3 install pyperclip
    
  • 替换原粘贴代码:
    # 原错误代码:email_input.send_keys("cmd", "v")
    email_content = pyperclip.paste()
    email_input.clear()  # 清空输入框原有内容
    email_input.send_keys(email_content)
    

4. 优化元素等待逻辑

用Selenium的WebDriverWait替代time.sleep()和循环判断,提高稳定性:

  • 导入相关模块:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
  • 替换等待div的代码:
    # 原错误代码:
    # time.sleep(1)
    # div = driver.find_element(By.CSS_SELECTOR, "div.wrap div.checker")
    # while div is None:
    #     div = driver.find_element(By.CSS_SELECTOR, "div.wrap div.checker")
    
    # 修正后:等待元素出现,最长等待10秒
    div = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "div.wrap div.checker"))
    )
    

5. 优化应用切换逻辑

原代码通过搜索应用名切换效率低,改用cmd+tab快速切换(前提是Excel已打开):

# 原错误代码:
# press("cmd", "w")
# typewrite("Microsoft Excel")
# press("enter")

# 修正后:关闭标签页后切换回Excel
hotkey("cmd", "w")
hotkey("cmd", "tab")  # 切换到前一个打开的应用(Excel)

完整修正后的脚本

from selenium 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
from pyautogui import hotkey, press
import time
import pyperclip

# 打开Safari并导航到目标URL
driver = webdriver.Safari()
driver.get("https://example.com")

# 定位输入框和提交按钮
email_input = driver.find_element(By.CSS_SELECTOR, "form input")
submit_button = driver.find_element(By.CSS_SELECTOR, "form input[type=submit]")

for i in range(10):
    # 复制Excel当前选中单元格内容
    hotkey("cmd", "c")
    time.sleep(0.2)  # 等待剪贴板内容写入

    # 粘贴内容到网页输入框并提交
    email_content = pyperclip.paste()
    email_input.clear()
    email_input.send_keys(email_content)
    submit_button.click()

    # 等待结果div加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "div.wrap div.checker"))
    )
    time.sleep(0.5)  # 等待内容渲染

    # 复制span元素内容
    span = driver.find_element(By.CSS_SELECTOR, "div.checkerS span.value")
    # 选中span文本(macOS下双击选中,或用js获取文本直接存剪贴板)
    hotkey("cmd", "a")
    hotkey("cmd", "c")
    time.sleep(0.2)

    # 关闭当前标签页并切换回Excel
    hotkey("cmd", "w")
    hotkey("cmd", "tab")
    time.sleep(0.2)

    # 移动单元格并粘贴
    press("right")
    hotkey("cmd", "v")
    press("down")
    press("left")
    time.sleep(0.2)

# 关闭浏览器
driver.quit()

内容的提问来源于stack exchange,提问作者James Thompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:05:32