使用pyppeteer实现登录登出时报Execution context was destroyed错误如何解决
问题原因&解决方案
你遇到的Execution context was destroyed报错主要是代码存在异步逻辑错误、DOM操作错误、语法错误三类问题,具体修复点如下:
- 错误1:同步阻塞等待导致上下文丢失
点击登录提交按钮后页面会触发导航跳转,你使用了同步的
time.sleep(5),会阻塞整个异步事件循环,导致pyppeteer无法正确感知页面上下文的切换,跳转完成后旧的执行上下文被销毁,后续操作旧上下文就会抛出该错误。
修复方案:将time.sleep(5)替换为异步等待await asyncio.sleep(5),更稳妥的方式是在点击提交后主动等待页面跳转完成:await asyncio.gather( page.click('[type = submit]'), page.waitForNavigation() )
- 错误2:DOM元素选择参数错误
page.querySelectorAll()返回的是匹配到的元素列表,你直接把列表传入page.evaluate作为参数,而非单个可点击的元素,会导致点击逻辑失效。
修复方案:从列表中取出你需要操作的登出元素,比如取第一个匹配项:element = await page.querySelectorAll('div[class = pull-right]') # 确认列表不为空后取第一个元素 if element: element = element[0]
- 错误3:evaluate执行逻辑错误
你传入的箭头函数只写了
element.click没有调用该方法,同时原代码里的>是转义后的字符,要还原为正常的箭头函数语法。
修复方案:修改evaluate的执行逻辑:await page.evaluate('(element) => element.click()', element)
- 错误4:参数传入语法错误
调用main函数时第一个参数
'username缺少闭合单引号,会直接抛出语法错误。
修复方案:补全引号:asyncio.get_event_loop().run_until_complete(main('username', 'password@123'))
修复后完整代码
import asyncio from pyppeteer import launch async def main(user, password): browser = await launch(headless=False) page = await browser.newPage() await page.setViewport({'width': 1280, 'height': 800}) await page.goto('someurl') await page.type('[id=userName]', user) await page.type('[id=password]', password) # 点击提交同时等待跳转完成 await asyncio.gather( page.click('[type=submit]'), page.waitForNavigation() ) # 可选:如果跳转后登出元素加载有延迟,可加短时间等待 await asyncio.sleep(2) await page.screenshot({ 'path': 'next2.png' }) elements = await page.querySelectorAll('div[class=pull-right]') if elements: logout_element = elements[0] await page.evaluate('(element) => element.click()', logout_element) # 如果登出也有跳转可再加等待逻辑 await page.waitForNavigation() await browser.close() asyncio.get_event_loop().run_until_complete(main('username', 'password@123'))
内容的提问来源于stack exchange,提问作者Zafar Abbas
相关产品推荐
相关产品推荐

