Spaces:
Runtime error
Runtime error
| #!/usr/bin/env python3 | |
| # this module is part of undetected_chromedriver | |
| import json | |
| import logging | |
| import requests | |
| import websockets | |
| log = logging.getLogger(__name__) | |
| class CDPObject(dict): | |
| def __init__(self, *a, **k): | |
| super().__init__(*a, **k) | |
| self.__dict__ = self | |
| for k in self.__dict__: | |
| if isinstance(self.__dict__[k], dict): | |
| self.__dict__[k] = CDPObject(self.__dict__[k]) | |
| elif isinstance(self.__dict__[k], list): | |
| for i in range(len(self.__dict__[k])): | |
| if isinstance(self.__dict__[k][i], dict): | |
| self.__dict__[k][i] = CDPObject(self) | |
| def __repr__(self): | |
| tpl = f"{self.__class__.__name__}(\n\t{{}}\n\t)" | |
| return tpl.format("\n ".join(f"{k} = {v}" for k, v in self.items())) | |
| class PageElement(CDPObject): | |
| pass | |
| class CDP: | |
| log = logging.getLogger("CDP") | |
| endpoints = CDPObject( | |
| { | |
| "json": "/json", | |
| "protocol": "/json/protocol", | |
| "list": "/json/list", | |
| "new": "/json/new?{url}", | |
| "activate": "/json/activate/{id}", | |
| "close": "/json/close/{id}", | |
| } | |
| ) | |
| def __init__(self, options: "ChromeOptions"): # noqa | |
| self.server_addr = "http://{0}:{1}".format(*options.debugger_address.split(":")) | |
| self._reqid = 0 | |
| self._session = requests.Session() | |
| self._last_resp = None | |
| self._last_json = None | |
| resp = self.get(self.endpoints.json) # noqa | |
| self.sessionId = resp[0]["id"] | |
| self.wsurl = resp[0]["webSocketDebuggerUrl"] | |
| def tab_activate(self, id=None): | |
| if not id: | |
| active_tab = self.tab_list()[0] | |
| id = active_tab.id # noqa | |
| self.wsurl = active_tab.webSocketDebuggerUrl # noqa | |
| return self.post(self.endpoints["activate"].format(id=id)) | |
| def tab_list(self): | |
| retval = self.get(self.endpoints["list"]) | |
| return [PageElement(o) for o in retval] | |
| def tab_new(self, url): | |
| return self.post(self.endpoints["new"].format(url=url)) | |
| def tab_close_last_opened(self): | |
| sessions = self.tab_list() | |
| opentabs = [s for s in sessions if s["type"] == "page"] | |
| return self.post(self.endpoints["close"].format(id=opentabs[-1]["id"])) | |
| async def send(self, method: str, params: dict): | |
| self._reqid += 1 | |
| async with websockets.connect(self.wsurl) as ws: | |
| await ws.send( | |
| json.dumps({"method": method, "params": params, "id": self._reqid}) | |
| ) | |
| self._last_resp = await ws.recv() | |
| self._last_json = json.loads(self._last_resp) | |
| self.log.info(self._last_json) | |
| def get(self, uri): | |
| resp = self._session.get(self.server_addr + uri) | |
| try: | |
| self._last_resp = resp | |
| self._last_json = resp.json() | |
| except Exception: | |
| return | |
| else: | |
| return self._last_json | |
| def post(self, uri, data: dict = None): | |
| if not data: | |
| data = {} | |
| resp = self._session.post(self.server_addr + uri, json=data) | |
| try: | |
| self._last_resp = resp | |
| self._last_json = resp.json() | |
| except Exception: | |
| return self._last_resp | |
| def last_json(self): | |
| return self._last_json | |