diff --git a/DrissionPage/chromium_base.py b/DrissionPage/chromium_base.py index 9b0cb3c..00e3871 100644 --- a/DrissionPage/chromium_base.py +++ b/DrissionPage/chromium_base.py @@ -429,13 +429,16 @@ class ChromiumBase(BasePage): timeout=timeout) return self._url_available - def get_cookies(self, as_dict=False, all_info=False): + def get_cookies(self, as_dict=False, all_domains=False, all_info=False): """获取cookies信息 :param as_dict: 为True时返回由{name: value}键值对组成的dict,为True时返回list且all_info无效 + :param all_domains: 是否返回所有域的cookies :param all_info: 是否返回所有信息,为False时只返回name、value、domain :return: cookies信息 """ - cookies = self.run_cdp_loaded('Network.getCookies')['cookies'] + txt = 'Storage' if all_domains else 'Network' + cookies = self.run_cdp_loaded(f'{txt}.getCookies')['cookies'] + if as_dict: return {cookie['name']: cookie['value'] for cookie in cookies} elif all_info: @@ -933,6 +936,7 @@ class ChromiumBaseSetter(object): result_cookies.append({'value': '' if cookie['value'] is None else cookie['value'], 'name': cookie['name'], 'domain': cookie['domain']}) + self._page.run_cdp_loaded('Network.setCookies', cookies=result_cookies) def upload_files(self, files): @@ -953,6 +957,7 @@ class ChromiumBaseSetter(object): :param headers: dict格式的headers数据 :return: None """ + self._page.run_cdp('Network.enable') self._page.run_cdp('Network.setExtraHTTPHeaders', headers=headers) diff --git a/DrissionPage/chromium_base.pyi b/DrissionPage/chromium_base.pyi index 9967c6e..7e50910 100644 --- a/DrissionPage/chromium_base.pyi +++ b/DrissionPage/chromium_base.pyi @@ -138,7 +138,7 @@ class ChromiumBase(BasePage): interval: float = None, timeout: float = None) -> Union[None, bool]: ... - def get_cookies(self, as_dict: bool = False, all_info: bool = False) -> Union[list, dict]: ... + def get_cookies(self, as_dict: bool = False, all_domains: bool =False, all_info: bool = False) -> Union[list, dict]: ... def ele(self, loc_or_ele: Union[Tuple[str, str], str, ChromiumElement, ChromiumFrame], diff --git a/DrissionPage/chromium_element.py b/DrissionPage/chromium_element.py index 8af8344..8a67c9f 100644 --- a/DrissionPage/chromium_element.py +++ b/DrissionPage/chromium_element.py @@ -501,7 +501,9 @@ class ChromiumElement(DrissionElement): try: self.page.run_cdp('DOM.focus', backendNodeId=self._backend_id) except Exception: - self.click(by_js=True) + pass + self.click(by_js=True) + self.click.at() if clear and vals != '\n': self.clear(by_js=False) diff --git a/DrissionPage/chromium_tab.py b/DrissionPage/chromium_tab.py index e566f0c..6cbe677 100644 --- a/DrissionPage/chromium_tab.py +++ b/DrissionPage/chromium_tab.py @@ -68,10 +68,15 @@ class WebPageTab(SessionPage, ChromiumTab): def url(self): """返回当前url""" if self._mode == 'd': - return super(SessionPage, self).url if self._tab_obj else None + return self._browser_url elif self._mode == 's': return self._session_url + @property + def _browser_url(self): + """返回浏览器当前url""" + return super(SessionPage, self).url if self._tab_obj else None + @property def title(self): """返回当前页面title""" @@ -276,11 +281,14 @@ class WebPageTab(SessionPage, ChromiumTab): :param copy_user_agent: 是否复制ua信息 :return: None """ + if not self._has_session: + return + if copy_user_agent: selenium_user_agent = self.run_cdp('Runtime.evaluate', expression='navigator.userAgent;')['result']['value'] self.session.headers.update({"User-Agent": selenium_user_agent}) - self.set.cookies(self._get_driver_cookies(as_dict=True, all_info=False), set_session=True) + set_session_cookies(self.session, self._get_driver_cookies(as_dict=True)) def cookies_to_browser(self): """把session对象的cookies复制到浏览器""" @@ -290,6 +298,7 @@ class WebPageTab(SessionPage, ChromiumTab): else: # 域名 u = netloc.split('.') domain = f'.{u[-2]}.{u[-1]}' if len(u) > 1 else netloc + cookies = [] for cookie in super().get_cookies(): if cookie.get('domain', None) is None: @@ -297,7 +306,8 @@ class WebPageTab(SessionPage, ChromiumTab): if domain in cookie['domain']: cookies.append(cookie) - self.set.cookies(cookies, set_driver=True) + + self.run_cdp_loaded('Network.setCookies', cookies=cookies) def get_cookies(self, as_dict=False, all_domains=False, all_info=False): """返回cookies @@ -348,16 +358,14 @@ class WebPageTabSetter(ChromiumBaseSetter): self._session_setter = SessionPageSetter(self._page) self._chromium_setter = ChromiumBaseSetter(self._page) - def cookies(self, cookies, set_session=False, set_driver=False): + def cookies(self, cookies): """添加cookies信息到浏览器或session对象 :param cookies: 可以接收`CookieJar`、`list`、`tuple`、`str`、`dict`格式的`cookies` - :param set_session: 是否设置到Session对象 - :param set_driver: 是否设置到浏览器 :return: None """ - if set_driver and self._page._has_driver: + if self._page.mode == 'd' and self._page._has_driver: self._chromium_setter.cookies(cookies) - if set_session and self._page._has_session: + elif self._page.mode == 's' and self._page._has_session: self._session_setter.cookies(cookies) def headers(self, headers) -> None: diff --git a/DrissionPage/chromium_tab.pyi b/DrissionPage/chromium_tab.pyi index 396d0ff..915c03d 100644 --- a/DrissionPage/chromium_tab.pyi +++ b/DrissionPage/chromium_tab.pyi @@ -41,6 +41,9 @@ class WebPageTab(SessionPage, ChromiumTab): @property def url(self) -> Union[str, None]: ... + @property + def _browser_url(self) -> Union[str, None]: ... + @property def title(self) -> str: ... @@ -160,7 +163,7 @@ class WebPageTabSetter(ChromiumBaseSetter): def headers(self, headers: dict) -> None: ... - def cookies(self, cookies, set_session: bool = False, set_driver: bool = False) -> None: ... + def cookies(self, cookies) -> None: ... class WebPageTabDownloadSetter(DownloadSetter): diff --git a/DrissionPage/configs/configs.ini b/DrissionPage/configs/configs.ini index 4f1ed10..6591d2f 100644 --- a/DrissionPage/configs/configs.ini +++ b/DrissionPage/configs/configs.ini @@ -1,11 +1,11 @@ [paths] chromedriver_path = -download_path = +download_path = [chrome_options] debugger_address = 127.0.0.1:9222 binary_location = chrome -arguments = ['--no-first-run', '--disable-gpu', '--disable-infobars', '--disable-popup-blocking'] +arguments = ['--remote-allow-origins=*', '--no-first-run', '--disable-gpu', '--disable-infobars', '--disable-popup-blocking'] extensions = [] experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}}} page_load_strategy = normal @@ -22,6 +22,6 @@ page_load = 30 script = 30 [proxies] -http = +http = https = diff --git a/DrissionPage/session_page.py b/DrissionPage/session_page.py index 460a2dd..89ebab8 100644 --- a/DrissionPage/session_page.py +++ b/DrissionPage/session_page.py @@ -196,6 +196,7 @@ class SessionPage(BasePage): else: # 域名 u = netloc.split('.') domain = f'.{u[-2]}.{u[-1]}' if len(u) > 1 else netloc + cookies = tuple(x for x in self.session.cookies if domain in x.domain or x.domain == '') else: cookies = tuple(x for x in self.session.cookies) diff --git a/DrissionPage/web_page.py b/DrissionPage/web_page.py index 9a68387..410e67e 100644 --- a/DrissionPage/web_page.py +++ b/DrissionPage/web_page.py @@ -9,6 +9,7 @@ from warnings import warn from requests import Session +from .commons.web import set_session_cookies from .base import BasePage from .chromium_base import ChromiumBase, Timeout from .chromium_driver import ChromiumDriver @@ -137,10 +138,15 @@ class WebPage(SessionPage, ChromiumPage, BasePage): def url(self): """返回当前url""" if self._mode == 'd': - return super(SessionPage, self).url if self._tab_obj else None + return self._browser_url elif self._mode == 's': return self._session_url + @property + def _browser_url(self): + """返回浏览器当前url""" + return super(SessionPage, self).url if self._tab_obj else None + @property def title(self): """返回当前页面title""" @@ -350,28 +356,36 @@ class WebPage(SessionPage, ChromiumPage, BasePage): :param copy_user_agent: 是否复制ua信息 :return: None """ + if not self._has_session: + return + if copy_user_agent: selenium_user_agent = self.run_cdp('Runtime.evaluate', expression='navigator.userAgent;')['result']['value'] self.session.headers.update({"User-Agent": selenium_user_agent}) - self.set.cookies(self._get_driver_cookies(as_dict=True), set_session=True) + set_session_cookies(self.session, self._get_driver_cookies(as_dict=True)) def cookies_to_browser(self): """把session对象的cookies复制到浏览器""" - netloc = urlparse(self.url).netloc + if not self._has_driver: + return + + netloc = urlparse(self._browser_url).netloc if netloc.replace('.', '').isdigit(): # ip domain = netloc else: # 域名 u = netloc.split('.') domain = f'.{u[-2]}.{u[-1]}' if len(u) > 1 else netloc + cookies = [] for cookie in super().get_cookies(): - if cookie.get('domain', None) is None: + if not cookie.get('domain', None): cookie['domain'] = domain if domain in cookie['domain']: cookies.append(cookie) - self.set.cookies(cookies, set_driver=True) + + self.run_cdp_loaded('Network.setCookies', cookies=cookies) def get_cookies(self, as_dict=False, all_domains=False, all_info=False): """返回cookies @@ -489,16 +503,14 @@ class WebPageSetter(ChromiumPageSetter): self._session_setter = SessionPageSetter(self._page) self._chromium_setter = ChromiumPageSetter(self._page) - def cookies(self, cookies, set_session=True, set_driver=True): + def cookies(self, cookies): """添加cookies信息到浏览器或session对象 :param cookies: 可以接收`CookieJar`、`list`、`tuple`、`str`、`dict`格式的`cookies` - :param set_session: 是否设置到Session对象 - :param set_driver: 是否设置到浏览器 :return: None """ - if set_driver and self._page._has_driver: + if self._page.mode == 'd' and self._page._has_driver: self._chromium_setter.cookies(cookies) - if set_session and self._page._has_session: + elif self._page.mode == 's' and self._page._has_session: self._session_setter.cookies(cookies) def headers(self, headers) -> None: @@ -506,16 +518,16 @@ class WebPageSetter(ChromiumPageSetter): :param headers: dict格式的headers数据 :return: None """ - if self._page._has_session: + if self._page.mode == 's': self._session_setter.headers(headers) - if self._page._has_driver: + else: self._chromium_setter.headers(headers) def user_agent(self, ua, platform=None): """设置user agent,d模式下只有当前tab有效""" - if self._page._has_session: + if self._page.mode == 's': self._session_setter.user_agent(ua) - if self._page._has_driver: + else: self._chromium_setter.user_agent(ua, platform) diff --git a/DrissionPage/web_page.pyi b/DrissionPage/web_page.pyi index 042cff8..59eda0b 100644 --- a/DrissionPage/web_page.pyi +++ b/DrissionPage/web_page.pyi @@ -46,6 +46,9 @@ class WebPage(SessionPage, ChromiumPage, BasePage): @property def url(self) -> Union[str, None]: ... + @property + def _browser_url(self) -> Union[str, None]: ... + @property def title(self) -> str: ... @@ -181,7 +184,7 @@ class WebPageSetter(ChromiumPageSetter): def headers(self, headers: dict) -> None: ... - def cookies(self, cookies, set_session: bool = False, set_driver: bool = False) -> None: ... + def cookies(self, cookies) -> None: ... class WebPageDownloadSetter(ChromiumDownloadSetter): diff --git a/setup.py b/setup.py index dd1f9c1..065446d 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ with open("README.md", "r", encoding='utf-8') as fh: setup( name="DrissionPage", - version="3.2.14", + version="3.2.15", author="g1879", author_email="g1879@qq.com", description="Python based web automation tool. It can control the browser and send and receive data packets.",