ayaka.playwright

浏览器截图

 1'''浏览器截图'''
 2import platform
 3from loguru import logger
 4from .config import ayaka_root_config
 5from .driver import get_driver
 6
 7driver = get_driver()
 8running_on_windows = platform.system() == "Windows"
 9fastapi_reload = getattr(driver.config, "fastapi_reload", True)
10
11if ayaka_root_config.use_playwright:
12    from playwright.async_api import async_playwright, Browser, Page, Playwright
13    from contextlib import asynccontextmanager
14    from typing import AsyncIterator
15
16    _browser: Browser = None
17    _playwright: Playwright = None
18
19    @asynccontextmanager
20    async def get_new_page(width=None, high_quality=False, **kwargs) -> AsyncIterator[Page]:
21        ''' 获取playwright Page对象,width设置屏幕宽度
22
23            使用示例:
24            ```
25            async with get_new_page(width=200) as p:
26                await p.goto(...)
27                await p.screenshot(...)
28            ```
29        '''
30        if width:
31            kwargs["viewport"] = {"width": width, "height": width}
32        if high_quality:
33            kwargs["device_scale_factor"] = 2
34        page = await _browser.new_page(**kwargs)
35        yield page
36        await page.close()
37
38    @driver.on_startup
39    async def startup():
40        print('''
41
42    playwright init
43
44        ''')
45        if running_on_windows and fastapi_reload:
46            logger.warning("playwright未加载,win平台请关闭fastapi reload功能")
47            return
48
49        global _browser, _playwright
50        _playwright = await async_playwright().start()
51        _browser = await _playwright.chromium.launch()
52
53    @driver.on_shutdown
54    async def shutdown():
55        # 查bug 怀疑卡死原因是没有正确退出
56        print('''
57
58    playwright close
59
60        ''')
61        if _browser:
62            await _browser.close()
63        if _playwright:
64            await _playwright.stop()
65else:
66    async def get_new_page(width=None, high_quality=False, **kwargs):
67        logger.warning("ayaka未开启playwright功能")
async def get_new_page(width=None, high_quality=False, **kwargs):
67    async def get_new_page(width=None, high_quality=False, **kwargs):
68        logger.warning("ayaka未开启playwright功能")