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)
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时只返回namevaluedomain
: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)

View File

@ -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],

View File

@ -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)

View File

@ -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:

View File

@ -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):

View File

@ -5,7 +5,7 @@ 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

View File

@ -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)

View File

@ -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 agentd模式下只有当前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)

View File

@ -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):

View File

@ -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.",