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