使用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
相关产品推荐
相关产品推荐

