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

Puppeteer执行上下文销毁错误:注册后刷新页面报错求助

问题分析与解决方案

错误根源

你碰到的Execution context was destroyed错误,核心问题有两个:

  • 在page.evaluate里点击注册按钮后立刻调用location.reload(),直接触发页面导航,销毁了当前执行上下文,导致后续代码无法正常运行。
  • 原代码递归调用main(page)时,页面还没完成导航/加载就尝试操作元素,自然找不到目标节点,进一步触发错误。

解决思路及代码修正

1. 移除手动刷新,等待页面自然导航

点击注册按钮后,页面通常会自动跳转或完成注册流程,不需要手动调用location.reload()。如果确实需要刷新,也要等当前页面导航完成后再执行。

2. 等待页面导航完成

点击按钮前先声明等待导航的Promise,确保页面加载完成、新的执行上下文就绪后,再进行后续操作。

3. 修正递归逻辑

原代码的递归调用会导致无限循环,改成可控的循环结构,同时每次操作前确保目标元素已加载。

修改后的代码:

async function launchBrowser() {
    const browser = await puppeteer.launch({
        executablePath: 'C:/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe',
        slowMo: 10,
        headless: false,
        devtools: false,
    })

    const pages = await browser.pages()
    const page = pages[0]

    const url = 'www.example.pl'

    while (true) {
        try {
            await page.goto(url, { timeout: 90000, waitUntil: 'networkidle2' })
            break
        } catch (error) {
            if (error.message.includes('ERR_NETWORK_CHANGED')) {
                console.error('网络发生变化,重试中...')
            } else {
                console.error('发生错误:', error)
                break
            }
        }
    }

    return page
}

async function test(){
    const page = await launchBrowser()
    // 设置循环次数,避免无限执行
    for (let i = 0; i < 3; i++) {
        await main(page)
    }
}

async function main(page) {
    // 等待登录框加载完成后再操作,确保元素存在
    await page.waitForSelector('#login')
    
    await page.type('#login', 'logdasdin')
    await page.type('#password', 'password')
    await page.type('#password2', 'password')

    // 点击按钮前先准备等待导航
    const navigationPromise = page.waitForNavigation({ waitUntil: 'networkidle2' })
    await page.evaluate(() => {
        const registerBtn = document.querySelectorAll('button')[3]
        registerBtn.click()
    })
    // 等待页面导航完成
    await navigationPromise

    // 如果确实需要手动刷新,放在导航完成后执行
    // await page.reload({ waitUntil: 'networkidle2' })
}

test()

关键修改说明

  • page.waitForSelector:每次输入前等待目标元素加载,避免因元素未就绪导致的操作失败。
  • 提前声明navigationPromise:防止点击按钮后页面跳转过快,导致Puppeteer丢失页面上下文。
  • 替换递归为循环:避免无限递归,同时可以灵活控制执行次数。
  • 移除手动location.reload():尊重页面自身的注册流程,如需刷新则在导航完成后调用page.reload()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:37:23