3.2.15适配Chrome111版本;修复cookies相关问题;浏览器页面对象get_cookiees()增加all_domains参数;优化输入文本前的点击;WebPage的set_cookies()删除两个参数

This commit is contained in:
g1879 2023-03-10 20:36:04 +08:00
parent c2a29dc066
commit 0706936662
10 changed files with 66 additions and 32 deletions

View File

@ -429,13 +429,16 @@ class ChromiumBase(BasePage):
timeout=timeout) timeout=timeout)
return self._url_available 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信息 """获取cookies信息
:param as_dict: 为True时返回由{name: value}键值对组成的dict为True时返回list且all_info无效 :param as_dict: 为True时返回由{name: value}键值对组成的dict为True时返回list且all_info无效
:param all_domains: 是否返回所有域的cookies
:param all_info: 是否返回所有信息为False时只返回namevaluedomain :param all_info: 是否返回所有信息为False时只返回namevaluedomain
:return: cookies信息 :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: if as_dict:
return {cookie['name']: cookie['value'] for cookie in cookies} return {cookie['name']: cookie['value'] for cookie in cookies}
elif all_info: elif all_info:
@ -933,6 +936,7 @@ class ChromiumBaseSetter(object):
result_cookies.append({'value': '' if cookie['value'] is None else cookie['value'], result_cookies.append({'value': '' if cookie['value'] is None else cookie['value'],
'name': cookie['name'], 'name': cookie['name'],
'domain': cookie['domain']}) 'domain': cookie['domain']})
self._page.run_cdp_loaded('Network.setCookies', cookies=result_cookies) self._page.run_cdp_loaded('Network.setCookies', cookies=result_cookies)
def upload_files(self, files): def upload_files(self, files):
@ -953,6 +957,7 @@ class ChromiumBaseSetter(object):
:param headers: dict格式的headers数据 :param headers: dict格式的headers数据
:return: None :return: None
""" """
self._page.run_cdp('Network.enable')
self._page.run_cdp('Network.setExtraHTTPHeaders', headers=headers) self._page.run_cdp('Network.setExtraHTTPHeaders', headers=headers)

View File

@ -138,7 +138,7 @@ class ChromiumBase(BasePage):
interval: float = None, interval: float = None,
timeout: float = None) -> Union[None, bool]: ... 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, def ele(self,
loc_or_ele: Union[Tuple[str, str], str, ChromiumElement, ChromiumFrame], loc_or_ele: Union[Tuple[str, str], str, ChromiumElement, ChromiumFrame],

View File

@ -501,7 +501,9 @@ class ChromiumElement(DrissionElement):
try: try:
self.page.run_cdp('DOM.focus', backendNodeId=self._backend_id) self.page.run_cdp('DOM.focus', backendNodeId=self._backend_id)
except Exception: except Exception:
self.click(by_js=True) pass
self.click(by_js=True)
self.click.at()
if clear and vals != '\n': if clear and vals != '\n':
self.clear(by_js=False) self.clear(by_js=False)

View File

@ -68,10 +68,15 @@ class WebPageTab(SessionPage, ChromiumTab):
def url(self): def url(self):
"""返回当前url""" """返回当前url"""
if self._mode == 'd': if self._mode == 'd':
return super(SessionPage, self).url if self._tab_obj else None return self._browser_url
elif self._mode == 's': elif self._mode == 's':
return self._session_url return self._session_url
@property
def _browser_url(self):
"""返回浏览器当前url"""
return super(SessionPage, self).url if self._tab_obj else None
@property @property
def title(self): def title(self):
"""返回当前页面title""" """返回当前页面title"""
@ -276,11 +281,14 @@ class WebPageTab(SessionPage, ChromiumTab):
:param copy_user_agent: 是否复制ua信息 :param copy_user_agent: 是否复制ua信息
:return: None :return: None
""" """
if not self._has_session:
return
if copy_user_agent: if copy_user_agent:
selenium_user_agent = self.run_cdp('Runtime.evaluate', expression='navigator.userAgent;')['result']['value'] selenium_user_agent = self.run_cdp('Runtime.evaluate', expression='navigator.userAgent;')['result']['value']
self.session.headers.update({"User-Agent": selenium_user_agent}) 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): def cookies_to_browser(self):
"""把session对象的cookies复制到浏览器""" """把session对象的cookies复制到浏览器"""
@ -290,6 +298,7 @@ class WebPageTab(SessionPage, ChromiumTab):
else: # 域名 else: # 域名
u = netloc.split('.') u = netloc.split('.')
domain = f'.{u[-2]}.{u[-1]}' if len(u) > 1 else netloc domain = f'.{u[-2]}.{u[-1]}' if len(u) > 1 else netloc
cookies = [] cookies = []
for cookie in super().get_cookies(): for cookie in super().get_cookies():
if cookie.get('domain', None) is None: if cookie.get('domain', None) is None:
@ -297,7 +306,8 @@ class WebPageTab(SessionPage, ChromiumTab):
if domain in cookie['domain']: if domain in cookie['domain']:
cookies.append(cookie) 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): def get_cookies(self, as_dict=False, all_domains=False, all_info=False):
"""返回cookies """返回cookies
@ -348,16 +358,14 @@ class WebPageTabSetter(ChromiumBaseSetter):
self._session_setter = SessionPageSetter(self._page) self._session_setter = SessionPageSetter(self._page)
self._chromium_setter = ChromiumBaseSetter(self._page) self._chromium_setter = ChromiumBaseSetter(self._page)
def cookies(self, cookies, set_session=False, set_driver=False): def cookies(self, cookies):
"""添加cookies信息到浏览器或session对象 """添加cookies信息到浏览器或session对象
:param cookies: 可以接收`CookieJar``list``tuple``str``dict`格式的`cookies` :param cookies: 可以接收`CookieJar``list``tuple``str``dict`格式的`cookies`
:param set_session: 是否设置到Session对象
:param set_driver: 是否设置到浏览器
:return: None :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) 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) self._session_setter.cookies(cookies)
def headers(self, headers) -> None: def headers(self, headers) -> None:

View File

@ -41,6 +41,9 @@ class WebPageTab(SessionPage, ChromiumTab):
@property @property
def url(self) -> Union[str, None]: ... def url(self) -> Union[str, None]: ...
@property
def _browser_url(self) -> Union[str, None]: ...
@property @property
def title(self) -> str: ... def title(self) -> str: ...
@ -160,7 +163,7 @@ class WebPageTabSetter(ChromiumBaseSetter):
def headers(self, headers: dict) -> None: ... 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): class WebPageTabDownloadSetter(DownloadSetter):

View File

@ -1,11 +1,11 @@
[paths] [paths]
chromedriver_path = chromedriver_path =
download_path = download_path =
[chrome_options] [chrome_options]
debugger_address = 127.0.0.1:9222 debugger_address = 127.0.0.1:9222
binary_location = chrome 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 = [] extensions = []
experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}}} experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}}}
page_load_strategy = normal page_load_strategy = normal
@ -22,6 +22,6 @@ page_load = 30
script = 30 script = 30
[proxies] [proxies]
http = http =
https = https =

View File

@ -196,6 +196,7 @@ class SessionPage(BasePage):
else: # 域名 else: # 域名
u = netloc.split('.') u = netloc.split('.')
domain = f'.{u[-2]}.{u[-1]}' if len(u) > 1 else netloc 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 == '') cookies = tuple(x for x in self.session.cookies if domain in x.domain or x.domain == '')
else: else:
cookies = tuple(x for x in self.session.cookies) cookies = tuple(x for x in self.session.cookies)

View File

@ -9,6 +9,7 @@ from warnings import warn
from requests import Session from requests import Session
from .commons.web import set_session_cookies
from .base import BasePage from .base import BasePage
from .chromium_base import ChromiumBase, Timeout from .chromium_base import ChromiumBase, Timeout
from .chromium_driver import ChromiumDriver from .chromium_driver import ChromiumDriver
@ -137,10 +138,15 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
def url(self): def url(self):
"""返回当前url""" """返回当前url"""
if self._mode == 'd': if self._mode == 'd':
return super(SessionPage, self).url if self._tab_obj else None return self._browser_url
elif self._mode == 's': elif self._mode == 's':
return self._session_url return self._session_url
@property
def _browser_url(self):
"""返回浏览器当前url"""
return super(SessionPage, self).url if self._tab_obj else None
@property @property
def title(self): def title(self):
"""返回当前页面title""" """返回当前页面title"""
@ -350,28 +356,36 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
:param copy_user_agent: 是否复制ua信息 :param copy_user_agent: 是否复制ua信息
:return: None :return: None
""" """
if not self._has_session:
return
if copy_user_agent: if copy_user_agent:
selenium_user_agent = self.run_cdp('Runtime.evaluate', expression='navigator.userAgent;')['result']['value'] selenium_user_agent = self.run_cdp('Runtime.evaluate', expression='navigator.userAgent;')['result']['value']
self.session.headers.update({"User-Agent": selenium_user_agent}) 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): def cookies_to_browser(self):
"""把session对象的cookies复制到浏览器""" """把session对象的cookies复制到浏览器"""
netloc = urlparse(self.url).netloc if not self._has_driver:
return
netloc = urlparse(self._browser_url).netloc
if netloc.replace('.', '').isdigit(): # ip if netloc.replace('.', '').isdigit(): # ip
domain = netloc domain = netloc
else: # 域名 else: # 域名
u = netloc.split('.') u = netloc.split('.')
domain = f'.{u[-2]}.{u[-1]}' if len(u) > 1 else netloc domain = f'.{u[-2]}.{u[-1]}' if len(u) > 1 else netloc
cookies = [] cookies = []
for cookie in super().get_cookies(): for cookie in super().get_cookies():
if cookie.get('domain', None) is None: if not cookie.get('domain', None):
cookie['domain'] = domain cookie['domain'] = domain
if domain in cookie['domain']: if domain in cookie['domain']:
cookies.append(cookie) 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): def get_cookies(self, as_dict=False, all_domains=False, all_info=False):
"""返回cookies """返回cookies
@ -489,16 +503,14 @@ class WebPageSetter(ChromiumPageSetter):
self._session_setter = SessionPageSetter(self._page) self._session_setter = SessionPageSetter(self._page)
self._chromium_setter = ChromiumPageSetter(self._page) self._chromium_setter = ChromiumPageSetter(self._page)
def cookies(self, cookies, set_session=True, set_driver=True): def cookies(self, cookies):
"""添加cookies信息到浏览器或session对象 """添加cookies信息到浏览器或session对象
:param cookies: 可以接收`CookieJar``list``tuple``str``dict`格式的`cookies` :param cookies: 可以接收`CookieJar``list``tuple``str``dict`格式的`cookies`
:param set_session: 是否设置到Session对象
:param set_driver: 是否设置到浏览器
:return: None :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) 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) self._session_setter.cookies(cookies)
def headers(self, headers) -> None: def headers(self, headers) -> None:
@ -506,16 +518,16 @@ class WebPageSetter(ChromiumPageSetter):
:param headers: dict格式的headers数据 :param headers: dict格式的headers数据
:return: None :return: None
""" """
if self._page._has_session: if self._page.mode == 's':
self._session_setter.headers(headers) self._session_setter.headers(headers)
if self._page._has_driver: else:
self._chromium_setter.headers(headers) self._chromium_setter.headers(headers)
def user_agent(self, ua, platform=None): def user_agent(self, ua, platform=None):
"""设置user agentd模式下只有当前tab有效""" """设置user agentd模式下只有当前tab有效"""
if self._page._has_session: if self._page.mode == 's':
self._session_setter.user_agent(ua) self._session_setter.user_agent(ua)
if self._page._has_driver: else:
self._chromium_setter.user_agent(ua, platform) self._chromium_setter.user_agent(ua, platform)

View File

@ -46,6 +46,9 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
@property @property
def url(self) -> Union[str, None]: ... def url(self) -> Union[str, None]: ...
@property
def _browser_url(self) -> Union[str, None]: ...
@property @property
def title(self) -> str: ... def title(self) -> str: ...
@ -181,7 +184,7 @@ class WebPageSetter(ChromiumPageSetter):
def headers(self, headers: dict) -> None: ... 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): class WebPageDownloadSetter(ChromiumDownloadSetter):

View File

@ -6,7 +6,7 @@ with open("README.md", "r", encoding='utf-8') as fh:
setup( setup(
name="DrissionPage", name="DrissionPage",
version="3.2.14", version="3.2.15",
author="g1879", author="g1879",
author_email="g1879@qq.com", author_email="g1879@qq.com",
description="Python based web automation tool. It can control the browser and send and receive data packets.", description="Python based web automation tool. It can control the browser and send and receive data packets.",