报错:playwright._impl._api_types.Error: It looks like you are using P ...

打印 上一主题 下一主题

主题 665|帖子 665|积分 1995

问题描述

在正常利用playwright串行接口时报错:playwright._impl._api_types.Error: It looks like you are using Playwright Sync API inside the asyncio loop.
Please use the Async API instead.
我个人是在本身写一个用playwright实现的web agent项目(webarena)相关时,利用脚本运行同一个playwright环境,如果之前有超时错误没有退出环境,又启动了playwright环境,此时它会认为你是想要一次性启动多个欣赏器,所以会出现这个报错。原项目的代码比较复杂,就大抵复现一下这个错误记录一下。
复现

  1. from playwright.sync_api import (
  2.     sync_playwright,
  3. )
  4. class Env:
  5.     def __init__(self) -> None:
  6.         pass
  7.     def setup(self):
  8.         self.context_manager = sync_playwright()
  9.         self.playwright = self.context_manager.__enter__()
  10.    
  11.     def close(self):
  12.         self.context_manager.__exit__()
  13. env = Env()
  14. # 循环执行某类浏览器任务,我们假设第一次执行任务顺利,第二次执行任务失败
  15. for i in range(0,3):
  16.     print(f"为第{i+1}次任务初始化浏览器环境。")
  17.     env.setup() # 假设每次执行任务前都要初始化环境
  18.     try:
  19.         print(f"执行第{i+1}次任务中...")
  20.         if i == 0:
  21.             # 执行任务成功
  22.             print(f"第{i+1}次任务执行成功!")
  23.         elif i == 1:
  24.             # 执行任务失败,抛出某异常
  25.             raise Exception(f"第{i+1}次任务失败!")
  26.         print("关闭浏览器环境。\n")
  27.         env.close()
  28.     except Exception as e:
  29.         import traceback
  30.         print(traceback.format_exc())
  31.         print(e)
复制代码
上面这个demo是一个简化的复现:


  • 每次实行任务时多要设置(初始化)欣赏器环境
  • 若实行成功,则顺利关闭欣赏器环境
  • 若失败,则任务会抛出某异常(一样平常是访问网站超时),异常处理里却忽略了关闭欣赏器环境,这就导致实行下一个任务时,原来的欣赏器还没有关闭,程序又要新开一个,但用的是串行的接口,就会出现提到的错误。
运行这个demo会输出:
  1. 为第1次任务初始化浏览器环境。
  2. 执行第1次任务中...
  3. 第1次任务执行成功!
  4. 关闭浏览器环境。
  5. 为第2次任务初始化浏览器环境。
  6. 执行第2次任务中...
  7. Traceback (most recent call last):
  8.   File "d:\vs_code_projects\test2\d.py", line 28, in <module>
  9.     raise Exception(f"第{i+1}次任务失败!")
  10. Exception: 第2次任务失败!
  11. 第2次任务失败!
  12. 为第3次任务初始化浏览器环境。
  13. Traceback (most recent call last):
  14.   File "d:\vs_code_projects\test2\d.py", line 20, in <module>
  15.     env.setup() # 假设每次执行任务前都要初始化环境
  16.   File "d:\vs_code_projects\test2\d.py", line 10, in setup
  17.     self.playwright = self.context_manager.__enter__()
  18.   File "D:\Anaconda\lib\site-packages\playwright\sync_api\_context_manager.py", line 48, in __enter__
  19.     raise Error(
  20. playwright._impl._errors.Error: It looks like you are using Playwright Sync API inside the asyncio loop.
  21. Please use the Async API instead.
复制代码
可以看到,第二次任务失败,没有顺利关闭原欣赏器上下文,在后续的任务中,所有初始化举动都相称于又新增欣赏器上下文,利用串行接口就会报错。
办理方法也很简单,在异常处理里关掉欣赏器接口:
  1. except Exception as e:
  2.         import traceback
  3.         print(traceback.format_exc())
  4.         print(e)
  5.         # 在下面添加即可
  6.         print(f"在第{i+1}次任务出先异常,关闭浏览器环境。")
  7.         env.close()
复制代码
修改完后再运行这个demo,会输出:
  1. 为第1次任务初始化浏览器环境。
  2. 执行第1次任务中...
  3. 第1次任务执行成功!
  4. 关闭浏览器环境。
  5. 为第2次任务初始化浏览器环境。
  6. 执行第2次任务中...
  7. Traceback (most recent call last):
  8.   File "d:\vs_code_projects\test2\d.py", line 28, in <module>
  9.     raise Exception(f"第{i+1}次任务失败!")
  10. Exception: 第2次任务失败!
  11. 第2次任务失败!
  12. 在第2次任务出先异常,关闭浏览器环境。
  13. 为第3次任务初始化浏览器环境。
  14. 执行第3次任务中...
  15. 关闭浏览器环境。
复制代码
即使有任务失败,在异常处理中妥善处理欣赏器上下文,也不会出现开始的报错!
总结

微软的堆栈里也有关于这个报错的一些issue,但是和我遇到的问题不一样。归根结底是这个项目(webarena)的异常处理没有弄好,有时间给它提个issue罢。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表