MacOS arm64下Selenium循环首迭代后触发WebDriverException求助
问题描述
在MacOS arm64系统的Chrome浏览器上运行Selenium循环爬取,目标是把关键词列表逐个输入搜索框,执行搜索后提取属性文本。之前用相同代码能正常运行,但现在只能完成第一次迭代,之后Chrome崩溃,抛出WebDriverException错误。
代码示例
import pandas as pd from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.keys import Keys from urllib.request import urlopen as uReq from selenium.webdriver.support import ui from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException import time driver = webdriver.Chrome() driver.get("https://canvas.instructure.com/accounts/1?enrollment_term_id=235") # Login to the website, code omitted here search_box = WebDriverWait(driver, 8).until( EC.presence_of_element_located((By.CSS_SELECTOR, '#TextInput_2'))) instructor = [] fall_courses = pd.read_excel("spring 2024 courses.xlsx") course_list = fall_courses["course_list"].tolist() for course in course_list: search_box.send_keys(course) try: person_element = WebDriverWait(driver, 3).until( EC.presence_of_element_located((By.XPATH,('//*[@id="content"]/div/table/tbody/tr/td[3]/div/a/span')))) name = person_element.get_attribute('name') try: person_element2 = WebDriverWait(driver, 1).until( EC.presence_of_element_located((By.XPATH,('//*[@id="content"]/div/table/tbody/tr/td[3]/div[2]/a/span')))) name2 = person_element2.get_attribute('name') combined_names = name + ", " + name2 instructor.append(combined_names) print(combined_names) except TimeoutException: instructor.append(name) print(name) time.sleep(1) search_box.send_keys(Keys.COMMAND + "a") search_box.send_keys(Keys.DELETE) except TimeoutException: print("course doesn't exist") time.sleep(1) search_box.send_keys(Keys.COMMAND + "a") search_box.send_keys(Keys.DELETE) driver.quit()
报错信息
WebDriverException: Message: disconnected: not connected to DevTools (failed to check if window was closed: disconnected: not connected to DevTools) (Session info: chrome=120.0.6099.129)
已完成排查
- 确认
search_box的元素路径始终唯一,页面无重复路径的输入框 - 已验证Chrome与ChromeDriver版本最新且兼容
- 检查过笔记本CPU、内存,清理了Chrome缓存
- 确认for循环逻辑无问题
解决思路及方案
1. 元素引用失效(最可能原因)
首次搜索后,页面可能局部刷新,原有的search_boxDOM元素被重新渲染,导致之前保存的元素对象失效,后续操作时触发连接断开。
修复方法:每次循环开始前重新定位搜索框:
for course in course_list: # 每次循环都重新获取搜索框,避免元素失效 search_box = WebDriverWait(driver, 8).until( EC.presence_of_element_located((By.CSS_SELECTOR, '#TextInput_2'))) search_box.send_keys(course) # 后续原有逻辑不变...
2. Canvas反爬机制触发
Canvas作为教育平台,大概率更新了反爬策略,频繁自动化操作被检测后强制断开会话。
优化方向:
- 延长操作间隔:把
time.sleep(1)改成time.sleep(2)或更长,模拟人类操作节奏 - 用随机延迟替代固定sleep:
import random # 替换原有sleep time.sleep(random.uniform(1.5, 3)) - 增加模拟交互:输入关键词前先点击搜索框激活
- 配置Chrome伪装参数,避免被识别为自动化工具:
options = webdriver.ChromeOptions() options.add_argument('--disable-blink-features=AutomationControlled') options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36') driver = webdriver.Chrome(options=options)
3. DevTools连接兼容性问题
MacOS arm64架构下,Chrome和ChromeDriver的DevTools连接可能存在小兼容性问题。
尝试方案:
- 降级Chrome到上一个稳定版(比如119.x)测试
- 配置远程调试端口:
options.add_argument('--remote-debugging-port=9222') driver = webdriver.Chrome(options=options)
4. 搜索框清空方式优化
原代码用快捷键全选删除,可能引发页面异常,换成更可靠的clear()方法:
# 替换原有清空代码 search_box.clear()
内容的提问来源于stack exchange,提问作者happylilem
相关产品推荐
相关产品推荐

