diff --git a/DrissionPage/chromium_base.py b/DrissionPage/chromium_base.py index 97cbda0..c8adb96 100644 --- a/DrissionPage/chromium_base.py +++ b/DrissionPage/chromium_base.py @@ -66,7 +66,7 @@ class ChromiumBase(BasePage): json = self._control_session.get(f'http://{self.address}/json').json() tab_id = [i['id'] for i in json if i['type'] == 'page'] if not tab_id: - raise BrowserConnectError('浏览器连接失败。') + raise BrowserConnectError('浏览器连接失败,可能是浏览器版本原因。') tab_id = tab_id[0] self._driver_init(tab_id) self._get_document() diff --git a/DrissionPage/chromium_page.py b/DrissionPage/chromium_page.py index e062030..3b19484 100644 --- a/DrissionPage/chromium_page.py +++ b/DrissionPage/chromium_page.py @@ -81,7 +81,7 @@ class ChromiumPage(ChromiumBase): json = self._control_session.get(f'http://{self.address}/json').json() tab_id = [i['id'] for i in json if i['type'] == 'page'] if not tab_id: - raise BrowserConnectError('浏览器连接失败。') + raise BrowserConnectError('浏览器连接失败,可能是浏览器版本原因。') tab_id = tab_id[0] self._driver_init(tab_id) diff --git a/DrissionPage/commons/browser.py b/DrissionPage/commons/browser.py index f6a592c..741e6be 100644 --- a/DrissionPage/commons/browser.py +++ b/DrissionPage/commons/browser.py @@ -29,10 +29,12 @@ def connect_browser(option): debugger_address = debugger_address[7:] if debugger_address.startswith('http://') else debugger_address ip, port = debugger_address.split(':') if ip not in ('127.0.0.1', 'localhost'): + test_connect(ip, port) return None, None if port_is_using(ip, port): chrome_path = get_exe_from_port(port) if chrome_path == 'chrome' and system_type == 'windows' else chrome_path + test_connect(ip, port) return chrome_path, None args = get_launch_args(option) @@ -54,6 +56,7 @@ def connect_browser(option): debugger = _run_browser(port, chrome_path, args) + test_connect(ip, port) return chrome_path, debugger @@ -137,6 +140,27 @@ def set_prefs(opt): dump(prefs_dict, f) +def test_connect(ip, port): + """测试浏览器是否可用 + :param ip: 浏览器ip + :param port: 浏览器端口 + :return: None + """ + end_time = perf_counter() + 10 + while perf_counter() < end_time: + try: + tabs = requests_get(f'http://{ip}:{port}/json', timeout=3).json() + for tab in tabs: + if tab['type'] == 'page': + return + except Exception: + sleep(.2) + + if ip in ('127.0.0.1', 'localhost'): + raise BrowserConnectError(f'{port}端口不是Chromium内核浏览器或该浏览器未允许控制。') + raise BrowserConnectError(f'{ip}:{port}浏览器无法链接。') + + def _run_browser(port, path: str, args) -> Popen: """创建chrome进程 :param port: 端口号 @@ -146,19 +170,19 @@ def _run_browser(port, path: str, args) -> Popen: """ arguments = [path, f'--remote-debugging-port={port}'] arguments.extend(args) - debugger = Popen(arguments, shell=False) + return Popen(arguments, shell=False) - end_time = perf_counter() + 10 - while perf_counter() < end_time: - try: - tabs = requests_get(f'http://127.0.0.1:{port}/json').json() - for tab in tabs: - if tab['type'] == 'page': - return debugger - except Exception: - sleep(.2) - - raise BrowserConnectError + # end_time = perf_counter() + 10 + # while perf_counter() < end_time: + # try: + # tabs = requests_get(f'http://127.0.0.1:{port}/json', timeout=2).json() + # for tab in tabs: + # if tab['type'] == 'page': + # return debugger + # except Exception: + # sleep(.2) + # + # raise BrowserConnectError def _make_leave_in_dict(target_dict: dict, src: list, num: int, end: int) -> None: