支持离线运行;动作链type()增加interval参数

This commit is contained in:
g1879 2024-10-15 15:14:00 +08:00
parent b854df764c
commit 421bbc470b
7 changed files with 11862 additions and 28 deletions

View File

@ -8,7 +8,9 @@
from datetime import datetime from datetime import datetime
from http.cookiejar import Cookie, CookieJar from http.cookiejar import Cookie, CookieJar
from tldextract import extract from tldextract import TLDExtract
from .settings import Settings
def cookie_to_dict(cookie): def cookie_to_dict(cookie):
@ -90,6 +92,7 @@ def set_browser_cookies(browser, cookies):
def set_tab_cookies(page, cookies): def set_tab_cookies(page, cookies):
suffixes_list = f"file:///{Settings.locate_suffixes_list}"
for cookie in cookies_to_tuple(cookies): for cookie in cookies_to_tuple(cookies):
cookie = format_cookie(cookie) cookie = format_cookie(cookie)
@ -113,7 +116,8 @@ def set_tab_cookies(page, cookies):
url = page._browser_url url = page._browser_url
if not url.startswith('http'): if not url.startswith('http'):
raise RuntimeError(f'未设置域名请设置cookie的domain参数或先访问一个网站。{cookie}') raise RuntimeError(f'未设置域名请设置cookie的domain参数或先访问一个网站。{cookie}')
ex_url = extract(url) ex_url = TLDExtract(suffix_list_urls=["https://publicsuffix.org/list/public_suffix_list.dat",
suffixes_list]).extract_str(url)
d_list = ex_url.subdomain.split('.') d_list = ex_url.subdomain.split('.')
d_list.append(f'{ex_url.domain}.{ex_url.suffix}' if ex_url.suffix else ex_url.domain) d_list.append(f'{ex_url.domain}.{ex_url.suffix}' if ex_url.suffix else ex_url.domain)

View File

@ -5,6 +5,7 @@
@Copyright: (c) 2024 by g1879, Inc. All Rights Reserved. @Copyright: (c) 2024 by g1879, Inc. All Rights Reserved.
@License : BSD 3-Clause. @License : BSD 3-Clause.
""" """
from pathlib import Path
class Settings(object): class Settings(object):
@ -14,3 +15,7 @@ class Settings(object):
singleton_tab_obj = True singleton_tab_obj = True
cdp_timeout = 30 cdp_timeout = 30
auto_handle_alert = None auto_handle_alert = None
locate_suffixes_list = str(Path(__file__).parent.absolute() / 'suffixes.dat').replace('\\', '/')
def set_suffixes_list_path(self, path):
Settings.locate_suffixes_list = str(Path(path).absolute())

View File

@ -0,0 +1,26 @@
# -*- coding:utf-8 -*-
"""
@Author : g1879
@Contact : g1879@qq.com
@Copyright: (c) 2024 by g1879, Inc. All Rights Reserved.
@License : BSD 3-Clause.
"""
from pathlib import Path
from typing import Optional, Union
class Settings(object):
raise_when_ele_not_found: bool = ...
raise_when_click_failed: bool = ...
raise_when_wait_failed: bool = ...
singleton_tab_obj: bool = ...
cdp_timeout: float = ...
auto_handle_alert: Optional[bool] = ...
locate_suffixes_list: str = ...
def set_suffixes_list_path(self, path: Union[str, Path]) -> None:
"""设置用于识别域名后缀的文件路径
:param path: 文件路径
:return: None
"""
...

File diff suppressed because it is too large Load Diff

View File

@ -12,11 +12,12 @@ from urllib.parse import urlparse
from requests import Response from requests import Response
from requests.structures import CaseInsensitiveDict from requests.structures import CaseInsensitiveDict
from tldextract import extract from tldextract import TLDExtract
from .._base.base import BasePage from .._base.base import BasePage
from .._elements.session_element import SessionElement, make_session_ele from .._elements.session_element import SessionElement, make_session_ele
from .._functions.cookies import cookie_to_dict, CookiesList from .._functions.cookies import cookie_to_dict, CookiesList
from .._functions.settings import Settings
from .._functions.web import format_headers from .._functions.web import format_headers
from .._units.setter import SessionPageSetter from .._units.setter import SessionPageSetter
@ -155,7 +156,9 @@ class SessionPage(BasePage):
cookies = self.session.cookies cookies = self.session.cookies
else: else:
if self.url: if self.url:
ex_url = extract(self._session_url) ex_url = TLDExtract(
suffix_list_urls=["https://publicsuffix.org/list/public_suffix_list.dat",
f"file:///{Settings.locate_suffixes_list}"]).extract_str(self._session_url)
domain = f'{ex_url.domain}.{ex_url.suffix}' if ex_url.suffix else ex_url.domain domain = f'{ex_url.domain}.{ex_url.suffix}' if ex_url.suffix else ex_url.domain
cookies = tuple(c for c in self.session.cookies if domain in c.domain or c.domain == '') cookies = tuple(c for c in self.session.cookies if domain in c.domain or c.domain == '')
else: else:

View File

@ -179,7 +179,7 @@ class Actions:
self.owner._run_cdp('Input.dispatchKeyEvent', **data) self.owner._run_cdp('Input.dispatchKeyEvent', **data)
return self return self
def type(self, keys): def type(self, keys, interval=0):
modifiers = [] modifiers = []
if not isinstance(keys, (str, tuple, list)): if not isinstance(keys, (str, tuple, list)):
keys = str(keys) keys = str(keys)
@ -197,6 +197,7 @@ class Actions:
else: else:
self.owner._run_cdp('Input.dispatchKeyEvent', type='char', text=character) self.owner._run_cdp('Input.dispatchKeyEvent', type='char', text=character)
sleep(interval)
for m in modifiers: for m in modifiers:
self.key_up(m) self.key_up(m)

View File

@ -66,7 +66,7 @@ class Actions:
:param offset_x: 偏移量x :param offset_x: 偏移量x
:param offset_y: 偏移量y :param offset_y: 偏移量y
:param duration: 拖动用时传入0即瞬间到达 :param duration: 拖动用时传入0即瞬间到达
:return: self :return: 动作链对象本身
""" """
... ...
@ -75,7 +75,7 @@ class Actions:
:param offset_x: 偏移量x :param offset_x: 偏移量x
:param offset_y: 偏移量y :param offset_y: 偏移量y
:param duration: 拖动用时传入0即瞬间到达 :param duration: 拖动用时传入0即瞬间到达
:return: self :return: 动作链对象本身
""" """
... ...
@ -83,7 +83,7 @@ class Actions:
"""点击鼠标左键,可先移动到元素上 """点击鼠标左键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:param times: 点击次数 :param times: 点击次数
:return: self :return: 动作链对象本身
""" """
... ...
@ -91,7 +91,7 @@ class Actions:
"""点击鼠标右键,可先移动到元素上 """点击鼠标右键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:param times: 点击次数 :param times: 点击次数
:return: self :return: 动作链对象本身
""" """
... ...
@ -99,49 +99,49 @@ class Actions:
"""点击鼠标中键,可先移动到元素上 """点击鼠标中键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:param times: 点击次数 :param times: 点击次数
:return: self :return: 动作链对象本身
""" """
... ...
def hold(self, on_ele: Union[ChromiumElement, str] = None) -> Actions: def hold(self, on_ele: Union[ChromiumElement, str] = None) -> Actions:
"""按住鼠标左键,可先移动到元素上 """按住鼠标左键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:return: self :return: 动作链对象本身
""" """
... ...
def release(self, on_ele: Union[ChromiumElement, str] = None) -> Actions: def release(self, on_ele: Union[ChromiumElement, str] = None) -> Actions:
"""释放鼠标左键,可先移动到元素上 """释放鼠标左键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:return: self :return: 动作链对象本身
""" """
... ...
def r_hold(self, on_ele: Union[ChromiumElement, str] = None) -> Actions: def r_hold(self, on_ele: Union[ChromiumElement, str] = None) -> Actions:
"""按住鼠标右键,可先移动到元素上 """按住鼠标右键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:return: self :return: 动作链对象本身
""" """
... ...
def r_release(self, on_ele: Union[ChromiumElement, str] = None) -> Actions: def r_release(self, on_ele: Union[ChromiumElement, str] = None) -> Actions:
"""释放鼠标右键,可先移动到元素上 """释放鼠标右键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:return: self :return: 动作链对象本身
""" """
... ...
def m_hold(self, on_ele: Union[ChromiumElement, str] = None) -> Actions: def m_hold(self, on_ele: Union[ChromiumElement, str] = None) -> Actions:
"""按住鼠标中键,可先移动到元素上 """按住鼠标中键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:return: self :return: 动作链对象本身
""" """
... ...
def m_release(self, on_ele: Union[ChromiumElement, str] = None) -> Actions: def m_release(self, on_ele: Union[ChromiumElement, str] = None) -> Actions:
"""释放鼠标中键,可先移动到元素上 """释放鼠标中键,可先移动到元素上
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:return: self :return: 动作链对象本身
""" """
... ...
@ -153,14 +153,14 @@ class Actions:
:param on_ele: ChromiumElement元素或文本定位符 :param on_ele: ChromiumElement元素或文本定位符
:param button: 要按下的按键 :param button: 要按下的按键
:param count: 点击次数 :param count: 点击次数
:return: self :return: 动作链对象本身
""" """
... ...
def _release(self, button: str) -> Actions: def _release(self, button: str) -> Actions:
"""释放鼠标按键 """释放鼠标按键
:param button: 要释放的按键 :param button: 要释放的按键
:return: self :return: 动作链对象本身
""" """
... ...
@ -170,63 +170,66 @@ class Actions:
:param delta_y: 滚轮变化值y :param delta_y: 滚轮变化值y
:param delta_x: 滚轮变化值x :param delta_x: 滚轮变化值x
:param on_ele: ChromiumElement元素 :param on_ele: ChromiumElement元素
:return: self :return: 动作链对象本身
""" """
... ...
def up(self, pixel: int) -> Actions: def up(self, pixel: int) -> Actions:
"""鼠标向上移动若干像素 """鼠标向上移动若干像素
:param pixel: 鼠标移动的像素值 :param pixel: 鼠标移动的像素值
:return: self :return: 动作链对象本身
""" """
... ...
def down(self, pixel: int) -> Actions: def down(self, pixel: int) -> Actions:
"""鼠标向下移动若干像素 """鼠标向下移动若干像素
:param pixel: 鼠标移动的像素值 :param pixel: 鼠标移动的像素值
:return: self :return: 动作链对象本身
""" """
... ...
def left(self, pixel: int) -> Actions: def left(self, pixel: int) -> Actions:
"""鼠标向左移动若干像素 """鼠标向左移动若干像素
:param pixel: 鼠标移动的像素值 :param pixel: 鼠标移动的像素值
:return: self :return: 动作链对象本身
""" """
... ...
def right(self, pixel: int) -> Actions: def right(self, pixel: int) -> Actions:
"""鼠标向右移动若干像素 """鼠标向右移动若干像素
:param pixel: 鼠标移动的像素值 :param pixel: 鼠标移动的像素值
:return: self :return: 动作链对象本身
""" """
... ...
def key_down(self, key: Union[KEYS, str]) -> Actions: def key_down(self, key: Union[KEYS, str]) -> Actions:
"""按下键盘上的按键, """按下键盘上的按键,
:param key: 使用Keys获取的按键 'DEL' 形式按键名称 :param key: 使用Keys获取的按键 'DEL' 形式按键名称
:return: self :return: 动作链对象本身
""" """
... ...
def key_up(self, key: Union[KEYS, str]) -> Actions: def key_up(self, key: Union[KEYS, str]) -> Actions:
"""提起键盘上的按键 """提起键盘上的按键
:param key: 按键特殊字符见Keys :param key: 按键特殊字符见Keys
:return: self :return: 动作链对象本身
""" """
... ...
def type(self, keys: Union[KEYS, str, list, tuple]) -> Actions: def type(self,
keys: Union[KEYS, str, list, tuple],
interval: float = 0) -> Actions:
"""用模拟键盘按键方式输入文本,可输入字符串,也可输入组合键 """用模拟键盘按键方式输入文本,可输入字符串,也可输入组合键
:param keys: 要按下的按键特殊字符和多个文本可用list或tuple传入 :param keys: 要按下的按键特殊字符和多个文本可用list或tuple传入
:return: self :param interval: 每个字符之间间隔时间
:return: 动作链对象本身
""" """
... ...
def input(self, text: Any) -> Actions: def input(self, text: Any) -> Actions:
"""输入文本也可输入组合键组合键用tuple形式输入 """输入文本也可输入组合键组合键用tuple形式输入
:param text: 文本值或按键组合 :param text: 文本值或按键组合
:return: self :return: 动作链对象本身
""" """
... ...