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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:50:19