Skip to content
This repository has been archived by the owner on May 8, 2020. It is now read-only.

Add option to connect to remote browser with url #198

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 28 additions & 25 deletions pyppeteer/launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ def _close_process(*args: Any, **kwargs: Any) -> None:
signal.signal(signal.SIGHUP, _close_process)

connectionDelay = self.slowMo
self.browserWSEndpoint = self._get_ws_endpoint()
self.browserWSEndpoint = get_ws_endpoint(self.url)
logger.info(f'Browser listening on: {self.browserWSEndpoint}')
self.connection = Connection(
self.browserWSEndpoint,
Expand Down Expand Up @@ -203,24 +203,6 @@ def check_target(target: Target) -> None:
await initialPagePromise
removeEventListeners(listeners)

def _get_ws_endpoint(self) -> str:
url = self.url + '/json/version'
while self.proc.poll() is None:
time.sleep(0.1)
try:
with urlopen(url) as f:
data = json.loads(f.read().decode())
break
except URLError as e:
continue
else:
raise BrowserError(
'Browser closed unexpectedly:\n{}'.format(
self.proc.stdout.read().decode()
)
)
return data['webSocketDebuggerUrl']

def waitForChromeToClose(self) -> None:
"""Terminate chrome."""
if self.proc.poll() is None and not self.chromeClosed:
Expand Down Expand Up @@ -248,6 +230,23 @@ async def killChrome(self) -> None:
self._cleanup_tmp_user_data_dir()


def get_ws_endpoint(url) -> str:
url = url + '/json/version'
timeout = time.time() + 30
while(True):
if time.time() > timeout:
raise BrowserError('Browser closed unexpectedly:\n')
try:
with urlopen(url) as f:
data = json.loads(f.read().decode())
break
except URLError as e:
continue
time.sleep(0.1)

return data['webSocketDebuggerUrl']


async def launch(options: dict = None, **kwargs: Any) -> Browser:
"""Start chrome process and return :class:`~pyppeteer.browser.Browser`.

Expand Down Expand Up @@ -329,18 +328,19 @@ async def launch(options: dict = None, **kwargs: Any) -> Browser:
"""
return await Launcher(options, **kwargs).launch()


async def connect(options: dict = None, **kwargs: Any) -> Browser:
"""Connect to the existing chrome.

``browserWSEndpoint`` option is necessary to connect to the chrome. The
format is ``ws://${host}:${port}/devtools/browser/<id>``. This value can
get by :attr:`~pyppeteer.browser.Browser.wsEndpoint`.
``browserWSEndpoint`` or ``browserURL`` option is necessary to connect to
the chrome. The format of ``browserWSEndpoint`` is
``ws://${host}:${port}/devtools/browser/<id>`` and format of ``browserURL``
is ``http://127.0.0.1:9222```.
The value of ``browserWSEndpoint`` can get by :attr:`~pyppeteer.browser.Browser.wsEndpoint`.

Available options are:

* ``browserWSEndpoint`` (str): A browser websocket endpoint to connect to.
(**required**)
* ``browserURL`` (str): A browser URL to connect to.
* ``ignoreHTTPSErrors`` (bool): Whether to ignore HTTPS errors. Defaults to
``False``.
* ``defaultViewport`` (dict): Set a consistent viewport for each page.
Expand Down Expand Up @@ -370,7 +370,10 @@ async def connect(options: dict = None, **kwargs: Any) -> Browser:

browserWSEndpoint = options.get('browserWSEndpoint')
if not browserWSEndpoint:
raise BrowserError('Need `browserWSEndpoint` option.')
browserURL= options.get('browserURL')
if not browserURL:
raise BrowserError('Need `browserWSEndpoint` or `browserURL` option.')
browserWSEndpoint = get_ws_endpoint(browserURL)
connectionDelay = options.get('slowMo', 0)
connection = Connection(browserWSEndpoint,
options.get('loop', asyncio.get_event_loop()),
Expand Down