mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
3.2.15适配Chrome111版本;修复cookies相关问题;浏览器页面对象get_cookiees()增加all_domains参数;优化输入文本前的点击;WebPage的set_cookies()删除两个参数
This commit is contained in:
parent
c2a29dc066
commit
0706936662
@ -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)
|
||||
|
||||
|
||||
|
@ -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],
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
@ -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):
|
||||
|
2
setup.py
2
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.",
|
||||
|
Loading…
x
Reference in New Issue
Block a user