Package: graiax-playwright
GraiaX Playwright适用于 Graia Project 的 Playwright 管理器Graiax Playwright 使用launart作为启动管理器，
适用于Ariadne及Avilla。通过 GraiaX Playwright 你可以轻松地在 Ariadne / Avilla 启动的时候同时启动一个
Playwright，并在其退出的时候自动关闭 Playwright。需要注意的是，Playwright 将会在运行期间保持后台常驻，但由于并未开启任何页面，其内存占用量不是非常大（但也是可观的）。安装pdm add graiax-playwright或poetry add graiax-playwright。我们强烈建议使用包管理器或虚拟环境开始使用以下教程以配合 Launart 使用为例。机器人入口文件fromcreartimportcreatefromlaunartimportLaunartfromgraia.ariadne.appimportAriadnefromgraiax.playwrightimportPlaywrightServicelaunart=create(Launart)launart.add_component(PlaywrightService("chromium"))# 默认值为 chromiumlaunart.add_component(PlaywrightService("chromium"，user_data_dir="./browser_data"))# 与上一行二选一，该方式使用 Persistent Context...launart.launch_blocking()配合 Graia Saya 使用fromcreartimportcreatefromlaunartimportLaunartfromgraia.ariadne.util.sayaimportlistenfromgraiax.playwrightimportPlaywrightService@listen(...)asyncdeffunction(app:Ariadne):launart=create(Launart)pw_service=launart.get_component(PlaywrightService)asyncwithpw_service.page(# 此 API 启用了自动上下文管理viewport={"width":800,"height":10},device_scale_factor=1.5,)aspage:awaitpage.set_content("Hello World!")img=awaitpage.screenshot(type="jpeg",quality=80,full_page=True,scale="device")...高级用法之一上面配合 Saya 使用的例子展示了创建一个页面的例子，但该页面默认与其他页面互相隔离（例如 cookie
等），假如我们需要一个与其他页面隔离的新页面，那么我们可以使用page(use_global_context=False)在创建页面时使用一个新的上下文，如下所示：[!NOTE]该种用法中的新上下文，仍受到 Playwright 启动参数的影响如果你传入了例如viewport之类的只有新创建上下文或者新页面才支持的参数时，则会忽略use_global_context参数。此时若without_new_context为True（默认行为），则将会直接使用浏览器实例创建新页面。
反之则会先创建新上下文再用新的上下文创建新页面，但是结束时新的页面和上下文都会被关闭。更多信息详见：https://playwright.dev/python/docs/browser-contexts@listen(...)asyncdeffunction(app:Ariadne):launart=create(Launart)pw_service=launart.get_component(PlaywrightService)asyncwithpw_service.page(use_global_context=False)aspage:# 此 API 启用了自动上下文管理awaitpage.set_content("Hello World!")img=awaitpage.screenshot(type="jpeg",quality=80,full_page=True,scale="device")...高级用法之二上面配合 Saya 使用的例子展示了为单个页面设置 viewport 的功能，自 GraiaX Playwrightv0.3.1版本起，可以在创建 PlaywrightService 时为全局的 Browser Context 指定 viewport，然后在截图时使用全局
Browser Context 截图，如下所示：机器人入口文件：launart.add_service(PlaywrightService("chromium"))Saya 模块中：fromgraiax.playwrightimportPlaywrightService@listen(...)asyncdeffunction(app:Ariadne):launart=create(Launart)pw_service=manager.get_component(PlaywrightService)asyncwithpw_service.context(...)ascontext:# 此 API 启用了自动上下文管理page=context.new_page()try:awaitpage.set_content("Hello World!")img=awaitpage.screenshot(type="jpeg",quality=80,full_page=True,scale='device')finally:page.stop()...高级用法之三通过依赖注入来获取PlaywrightService，前面的代码中获取PlaywrightService都需要通过 Launart
的get_component()方法，你也可以通过自定义一个 BCC 的Dispatcher来实现依赖注入。编写一个Dispatcher：fromgraia.broadcast.entities.dispatcherimportBaseDispatcherfromgraia.broadcast.interfaces.dispatcherimportDispatcherInterfaceclassCustomDispatcher(BaseDispatcher):@classmethodasyncdefcatch(cls,interface:DispatcherInterface):withcontextlib.suppress(TypeError):ifgeneric_isinstance(interface.event,Service):manager=Launart.current()returnmanager.get_component(interface.annotation)在启动 Launart 之前获取一个 BCC 实例并对其应用这个Dispatcher：fromcreartimportitfromgraia.broadcastimportBroadcastbcc=it(Broadcast)bcc.finale_dispatchers.append(RedbotDispatcher)...launart.launch_blocking()# 或者是 avilla.launch()之后用起来就很简单了，你可以对比一下有什么不同：fromgraiax.playwrightimportPlaywrightService@listen(...)asyncdeffunction(app:Ariadne,pw_service:PlaywrightService):asyncwithpw_service.page(...)aspage:...许可证本项目使用MIT许可证进行许可。