mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
一些修改(+)
修复auto_port()问题; 修复cookie设置问题 go_on改成resume; ready_state增加'connecting'; ChromiumShadowRoot改为ShadowRoot
This commit is contained in:
parent
545b7a0732
commit
0cc81621de
@ -85,7 +85,7 @@ class BaseElement(BaseParser):
|
|||||||
|
|
||||||
class DrissionElement(BaseElement):
|
class DrissionElement(BaseElement):
|
||||||
"""ChromiumElement 和 SessionElement的基类
|
"""ChromiumElement 和 SessionElement的基类
|
||||||
但不是ShadowRootElement的基类"""
|
但不是ShadowRoot的基类"""
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def link(self):
|
def link(self):
|
||||||
|
@ -599,19 +599,19 @@ class ChromiumOptions(object):
|
|||||||
|
|
||||||
class PortFinder(object):
|
class PortFinder(object):
|
||||||
used_port = {}
|
used_port = {}
|
||||||
|
lock = Lock()
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.tmp_dir = Path(gettempdir()) / 'DrissionPage' / 'TempFolder'
|
self.tmp_dir = Path(gettempdir()) / 'DrissionPage' / 'TempFolder'
|
||||||
self.tmp_dir.mkdir(parents=True, exist_ok=True)
|
self.tmp_dir.mkdir(parents=True, exist_ok=True)
|
||||||
if not PortFinder.used_port:
|
if not PortFinder.used_port:
|
||||||
clean_folder(self.tmp_dir)
|
clean_folder(self.tmp_dir)
|
||||||
self._lock = Lock()
|
|
||||||
|
|
||||||
def get_port(self):
|
def get_port(self):
|
||||||
"""查找一个可用端口
|
"""查找一个可用端口
|
||||||
:return: 可以使用的端口和用户文件夹路径组成的元组
|
:return: 可以使用的端口和用户文件夹路径组成的元组
|
||||||
"""
|
"""
|
||||||
with self._lock:
|
with PortFinder.lock:
|
||||||
for i in range(9600, 19600):
|
for i in range(9600, 19600):
|
||||||
if i in PortFinder.used_port:
|
if i in PortFinder.used_port:
|
||||||
continue
|
continue
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
@Contact : g1879@qq.com
|
@Contact : g1879@qq.com
|
||||||
"""
|
"""
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from threading import Lock
|
||||||
from typing import Union, Tuple, Any, Literal
|
from typing import Union, Tuple, Any, Literal
|
||||||
|
|
||||||
|
|
||||||
@ -152,6 +153,7 @@ class ChromiumOptions(object):
|
|||||||
|
|
||||||
class PortFinder(object):
|
class PortFinder(object):
|
||||||
used_port: dict = ...
|
used_port: dict = ...
|
||||||
|
lock: Lock = ...
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_port() -> Tuple[int, str]: ...
|
def get_port() -> Tuple[int, str]: ...
|
||||||
|
@ -159,7 +159,7 @@ class ChromiumElement(DrissionElement):
|
|||||||
if not info.get('shadowRoots', None):
|
if not info.get('shadowRoots', None):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return ChromiumShadowRoot(self, backend_id=info['shadowRoots'][0]['backendNodeId'])
|
return ShadowRoot(self, backend_id=info['shadowRoots'][0]['backendNodeId'])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sr(self):
|
def sr(self):
|
||||||
@ -764,8 +764,8 @@ class ChromiumElement(DrissionElement):
|
|||||||
return self.rect.size
|
return self.rect.size
|
||||||
|
|
||||||
|
|
||||||
class ChromiumShadowRoot(BaseElement):
|
class ShadowRoot(BaseElement):
|
||||||
"""ChromiumShadowRoot是用于处理ShadowRoot的类,使用方法和ChromiumElement基本一致"""
|
"""ShadowRoot是用于处理ShadowRoot的类,使用方法和ChromiumElement基本一致"""
|
||||||
|
|
||||||
def __init__(self, parent_ele, obj_id=None, backend_id=None):
|
def __init__(self, parent_ele, obj_id=None, backend_id=None):
|
||||||
"""
|
"""
|
||||||
@ -786,7 +786,7 @@ class ChromiumShadowRoot(BaseElement):
|
|||||||
self._states = None
|
self._states = None
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'<ChromiumShadowRoot in {self.parent_ele}>'
|
return f'<ShadowRoot in {self.parent_ele}>'
|
||||||
|
|
||||||
def __call__(self, loc_or_str, timeout=None):
|
def __call__(self, loc_or_str, timeout=None):
|
||||||
"""在内部查找元素
|
"""在内部查找元素
|
||||||
@ -1278,7 +1278,7 @@ def run_js(page_or_ele, script, as_expr=False, timeout=None, args=None):
|
|||||||
:param args: 参数,按顺序在js文本中对应arguments[0]、arguments[1]...
|
:param args: 参数,按顺序在js文本中对应arguments[0]、arguments[1]...
|
||||||
:return: js执行结果
|
:return: js执行结果
|
||||||
"""
|
"""
|
||||||
if isinstance(page_or_ele, (ChromiumElement, ChromiumShadowRoot)):
|
if isinstance(page_or_ele, (ChromiumElement, ShadowRoot)):
|
||||||
page = page_or_ele.page
|
page = page_or_ele.page
|
||||||
obj_id = page_or_ele._obj_id
|
obj_id = page_or_ele._obj_id
|
||||||
is_page = False
|
is_page = False
|
||||||
@ -1337,7 +1337,7 @@ def parse_js_result(page, ele, result):
|
|||||||
elif sub_type == 'node':
|
elif sub_type == 'node':
|
||||||
class_name = result['className']
|
class_name = result['className']
|
||||||
if class_name == 'ShadowRoot':
|
if class_name == 'ShadowRoot':
|
||||||
return ChromiumShadowRoot(ele, obj_id=result['objectId'])
|
return ShadowRoot(ele, obj_id=result['objectId'])
|
||||||
elif class_name == 'HTMLDocument':
|
elif class_name == 'HTMLDocument':
|
||||||
return result
|
return result
|
||||||
else:
|
else:
|
||||||
|
@ -80,10 +80,10 @@ class ChromiumElement(DrissionElement):
|
|||||||
def pseudo(self) -> Pseudo: ...
|
def pseudo(self) -> Pseudo: ...
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def shadow_root(self) -> Union[None, ChromiumShadowRoot]: ...
|
def shadow_root(self) -> Union[None, ShadowRoot]: ...
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sr(self) -> Union[None, ChromiumShadowRoot]: ...
|
def sr(self) -> Union[None, ShadowRoot]: ...
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def scroll(self) -> ElementScroller: ...
|
def scroll(self) -> ElementScroller: ...
|
||||||
@ -205,7 +205,7 @@ class ChromiumElement(DrissionElement):
|
|||||||
def _get_ele_path(self, mode: str) -> str: ...
|
def _get_ele_path(self, mode: str) -> str: ...
|
||||||
|
|
||||||
|
|
||||||
class ChromiumShadowRoot(BaseElement):
|
class ShadowRoot(BaseElement):
|
||||||
|
|
||||||
def __init__(self, parent_ele: ChromiumElement, obj_id: str = None, backend_id: str = None):
|
def __init__(self, parent_ele: ChromiumElement, obj_id: str = None, backend_id: str = None):
|
||||||
self._obj_id: str = ...
|
self._obj_id: str = ...
|
||||||
@ -300,7 +300,7 @@ def make_chromium_ele(page: ChromiumBase, node_id: str = ..., obj_id: str = ...)
|
|||||||
def make_js_for_find_ele_by_xpath(xpath: str, type_txt: str, node_txt: str) -> str: ...
|
def make_js_for_find_ele_by_xpath(xpath: str, type_txt: str, node_txt: str) -> str: ...
|
||||||
|
|
||||||
|
|
||||||
def run_js(page_or_ele: Union[ChromiumBase, ChromiumElement, ChromiumShadowRoot], script: str,
|
def run_js(page_or_ele: Union[ChromiumBase, ChromiumElement, ShadowRoot], script: str,
|
||||||
as_expr: bool = False, timeout: float = None, args: tuple = ...) -> Any: ...
|
as_expr: bool = False, timeout: float = None, args: tuple = ...) -> Any: ...
|
||||||
|
|
||||||
|
|
||||||
|
@ -349,7 +349,7 @@ def make_session_ele(html_or_ele, loc=None, single=True):
|
|||||||
page = None
|
page = None
|
||||||
html_or_ele = fromstring(html_or_ele)
|
html_or_ele = fromstring(html_or_ele)
|
||||||
|
|
||||||
# ShadowRootElement, ChromiumShadowRoot, ChromiumFrame
|
# ShadowRoot, ChromiumFrame
|
||||||
elif isinstance(html_or_ele, BaseElement) or the_type.endswith(".ChromiumFrame'>"):
|
elif isinstance(html_or_ele, BaseElement) or the_type.endswith(".ChromiumFrame'>"):
|
||||||
page = html_or_ele.page
|
page = html_or_ele.page
|
||||||
html_or_ele = fromstring(html_or_ele.html)
|
html_or_ele = fromstring(html_or_ele.html)
|
||||||
|
@ -250,7 +250,8 @@ def set_browser_cookies(page, cookies):
|
|||||||
if 'expiry' in cookie:
|
if 'expiry' in cookie:
|
||||||
cookie['expires'] = int(cookie['expiry'])
|
cookie['expires'] = int(cookie['expiry'])
|
||||||
cookie.pop('expiry')
|
cookie.pop('expiry')
|
||||||
if 'expires' in cookie:
|
|
||||||
|
if 'expires' in cookie and isinstance(cookie['expires'], str):
|
||||||
if cookie['expires'].isdigit():
|
if cookie['expires'].isdigit():
|
||||||
cookie['expires'] = int(cookie['expires'])
|
cookie['expires'] = int(cookie['expires'])
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ class ChromiumBase(BasePage):
|
|||||||
print('在FrameStartedLoading变成loading')
|
print('在FrameStartedLoading变成loading')
|
||||||
|
|
||||||
self._doc_got = False
|
self._doc_got = False
|
||||||
self._ready_state = 'loading'
|
self._ready_state = 'connecting'
|
||||||
self._is_loading = True
|
self._is_loading = True
|
||||||
self._load_end_time = perf_counter() + self.timeouts.page_load
|
self._load_end_time = perf_counter() + self.timeouts.page_load
|
||||||
if self._load_mode == 'eager':
|
if self._load_mode == 'eager':
|
||||||
|
@ -173,7 +173,7 @@ class Listener(object):
|
|||||||
if clear:
|
if clear:
|
||||||
self.clear()
|
self.clear()
|
||||||
|
|
||||||
def go_on(self):
|
def resume(self):
|
||||||
"""继续暂停的监听"""
|
"""继续暂停的监听"""
|
||||||
if self.listening:
|
if self.listening:
|
||||||
return
|
return
|
||||||
|
@ -38,7 +38,7 @@ class Listener(object):
|
|||||||
|
|
||||||
def pause(self, clear: bool = True) -> None: ...
|
def pause(self, clear: bool = True) -> None: ...
|
||||||
|
|
||||||
def go_on(self) -> None: ...
|
def resume(self) -> None: ...
|
||||||
|
|
||||||
def wait(self, count: int = 1, timeout: float = None, fit_count: bool = True,
|
def wait(self, count: int = 1, timeout: float = None, fit_count: bool = True,
|
||||||
raise_err: bool = None) -> Union[List[DataPacket], DataPacket, None]: ...
|
raise_err: bool = None) -> Union[List[DataPacket], DataPacket, None]: ...
|
||||||
|
@ -129,12 +129,12 @@ class PageStates(object):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def ready_state(self):
|
def ready_state(self):
|
||||||
"""返回当前页面加载状态,'loading' 'interactive' 'complete'"""
|
"""返回当前页面加载状态,'connecting' 'loading' 'interactive' 'complete'"""
|
||||||
return self._page._ready_state
|
return self._page._ready_state
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def has_alert(self):
|
def has_alert(self):
|
||||||
"""返回当前页面加载状态,'loading' 'interactive' 'complete'"""
|
"""返回当前页面是否存在弹窗"""
|
||||||
return self._page._has_alert
|
return self._page._has_alert
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"""
|
"""
|
||||||
from typing import Union, Tuple, List, Optional
|
from typing import Union, Tuple, List, Optional
|
||||||
|
|
||||||
from .._elements.chromium_element import ChromiumShadowRoot, ChromiumElement
|
from .._elements.chromium_element import ShadowRoot, ChromiumElement
|
||||||
from .._pages.chromium_base import ChromiumBase
|
from .._pages.chromium_base import ChromiumBase
|
||||||
from .._pages.chromium_frame import ChromiumFrame
|
from .._pages.chromium_frame import ChromiumFrame
|
||||||
|
|
||||||
@ -43,11 +43,11 @@ class ElementStates(object):
|
|||||||
|
|
||||||
|
|
||||||
class ShadowRootStates(object):
|
class ShadowRootStates(object):
|
||||||
def __init__(self, ele: ChromiumShadowRoot):
|
def __init__(self, ele: ShadowRoot):
|
||||||
"""
|
"""
|
||||||
:param ele: ChromiumElement
|
:param ele: ChromiumElement
|
||||||
"""
|
"""
|
||||||
self._ele: ChromiumShadowRoot = ...
|
self._ele: ShadowRoot = ...
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_enabled(self) -> bool: ...
|
def is_enabled(self) -> bool: ...
|
||||||
|
Loading…
x
Reference in New Issue
Block a user