Source code for pyppeteer.worker

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""Worker module."""

import logging
from typing import Any, Callable, Dict, List, TYPE_CHECKING

from pyee import EventEmitter

from pyppeteer.execution_context import ExecutionContext, JSHandle
from pyppeteer.helper import debugError

if TYPE_CHECKING:
    from pyppeteer.connection import CDPSession  # noqa: F401

logger = logging.getLogger(__name__)


[docs]class Worker(EventEmitter): """The Worker class represents a WebWorker. The events `workercreated` and `workerdestroyed` are emitted on the page object to signal the worker lifecycle. .. code:: page.on('workercreated', lambda worker: print('Worker created:', worker.url)) """ # noqa: E501 def __init__(self, client: 'CDPSession', url: str, # noqa: C901 consoleAPICalled: Callable[[str, List[JSHandle]], None], exceptionThrown: Callable[[Dict], None] ) -> None: super().__init__() self._client = client self._url = url self._loop = client._loop self._executionContextPromise = self._loop.create_future() def jsHandleFactory(remoteObject: Dict) -> JSHandle: return None # type: ignore def onExecutionContentCreated(event: Dict) -> None: nonlocal jsHandleFactory def jsHandleFactory(remoteObject: Dict) -> JSHandle: return JSHandle(executionContext, client, remoteObject) executionContext = ExecutionContext( client, event['context'], jsHandleFactory) self._executionContextCallback(executionContext) self._client.on('Runtime.executionContextCreated', onExecutionContentCreated) try: # This might fail if the target is closed before we receive all # execution contexts. self._client.send('Runtime.enable', {}) except Exception as e: debugError(logger, e) def onConsoleAPICalled(event: Dict) -> None: args: List[JSHandle] = [] for arg in event.get('args', []): args.append(jsHandleFactory(arg)) consoleAPICalled(event['type'], args) self._client.on('Runtime.consoleAPICalled', onConsoleAPICalled) self._client.on( 'Runtime.exceptionThrown', lambda exception: exceptionThrown(exception['exceptionDetails']), ) def _executionContextCallback(self, value: ExecutionContext) -> None: self._executionContextPromise.set_result(value) @property def url(self) -> str: """Return URL.""" return self._url
[docs] async def executionContext(self) -> ExecutionContext: """Return ExecutionContext.""" return await self._executionContextPromise
[docs] async def evaluate(self, pageFunction: str, *args: Any) -> Any: """Evaluate ``pageFunction`` with ``args``. Shortcut for ``(await worker.executionContext).evaluate(pageFunction, *args)``. """ # noqa: E501 return await (await self._executionContextPromise).evaluate( pageFunction, *args)
[docs] async def evaluateHandle(self, pageFunction: str, *args: Any) -> JSHandle: """Evaluate ``pageFunction`` with ``args`` and return :class:`~pyppeteer.execution_context.JSHandle`. Shortcut for ``(await worker.executionContext).evaluateHandle(pageFunction, *args)``. """ # noqa: E501 return await (await self._executionContextPromise).evaluateHandle( pageFunction, *args)