stop playwright when finish

This commit is contained in:
felinae98 2022-01-03 13:54:31 +08:00
parent 4aeff4ad95
commit fcb12b93ef
No known key found for this signature in database
GPG Key ID: 00C8B010587FF610

View File

@ -12,7 +12,7 @@ import nonebot
from nonebot.adapters.cqhttp.message import MessageSegment from nonebot.adapters.cqhttp.message import MessageSegment
from nonebot.log import logger from nonebot.log import logger
from playwright._impl._driver import compute_driver_executable from playwright._impl._driver import compute_driver_executable
from playwright.async_api import Browser, Page, async_playwright from playwright.async_api import Browser, Page, async_playwright, Playwright
from .plugin_config import plugin_config from .plugin_config import plugin_config
@ -40,8 +40,7 @@ class Render(metaclass=Singleton):
self.interval_log = '' self.interval_log = ''
self.remote_browser = False self.remote_browser = False
async def get_browser(self) -> Browser: async def get_browser(self, playwright: Playwright) -> Browser:
playwright = await async_playwright().start()
if plugin_config.bison_browser: if plugin_config.bison_browser:
if plugin_config.bison_browser.startswith('local:'): if plugin_config.bison_browser.startswith('local:'):
path = plugin_config.bison_browser.split('local:', 1)[1] path = plugin_config.bison_browser.split('local:', 1)[1]
@ -81,34 +80,35 @@ class Render(metaclass=Singleton):
async def do_render(self, url: str, viewport: Optional[dict] = None, target: Optional[str] = None, async def do_render(self, url: str, viewport: Optional[dict] = None, target: Optional[str] = None,
operation: Optional[Callable[[Page], Awaitable[None]]] = None) -> Optional[bytes]: operation: Optional[Callable[[Page], Awaitable[None]]] = None) -> Optional[bytes]:
async with self.lock: async with self.lock:
self.browser = await self.get_browser() async with async_playwright() as playwright:
self._inter_log('open browser') self.browser = await self.get_browser(playwright)
if viewport: self._inter_log('open browser')
constext = await self.browser.new_context( if viewport:
viewport={'width': viewport['width'], 'height': viewport['height']}, constext = await self.browser.new_context(
device_scale_factor=viewport.get('deviceScaleFactor', 1)) viewport={'width': viewport['width'], 'height': viewport['height']},
page = await constext.new_page() device_scale_factor=viewport.get('deviceScaleFactor', 1))
else: page = await constext.new_page()
page = await self.browser.new_page() else:
if operation: page = await self.browser.new_page()
await operation(page) if operation:
else: await operation(page)
await page.goto(url) else:
self._inter_log('open page') await page.goto(url)
if target: self._inter_log('open page')
target_ele = page.locator(target) if target:
if not target_ele: target_ele = page.locator(target)
return None if not target_ele:
data = await target_ele.screenshot(type='jpeg') return None
else: data = await target_ele.screenshot(type='jpeg')
data = await page.screenshot(type='jpeg') else:
self._inter_log('screenshot') data = await page.screenshot(type='jpeg')
await page.close() self._inter_log('screenshot')
self._inter_log('close page') await page.close()
await self.close_browser() self._inter_log('close page')
self._inter_log('close browser') await self.close_browser()
assert(isinstance(data, bytes)) self._inter_log('close browser')
return data assert(isinstance(data, bytes))
return data
async def text_to_pic(self, text: str) -> Optional[bytes]: async def text_to_pic(self, text: str) -> Optional[bytes]:
lines = text.split('\n') lines = text.split('\n')