6. _functions目录
_functions目录结构
_functions目录下共有8个文件。
6.1 browser.py文件
定义了10个函数,主要是打开浏览器。
6.1.1 函数
函数 | 功能 | 说明 |
connect_browser(option) | 连接或启动浏览器 option: ChromiumOptions对象 return: 返回是否接管的浏览器 | |
get_launch_args(opt) | 从ChromiumOptions获取命令行启动参数 opt: ChromiumOptions return: 启动参数列表 | |
set_prefs(opt) | 处理启动配置中的prefs项,目前只能对已存在文件夹配置 opt: ChromiumOptions return: None | |
set_flags(opt) | 处理启动配置中的flags项 opt: ChromiumOptions return: None | |
test_connect(ip, port, timeout=30) | 测试浏览器是否可用 :param ip: 浏览器ip :param port: 浏览器端口 :param timeout: 超时时间(秒) :return: None | |
get_chrome_path(ini_path) | 从ini文件或系统变量中获取chrome可执行文件的路径 | |
_run_browser(port, path: str, args) | 创建浏览器进程 :param port: 端口号 :param path: 浏览器路径 :param args: 启动参数 :return: 进程对象 | |
_make_leave_in_dict(target_dict: dict, src: list, num: int, end: int) | 把prefs中a.b.c形式的属性转为a['b']['c']形式 :param target_dict: 要处理的字典 :param src: 属性层级列表[a, b, c] :param num: 当前处理第几个 :param end: src长度 :return: None | |
_set_value_to_dict(target_dict: dict, src: list, value) | 把a.b.c形式的属性的值赋值到a['b']['c']形式的字典中 :param target_dict: 要处理的字典 :param src: 属性层级列表[a, b, c] :param value: 属性值 :return: None | |
_remove_arg_from_dict(target_dict: dict, arg: str) | 把a.b.c形式的属性从字典中删除 :param target_dict: 要处理的字典 :param arg: 层级属性,形式'a.b.c' :return: None |
6.2 by.py
主要是定义了查询元素的模式,配合locator使用。
By符号 | 值 | By符号 | 值 |
BY.ID | id | By.CLASS_NAME | class name |
By.XPATH | xpath | By.CSS_SELECTOR | css selector |
By.LINK_TEXT | link text | By.NAME | name |
By.PARTIAL_LINK_TEXT | partial link text | By.TAG_NAME | tag name |
6.3 key.py
Key.py定义的类和函数:
序号 | 名称 | 说明 |
1 | Key | Key类 |
2 | keyDefinitions | 字典 |
3 | modifierBit | 字典 |
4 | keys_to_typing(value) | 把要输入的内容连成字符串,去掉其中 ctrl 等键。 返回的modifier表示是否有按下组合键 |
5 | keyDescriptionForString(_modifiers, keyString) | |
6 | send_key(page, modifier, key) | 发送一个字,在键盘中的字符触发按键,其它直接发送文本 |
7 | input_text_or_keys(page, text_or_keys) | 输入文本,也可输入组合键,组合键用tuple形式输入 |
6.3.1 Key类
定义了Key类,对键盘上的特殊键作了定义,用于配合动作链。
属性 | 属性值 | 属性 | 属性值 |
CTRL_A | ('\ue009', 'a') | CTRL_C | ('\ue009', 'c') |
CTRL_X | ('\ue009', 'x') | CTRL_V | ('\ue009', 'v') |
CTRL_Z | ('\ue009', 'z') | CTRL_Y | ('\ue009', 'y') |
NULL | '\ue000' | CANCEL | '\ue001' |
HELP | '\ue002' | ||
BACKSPACE | '\ue003' | BACK_SPACE | '\ue003' |
TAB | '\ue004' | CLEAR | '\ue005' |
RETURN | '\ue006' | ENTER | '\ue007' |
SHIFT | '\ue008' | LEFT_SHIFT | '\ue008' |
CONTROL | '\ue009' | CTRL | '\ue009' |
LEFT_CONTROL | |||
ALT | LEFT_ALT | ||
PAUSE | ESCAPE | ||
SPACE | |||
PAGE_UP | PAGE_DOWN | ||
END | HOME | ||
LEFT | ARROW_LEFT | ||
UP | ARROW_UP | ||
RIGHT | ARROW_RIGHT | ||
DOWN | ARROW_DOWN | ||
INSERT | |||
DEL | DELETE | ||
SEMICOLON | EQUALS | ||
NUMPAD0 | NUMPAD1 | ||
NUMPAD2 | NUMPAD3 | ||
NUMPAD4 | NUMPAD5 | ||
NUMPAD6 | NUMPAD7 | ||
NUMPAD8 | NUMPAD9 | ||
MULTIPL | ADD | ||
SUBTRACT | DECIMAL | ||
DIVIDE | |||
F1 | F2 | ||
F3 | F4 | ||
F5 | F6 | ||
F7 | F8 | ||
F9 | F10 | ||
F11 | F12 | ||
META | COMMAND |
6.3.2 字典
6.3.2.1 字典keyDefinitions
keyDefinitions = {x:{'keyCode': y, 'key':x, 'code': z},}
x:键盘上的符号
y:ASCII码
z:字符串代码
6.3.2.2 字典modifierBit
modifierBit = {'\ue00a': 1, '\ue009': 2, '\ue03d': 4, '\ue008': 8}
6.3.3 函数
函数 | 功能 |
keys_to_typing(value) | 把要输入的内容连成字符串,去掉其中 ctrl 等键。 返回的modifier表示是否有按下组合键 Value= v1, v2, ..., vn=*[ v1, v2, ..., vn]=*( v1, v2, ..., vn) |
keyDescriptionForString(_modifiers, keyString) | |
send_key(page, modifier, key) | 发送一个字,在键盘中的字符触发按键,其它直接发送文本 |
input_text_or_keys(page, text_or_keys) | 输入文本,也可输入组合键,组合键用tuple形式输入 page: ChromiumBase对象 text_or_keys: 文本值或按键组合 return: self |
6.4 locator.py
功能是对定位符的解析。
函数 | 功能 | 说明 |
is_loc(text) | 判断text是否是定位符 | text.startswith() |
get_loc(loc, translate_css=False, css_mode=False) | 接收本库定位语法或selenium定位元组,转换为标准定位元组,可翻译css selector为xpath loc: 本库定位语法或selenium定位元组 translate_css: 是否翻译css selector为xpath,用于相对定位 css_mode: 是否尽量用css selector方式 return: DrissionPage定位元组 | 调用translate_XXXX()函数 调用str_to_XXX()函数 loc:(定位模式, 定位串) |
str_to_xpath_loc(loc) | 将loc转换成本库的xpath定位元组 loc: 查找语法字符串 return: 匹配符元组 | |
str_to_css_loc(loc) | 将loc转换成本库的css定位元组 loc: 查找语法字符串 return: 匹配符元组 | |
_make_single_xpath_str(tag: str, text: str) | 生成单属性xpath语句 tag: 标签名 text: 待处理的字符串 return: xpath字符串 | |
_make_multi_xpath_str(tag: str, text: str) | 生成多属性xpath语句 tag: 标签名 text: 待处理的字符串 return: xpath字符串 | |
_make_search_str(search_str: str) | 将"转义,不知何故不能直接用 \ 来转义 search_str: 查询字符串 return: 把"转义后的字符串 | |
_make_single_css_str(tag: str, text: str) | 生成单属性css selector语句 tag: 标签名 text: 待处理的字符串 return: css selector字符串 | |
_make_multi_css_str(tag: str, text: str) | 生成多属性css selector语句 tag: 标签名 text: 待处理的字符串 return: css selector字符串 | |
tranlate_css_loc(loc) | 把By类型的loc元组转换为css selector或xpath类型的 loc: By类型的loc元组 return: css selector或xpath类型的loc元组 | |
css_trans(txt) |
6.5 settings.py
定义了Settings类
属性 | 值 | 说明 |
raise_when_ele_not_found | False | |
raise_when_click_failed | False | |
raise_when_wait_failed | False | |
single_tab_obj | True | |
cdp_timeout | 30 | |
auto_handle_alert | None |
6.6 tools.py
tools.py定义的函数和类:
序号 | 名称 | 说明 |
1 | port_is_using(ip,port) | 检查端口是否被占用 |
2 | clean_folder(folder_path, ignore=None) | |
3 | show_or_hide_browser(page, hide=True) | |
4 | get_browser_progress_id(progress, address) | |
5 | get_hwnds_from_pid(pid, title) | |
6 | wait_until(function, kwargs=None, timeout=10) | |
7 | configs_to_here(save_name=None) | |
8 | raise_error(result, ignore=None) | |
9 | PortFinder(object) |
6.6.1 函数
函数 | 功能 | 说明 |
port_is_using(ip,port) | 检查端口是否被占用 ip: 浏览器地址 port: 浏览器端口 return: bool | 从socket导入socket,AF_INET,SOCK_STREAM,利用套字节的功能测试端口是否已被占用 |
clean_folder(folder_path, ignore=None) | 清空一个文件夹,除了ignore里的文件和文件夹 :param folder_path: 要清空的文件夹路径 :param ignore: 忽略列表 :return: None | 利用pathlib中Path类的功能 和shutil中的rmtree函数 |
show_or_hide_browser(page, hide=True) | 执行显示或隐藏浏览器窗口 :param page: ChromePage对象 :param hide: 是否隐藏 :return: None | 从库platform导入system 从win32gui导入ShowWindow 从win32con导入SW_HIDE,SW_SHOW |
get_browser_progress_id(progress, address) | 获取浏览器进程id :param progress: 已知的进程对象,没有时传入None :param address: 浏览器管理地址,含端口 :return: 进程id或None | from os import popen popen(f'netstat -nao | findstr :{port}').read().split('\n') |
get_hwnds_from_pid(pid, title) | 通过PID查询句柄ID :param pid: 进程id :param title: 窗口标题 :return: 进程句柄组成的列表 | |
wait_until(function, kwargs=None, timeout=10) | 待传入的方法返回值不为假 :param function: 要执行的方法 :param kwargs: 方法参数 :param timeout: 超时时间(秒) :return: 执行结果,超时抛出TimeoutError | from trime import perf_counter,sleep |
configs_to_here(save_name=None) | 把默认ini文件复制到当前目录 :param save_name: 指定文件名,为None则命名为'dp_configs.ini' :return: None | |
raise_error(result, ignore=None) | 抛出error对应报错 :param result: 包含error的dict :param ignore: 要忽略的错误 :return: None |
6.6.2 PortFinder类
PortFinder(object)类
属性 | 功能 | 说明 |
used_port | 字典 | |
lock | Lock对象 | |
方法 | ||
__init__(self, path=None) | ||
get_port(scope=None) |
6.7 web.py
web.py定义了html文本的处理函数。
6.7.1 函数
函数 | 功能 | 说明 |
get_ele_txt(e) | 返回元素的文本 e:元素 return: bool | |
format_html(text) | 处理html编码字符 :param text: html文本 :return: 格式化后的html文本 | |
location_in_viewport(page, loc_x, loc_y) | 判断给定的坐标是否在视口中 |n :param page: ChromePage对象 :param loc_x: 页面绝对坐标x :param loc_y: 页面绝对坐标y :return: bool | |
offset_scroll(ele, offset_x, offset_y) | 接收元素及偏移坐标,把坐标滚动到页面中间,返回该点在视口中的坐标 有偏移量时以元素左上角坐标为基准,没有时以click_point为基准 :param ele: 元素对象 :param offset_x: 偏移量x :param offset_y: 偏移量y :return: 视口中的坐标 | |
make_absolute_link(link, baseURI=None) | 获取绝对url :param link: 超链接 :param baseURI: 页面或iframe的url :return: 绝对链接 | |
is_js_func(func) | 检查文本是否js函数 | |
cookie_to_dict(cookie) | 把Cookie对象转为dict格式 :param cookie: Cookie对象、字符串或字典 :return: cookie字典 | |
cookies_to_tuple(cookies) | 把cookies转为tuple格式 :param cookies: cookies信息,可为CookieJar, list, tuple, str, dict :return: 返回tuple形式的cookies | |
set_session_cookies(session, cookies) | 设置Session对象的cookies :param session: Session对象 :param cookies: cookies信息 :return: None | |
set_browser_cookies(page, cookies) | 设置cookies值 :param page: 页面对象 :param cookies: cookies信息 :return: None | |
is_cookie_in_driver(page, cookie) | 查询cookie是否在浏览器内 :param page: BasePage对象 :param cookie: dict格式cookie :return: bool | |
get_blob(page, url, as_bytes=True) | 获取知道blob资源 :param page: 资源所在页面对象 :param url: 资源url :param as_bytes: 是否以字节形式返回 :return: 资源内容 | |
save_page(tab, path=None, name=None, as_pdf=False, kwargs=None) | 把当前页面保存为文件,如果path和name参数都为None,只返回文本 tab: Tab或Page对象 path: 保存路径,为None且name不为None时保存在当前路径 name: 文件名,为None且path不为None时用title属性值 as_pdf: 为Ture保存为pdf,否则为mhtml且忽略kwargs参数 kwargs: pdf生成参数 :return: as_pdf为True时返回bytes,否则返回文件文本 | |
get_mhtml(page, path=None, name=None) | 把当前页面保存为mhtml文件,如果path和name参数都为None,只返回mhtml文本 page: 要保存的页面对象 path: 保存路径,为None且name不为None时保存在当前路径 name: 文件名,为None且path不为None时用title属性值 return: mhtml文本 | |
get_pdf(page, path=None, name=None, kwargs=None) | 把当前页面保存为pdf文件,如果path和name参数都为None,只返回字节 page: 要保存的页面对象 path: 保存路径,为None且name不为None时保存在当前路径 name: 文件名,为None且path不为None时用title属性值 kwargs: pdf生成参数 return: pdf文本 | |
tree(ele_or_page) | 把页面或元素对象DOM结构打印出来 :param ele_or_page: 页面或元素对象 :return: None | |
format_headers(txt) | 从浏览器复制的文本生成dict格式headers,文本用换行分隔 :param txt: 从浏览器复制的原始文本格式headers :return: dict格式headers | |
_dict_cookies_to_tuple(cookies: dict) | 把dict形式的cookies转换为tuple形式 :param cookies: 单个或多个cookies,单个时包含'name'和'value' :return: 多个dict格式cookies组成的列表 |