From 1b44dea6692c308b47f4dc0868dd246db9852a93 Mon Sep 17 00:00:00 2001 From: g1879 Date: Thu, 19 Jan 2023 11:40:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/action_chains.py | 44 ++++---- DrissionPage/base.py | 24 ++-- DrissionPage/chromium_base.py | 58 +++++----- DrissionPage/chromium_driver.py | 6 +- DrissionPage/chromium_element.py | 40 +++---- DrissionPage/chromium_frame.py | 34 +++--- DrissionPage/chromium_page.py | 24 ++-- DrissionPage/configs/chromium_options.py | 5 +- DrissionPage/configs/chromium_options.pyi | 2 +- DrissionPage/configs/session_options.py | 34 +++--- DrissionPage/drission.py | 22 ++-- DrissionPage/driver_element.py | 128 +++++++++++----------- DrissionPage/driver_page.py | 96 ++++++++-------- DrissionPage/mix_page.py | 46 ++++---- DrissionPage/session_element.py | 40 +++---- DrissionPage/session_page.py | 30 ++--- DrissionPage/shadow_root_element.py | 30 ++--- DrissionPage/web_page.py | 38 +++---- 18 files changed, 351 insertions(+), 350 deletions(-) diff --git a/DrissionPage/action_chains.py b/DrissionPage/action_chains.py index 59c5771..f6b5196 100644 --- a/DrissionPage/action_chains.py +++ b/DrissionPage/action_chains.py @@ -23,7 +23,7 @@ class ActionChains: self.curr_y = 0 def move_to(self, ele_or_loc, offset_x=0, offset_y=0): - """鼠标移动到元素中点,或页面上的某个绝对坐标。可设置偏移量 \n + """鼠标移动到元素中点,或页面上的某个绝对坐标。可设置偏移量 当带偏移量时,偏移量相对于元素左上角坐标 :param ele_or_loc: 元素对象、绝对坐标或文本定位符,坐标为tuple(int, int)形式 :param offset_x: 偏移量x @@ -64,7 +64,7 @@ class ActionChains: return self def move(self, offset_x=0, offset_y=0): - """鼠标相对当前位置移动若干位置 \n + """鼠标相对当前位置移动若干位置 :param offset_x: 偏移量x :param offset_y: 偏移量y :return: self @@ -75,7 +75,7 @@ class ActionChains: return self def click(self, on_ele=None): - """点击鼠标左键,可先移动到元素上 \n + """点击鼠标左键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -85,7 +85,7 @@ class ActionChains: return self def r_click(self, on_ele=None): - """点击鼠标右键,可先移动到元素上 \n + """点击鼠标右键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -95,7 +95,7 @@ class ActionChains: return self def m_click(self, on_ele=None): - """点击鼠标中键,可先移动到元素上 \n + """点击鼠标中键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -105,7 +105,7 @@ class ActionChains: return self def hold(self, on_ele=None): - """按住鼠标左键,可先移动到元素上 \n + """按住鼠标左键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -115,7 +115,7 @@ class ActionChains: return self def release(self, on_ele=None): - """释放鼠标左键,可先移动到元素上 \n + """释放鼠标左键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -125,7 +125,7 @@ class ActionChains: return self def r_hold(self, on_ele=None): - """按住鼠标右键,可先移动到元素上 \n + """按住鼠标右键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -135,7 +135,7 @@ class ActionChains: return self def r_release(self, on_ele=None): - """释放鼠标右键,可先移动到元素上 \n + """释放鼠标右键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -145,7 +145,7 @@ class ActionChains: return self def m_hold(self, on_ele=None): - """按住鼠标中键,可先移动到元素上 \n + """按住鼠标中键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -155,7 +155,7 @@ class ActionChains: return self def m_release(self, on_ele=None): - """释放鼠标中键,可先移动到元素上 \n + """释放鼠标中键,可先移动到元素上 :param on_ele: ChromiumElement元素或文本定位符 :return: self """ @@ -165,7 +165,7 @@ class ActionChains: return self def _hold(self, button): - """按下鼠标按键 \n + """按下鼠标按键 :param button: 要按下的按键 :return: self """ @@ -174,7 +174,7 @@ class ActionChains: return self def _release(self, button): - """释放鼠标按键 \n + """释放鼠标按键 :param button: 要释放的按键 :return: self """ @@ -183,7 +183,7 @@ class ActionChains: return self def scroll(self, delta_x=0, delta_y=0, on_ele=None): - """滚动鼠标滚轮,可先移动到元素上 \n + """滚动鼠标滚轮,可先移动到元素上 :param delta_x: 滚轮变化值x :param delta_y: 滚轮变化值y :param on_ele: ChromiumElement元素 @@ -196,35 +196,35 @@ class ActionChains: return self def up(self, pixel): - """鼠标向上移动若干像素 \n + """鼠标向上移动若干像素 :param pixel: 鼠标移动的像素值 :return: self """ return self.move(0, -pixel) def down(self, pixel): - """鼠标向下移动若干像素 \n + """鼠标向下移动若干像素 :param pixel: 鼠标移动的像素值 :return: self """ return self.move(0, pixel) def left(self, pixel): - """鼠标向左移动若干像素 \n + """鼠标向左移动若干像素 :param pixel: 鼠标移动的像素值 :return: self """ return self.move(-pixel, 0) def right(self, pixel): - """鼠标向右移动若干像素 \n + """鼠标向右移动若干像素 :param pixel: 鼠标移动的像素值 :return: self """ return self.move(pixel, 0) def key_down(self, key): - """按下键盘上的按键 \n + """按下键盘上的按键 :param key: 按键,特殊字符见Keys :return: self """ @@ -237,7 +237,7 @@ class ActionChains: return self def key_up(self, key): - """提起键盘上的按键 \n + """提起键盘上的按键 :param key: 按键,特殊字符见Keys :return: self """ @@ -250,7 +250,7 @@ class ActionChains: return self def type(self, text): - """输入文本 \n + """输入文本 :param text: 要输入的文本 :return: self """ @@ -266,7 +266,7 @@ class ActionChains: return self def _get_key_data(self, key, action): - """获取用于发送的按键信息 \n + """获取用于发送的按键信息 :param key: 按键 :param action: 'keyDown' 或 'keyUp' :return: 按键信息 diff --git a/DrissionPage/base.py b/DrissionPage/base.py index 008051a..439b831 100644 --- a/DrissionPage/base.py +++ b/DrissionPage/base.py @@ -95,7 +95,7 @@ class DrissionElement(BaseElement): return self.eles('xpath:.//comment()') def texts(self, text_node_only=False): - """返回元素内所有直接子节点的文本,包括元素和文本节点 \n + """返回元素内所有直接子节点的文本,包括元素和文本节点 :param text_node_only: 是否只返回文本节点 :return: 文本列表 """ @@ -107,7 +107,7 @@ class DrissionElement(BaseElement): return [format_html(x.strip(' ').rstrip('\n')) for x in texts if x and sub('[\r\n\t ]', '', x) != ''] def parent(self, level_or_loc=1): - """返回上面某一级父元素,可指定层数或用查询语法定位 \n + """返回上面某一级父元素,可指定层数或用查询语法定位 :param level_or_loc: 第几级父元素,或定位符 :return: 上级元素对象 """ @@ -128,7 +128,7 @@ class DrissionElement(BaseElement): return self._ele(loc, timeout=0, relative=True) def prev(self, index=1, filter_loc='', timeout=0): - """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 前面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 @@ -138,7 +138,7 @@ class DrissionElement(BaseElement): return nodes[-1] if nodes else None def next(self, index=1, filter_loc='', timeout=0): - """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 后面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 @@ -148,7 +148,7 @@ class DrissionElement(BaseElement): return nodes[0] if nodes else None def before(self, index=1, filter_loc='', timeout=None): - """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 前面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 @@ -158,7 +158,7 @@ class DrissionElement(BaseElement): return nodes[-1] if nodes else None def after(self, index=1, filter_loc='', timeout=None): - """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 后面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 @@ -168,7 +168,7 @@ class DrissionElement(BaseElement): return nodes[0] if nodes else None def prevs(self, filter_loc='', timeout=0): - """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 兄弟元素或节点文本组成的列表 @@ -176,7 +176,7 @@ class DrissionElement(BaseElement): return self._get_brothers(filter_loc=filter_loc, direction='preceding', timeout=timeout) def nexts(self, filter_loc='', timeout=0): - """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 兄弟元素或节点文本组成的列表 @@ -184,7 +184,7 @@ class DrissionElement(BaseElement): return self._get_brothers(filter_loc=filter_loc, direction='following', timeout=timeout) def befores(self, filter_loc='', timeout=None): - """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 本元素前面的元素或节点组成的列表 @@ -192,7 +192,7 @@ class DrissionElement(BaseElement): return self._get_brothers(filter_loc=filter_loc, direction='preceding', brother=False, timeout=timeout) def afters(self, filter_loc='', timeout=None): - """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 本元素后面的元素或节点组成的列表 @@ -200,7 +200,7 @@ class DrissionElement(BaseElement): return self._get_brothers(filter_loc=filter_loc, direction='following', brother=False, timeout=timeout) def _get_brothers(self, index=None, filter_loc='', direction='following', brother=True, timeout=.5): - """按要求返回兄弟元素或节点组成的列表 \n + """按要求返回兄弟元素或节点组成的列表 :param index: 获取第几个,该参数不为None时只获取该编号的元素 :param filter_loc: 用于筛选元素的查询语法 :param direction: 'following' 或 'preceding',查找的方向 @@ -295,7 +295,7 @@ class BasePage(BaseParser): return self._url_available def _before_connect(self, url, retry, interval): - """连接前的准备 \n + """连接前的准备 :param url: 要访问的url :param retry: 重试次数 :param interval: 重试间隔 diff --git a/DrissionPage/chromium_base.py b/DrissionPage/chromium_base.py index 9dd19d3..6f397ad 100644 --- a/DrissionPage/chromium_base.py +++ b/DrissionPage/chromium_base.py @@ -38,7 +38,7 @@ class ChromiumBase(BasePage): super().__init__(timeout) def _connect_browser(self, addr_driver_opts=None, tab_id=None): - """连接浏览器,在第一次时运行 \n + """连接浏览器,在第一次时运行 :param addr_driver_opts: 浏览器地址、ChromiumDriver对象或DriverOptions对象 :param tab_id: 要控制的标签页id,不指定默认为激活的 :return: None @@ -183,8 +183,8 @@ class ChromiumBase(BasePage): self._debug_recorder.add_data((perf_counter(), '加载流程', 'navigated')) def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele = page('@id=ele_id') \n + """在内部查找元素 + 例:ele = page('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 超时时间 :return: ChromiumElement对象 @@ -281,7 +281,7 @@ class ChromiumBase(BasePage): return PageLoadStrategy(self) def set_timeouts(self, implicit=None, page_load=None, script=None): - """设置超时时间,单位为秒 \n + """设置超时时间,单位为秒 :param implicit: 查找元素超时时间 :param page_load: 页面加载超时时间 :param script: 脚本运行超时时间 @@ -297,7 +297,7 @@ class ChromiumBase(BasePage): self._timeouts.script = script def run_js(self, script, as_expr=False, *args): - """运行javascript代码 \n + """运行javascript代码 :param script: js文本 :param as_expr: 是否作为表达式运行,为True时args无效 :param args: 参数,按顺序在js文本中对应argument[0]、argument[1]... @@ -307,7 +307,7 @@ class ChromiumBase(BasePage): return run_js(self, script, as_expr, self.timeouts.script, args) def run_async_js(self, script, as_expr=False, *args): - """以异步方式执行js代码 \n + """以异步方式执行js代码 :param script: js文本 :param as_expr: 是否作为表达式运行,为True时args无效 :param args: 参数,按顺序在js文本中对应argument[0]、argument[1]... @@ -318,7 +318,7 @@ class ChromiumBase(BasePage): Thread(target=run_js, args=(self, script, as_expr, self.timeouts.script, args)).start() def get(self, url, show_errmsg=False, retry=None, interval=None, timeout=None): - """访问url \n + """访问url :param url: 目标url :param show_errmsg: 是否显示和抛出异常 :param retry: 重试次数 @@ -335,7 +335,7 @@ class ChromiumBase(BasePage): return self._url_available def wait_loading(self, timeout=1): - """阻塞程序,等待页面进入加载状态 \n + """阻塞程序,等待页面进入加载状态 :param timeout: 超时时间 :return: 等待结束时是否进入加载状态 """ @@ -349,7 +349,7 @@ class ChromiumBase(BasePage): return False def get_cookies(self, as_dict=False): - """获取cookies信息 \n + """获取cookies信息 :param as_dict: 为True时返回由{name: value}键值对组成的dict :return: cookies信息 """ @@ -360,7 +360,7 @@ class ChromiumBase(BasePage): return cookies def set_cookies(self, cookies): - """设置cookies值 \n + """设置cookies值 :param cookies: cookies信息 :return: None """ @@ -376,14 +376,14 @@ class ChromiumBase(BasePage): self._wait_driver.Network.setCookies(cookies=result_cookies) def set_headers(self, headers: dict) -> None: - """设置固定发送的headers \n + """设置固定发送的headers :param headers: dict格式的headers数据 :return: None """ self.run_cdp('Network.setExtraHTTPHeaders', headers=headers, not_change=True) def ele(self, loc_or_ele, timeout=None): - """获取第一个符合条件的元素对象 \n + """获取第一个符合条件的元素对象 :param loc_or_ele: 定位符或元素对象 :param timeout: 查找超时时间 :return: ChromiumElement对象 @@ -391,7 +391,7 @@ class ChromiumBase(BasePage): return self._ele(loc_or_ele, timeout=timeout) def eles(self, loc_or_str, timeout=None): - """获取所有符合条件的元素对象 \n + """获取所有符合条件的元素对象 :param loc_or_str: 定位符或元素对象 :param timeout: 查找超时时间 :return: ChromiumElement对象组成的列表 @@ -399,14 +399,14 @@ class ChromiumBase(BasePage): return self._ele(loc_or_str, timeout=timeout, single=False) def s_ele(self, loc_or_ele=None): - """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 \n + """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 :param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ return make_session_ele(self, loc_or_ele) def s_eles(self, loc_or_str): - """查找所有符合条件的元素以SessionElement列表形式返回 \n + """查找所有符合条件的元素以SessionElement列表形式返回 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象组成的列表 """ @@ -457,7 +457,7 @@ class ChromiumBase(BasePage): return [make_chromium_ele(self, node_id=i) for i in nodeIds['nodeIds']] def wait_ele(self, loc_or_ele, timeout=None): - """返回用于等待元素到达某个状态的等待器对象 \n + """返回用于等待元素到达某个状态的等待器对象 :param loc_or_ele: 可以是元素、查询字符串、loc元组 :param timeout: 等待超时时间 :return: 用于等待的ElementWaiter对象 @@ -465,7 +465,7 @@ class ChromiumBase(BasePage): return ChromiumElementWaiter(self, loc_or_ele, timeout) def scroll_to_see(self, loc_or_ele): - """滚动页面直到元素可见 \n + """滚动页面直到元素可见 :param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串(详见ele函数注释) :return: None """ @@ -480,7 +480,7 @@ class ChromiumBase(BasePage): offset_scroll(ele, 0, 0) def refresh(self, ignore_cache=False): - """刷新当前页面 \n + """刷新当前页面 :param ignore_cache: 是否忽略缓存 :return: None """ @@ -488,14 +488,14 @@ class ChromiumBase(BasePage): self._driver.Page.reload(ignoreCache=ignore_cache) def forward(self, steps=1): - """在浏览历史中前进若干步 \n + """在浏览历史中前进若干步 :param steps: 前进步数 :return: None """ self._forward_or_back(steps) def back(self, steps=1): - """在浏览历史中后退若干步 \n + """在浏览历史中后退若干步 :param steps: 后退步数 :return: None """ @@ -539,7 +539,7 @@ class ChromiumBase(BasePage): sleep(.1) def run_cdp(self, cmd, **cmd_args): - """执行Chrome DevTools Protocol语句 \n + """执行Chrome DevTools Protocol语句 :param cmd: 协议项目 :param cmd_args: 参数 :return: 执行的结果 @@ -558,14 +558,14 @@ class ChromiumBase(BasePage): raise def set_user_agent(self, ua): - """为当前tab设置user agent,只在当前tab有效 \n + """为当前tab设置user agent,只在当前tab有效 :param ua: user agent字符串 :return: None """ self._wait_driver.Network.setUserAgentOverride(userAgent=ua) def get_session_storage(self, item=None): - """获取sessionStorage信息,不设置item则获取全部 \n + """获取sessionStorage信息,不设置item则获取全部 :param item: 要获取的项,不设置则返回全部 :return: sessionStorage一个或所有项内容 """ @@ -573,7 +573,7 @@ class ChromiumBase(BasePage): return self.run_js(js, as_expr=True) def get_local_storage(self, item=None): - """获取localStorage信息,不设置item则获取全部 \n + """获取localStorage信息,不设置item则获取全部 :param item: 要获取的项目,不设置则返回全部 :return: localStorage一个或所有项内容 """ @@ -581,7 +581,7 @@ class ChromiumBase(BasePage): return self.run_js(js, as_expr=True) def set_session_storage(self, item, value): - """设置或删除某项sessionStorage信息 \n + """设置或删除某项sessionStorage信息 :param item: 要设置的项 :param value: 项的值,设置为False时,删除该项 :return: None @@ -591,7 +591,7 @@ class ChromiumBase(BasePage): return self.run_js(js, as_expr=True) def set_local_storage(self, item, value): - """设置或删除某项localStorage信息 \n + """设置或删除某项localStorage信息 :param item: 要设置的项 :param value: 项的值,设置为False时,删除该项 :return: None @@ -600,7 +600,7 @@ class ChromiumBase(BasePage): return self.run_js(js, as_expr=True) def clear_cache(self, session_storage=True, local_storage=True, cache=True, cookies=True): - """清除缓存,可选要清除的项 \n + """清除缓存,可选要清除的项 :param session_storage: 是否清除sessionStorage :param local_storage: 是否清除localStorage :param cache: 是否清除cache @@ -617,7 +617,7 @@ class ChromiumBase(BasePage): self._wait_driver.Network.clearBrowserCookies() def _d_connect(self, to_url, times=0, interval=1, show_errmsg=False, timeout=None): - """尝试连接,重试若干次 \n + """尝试连接,重试若干次 :param to_url: 要访问的url :param times: 重试次数 :param interval: 重试间隔(秒) @@ -694,7 +694,7 @@ class PageLoadStrategy(object): self._page = page def __call__(self, value): - """设置加载策略 \n + """设置加载策略 :param value: 可选 'normal', 'eager', 'none' :return: None """ diff --git a/DrissionPage/chromium_driver.py b/DrissionPage/chromium_driver.py index 711c6ad..6b8d38b 100644 --- a/DrissionPage/chromium_driver.py +++ b/DrissionPage/chromium_driver.py @@ -153,7 +153,7 @@ class ChromiumDriver(object): return attr def call_method(self, _method, *args, **kwargs): - """执行cdp方法 \n + """执行cdp方法 :param _method: cdp方法名 :param args: cdp参数 :param kwargs: cdp参数 @@ -203,7 +203,7 @@ class ChromiumDriver(object): return True def set_listener(self, event, callback): - """绑定cdp event和回调方法 \n + """绑定cdp event和回调方法 :param event: cdp event :param callback: 绑定到cdp event的回调方法 :return: 回调方法 @@ -217,7 +217,7 @@ class ChromiumDriver(object): return True def get_listener(self, event): - """获取cdp event对应的回调方法 \n + """获取cdp event对应的回调方法 :param event: cdp event :return: 回调方法 """ diff --git a/DrissionPage/chromium_element.py b/DrissionPage/chromium_element.py index 311409b..fa62151 100644 --- a/DrissionPage/chromium_element.py +++ b/DrissionPage/chromium_element.py @@ -1090,7 +1090,7 @@ class ChromiumShadowRootElement(BaseElement): def find_in_chromium_ele(ele, loc, single=True, timeout=None, relative=True): - """在chromium元素中查找 \n + """在chromium元素中查找 :param ele: ChromiumElement对象 :param loc: 元素定位元组 :param single: True则返回第一个,False则返回全部 @@ -1203,7 +1203,7 @@ def _find_by_css(ele, selector, single, timeout): def make_chromium_ele(page, node_id=None, obj_id=None): - """根据node id或object id生成相应元素对象 \n + """根据node id或object id生成相应元素对象 :param page: ChromiumPage对象 :param node_id: 元素的node id :param obj_id: 元素的object id @@ -1259,7 +1259,7 @@ else{a.push(e.snapshotItem(i));}}""" def run_js(page_or_ele, script, as_expr=False, timeout=None, args=None, not_change=False): - """运行javascript代码 \n + """运行javascript代码 :param page_or_ele: 页面对象或元素对象 :param script: js文本 :param as_expr: 是否作为表达式运行,为True时args无效 @@ -1434,7 +1434,7 @@ class ChromiumScroll(object): self._run_js('{}.scrollTo(0, {}.scrollTop);') def to_location(self, x, y): - """滚动到指定位置 \n + """滚动到指定位置 :param x: 水平距离 :param y: 垂直距离 :return: None @@ -1442,7 +1442,7 @@ class ChromiumScroll(object): self._run_js(f'{{}}.scrollTo({x}, {y});') def up(self, pixel=300): - """向上滚动若干像素,水平位置不变 \n + """向上滚动若干像素,水平位置不变 :param pixel: 滚动的像素 :return: None """ @@ -1450,14 +1450,14 @@ class ChromiumScroll(object): self._run_js(f'{{}}.scrollBy(0, {pixel});') def down(self, pixel=300): - """向下滚动若干像素,水平位置不变 \n + """向下滚动若干像素,水平位置不变 :param pixel: 滚动的像素 :return: None """ self._run_js(f'{{}}.scrollBy(0, {pixel});') def left(self, pixel=300): - """向左滚动若干像素,垂直位置不变 \n + """向左滚动若干像素,垂直位置不变 :param pixel: 滚动的像素 :return: None """ @@ -1465,7 +1465,7 @@ class ChromiumScroll(object): self._run_js(f'{{}}.scrollBy({pixel}, 0);') def right(self, pixel=300): - """向右滚动若干像素,垂直位置不变 \n + """向右滚动若干像素,垂直位置不变 :param pixel: 滚动的像素 :return: None """ @@ -1485,7 +1485,7 @@ class ChromiumSelect(object): self._ele = ele def __call__(self, text_or_index, timeout=None): - """选定下拉列表中子元素 \n + """选定下拉列表中子元素 :param text_or_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: None @@ -1507,7 +1507,7 @@ class ChromiumSelect(object): @property def selected_option(self): - """返回第一个被选中的option元素 \n + """返回第一个被选中的option元素 :return: ChromiumElement对象或None """ ele = self._ele.run_js('return this.options[this.selectedIndex];') @@ -1515,7 +1515,7 @@ class ChromiumSelect(object): @property def selected_options(self): - """返回所有被选中的option元素列表 \n + """返回所有被选中的option元素列表 :return: ChromiumElement对象组成的列表 """ return [x for x in self.options if x.is_selected] @@ -1529,7 +1529,7 @@ class ChromiumSelect(object): opt.click(by_js=True) def by_text(self, text, timeout=None): - """此方法用于根据text值选择项。当元素是多选列表时,可以接收list或tuple \n + """此方法用于根据text值选择项。当元素是多选列表时,可以接收list或tuple :param text: text属性值,传入list或tuple可选择多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: 是否选择成功 @@ -1538,7 +1538,7 @@ class ChromiumSelect(object): return self._select(text, 'text', False, timeout) def by_value(self, value, timeout=None): - """此方法用于根据value值选择项。当元素是多选列表时,可以接收list或tuple \n + """此方法用于根据value值选择项。当元素是多选列表时,可以接收list或tuple :param value: value属性值,传入list或tuple可选择多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: 是否选择成功 @@ -1547,7 +1547,7 @@ class ChromiumSelect(object): return self._select(value, 'value', False, timeout) def by_index(self, index, timeout=None): - """此方法用于根据index值选择项。当元素是多选列表时,可以接收list或tuple \n + """此方法用于根据index值选择项。当元素是多选列表时,可以接收list或tuple :param index: 序号,0开始,传入list或tuple可选择多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: 是否选择成功 @@ -1556,7 +1556,7 @@ class ChromiumSelect(object): return self._select(index, 'index', False, timeout) def cancel_by_text(self, text, timeout=None): - """此方法用于根据text值取消选择项。当元素是多选列表时,可以接收list或tuple \n + """此方法用于根据text值取消选择项。当元素是多选列表时,可以接收list或tuple :param text: 文本,传入list或tuple可取消多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: 是否取消成功 @@ -1565,7 +1565,7 @@ class ChromiumSelect(object): return self._select(text, 'text', True, timeout) def cancel_by_value(self, value, timeout=None): - """此方法用于根据value值取消选择项。当元素是多选列表时,可以接收list或tuple \n + """此方法用于根据value值取消选择项。当元素是多选列表时,可以接收list或tuple :param value: value属性值,传入list或tuple可取消多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: 是否取消成功 @@ -1574,7 +1574,7 @@ class ChromiumSelect(object): return self._select(value, 'value', True, timeout) def cancel_by_index(self, index, timeout=None): - """此方法用于根据index值取消选择项。当元素是多选列表时,可以接收list或tuple \n + """此方法用于根据index值取消选择项。当元素是多选列表时,可以接收list或tuple :param index: 序号,0开始,传入list或tuple可取消多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: 是否取消成功 @@ -1591,7 +1591,7 @@ class ChromiumSelect(object): i.click(by_js=True) def _select(self, text_value_index=None, para_type='text', deselect=False, timeout=None): - """选定或取消选定下拉列表中子元素 \n + """选定或取消选定下拉列表中子元素 :param text_value_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 :param para_type: 参数类型,可选 'text'、'value'、'index' :param deselect: 是否取消选择 @@ -1636,7 +1636,7 @@ class ChromiumSelect(object): text_value_index=None, para_type='text', deselect=False): - """选定或取消选定下拉列表中多个子元素 \n + """选定或取消选定下拉列表中多个子元素 :param text_value_index: 根据文本、值选或序号择选多项 :param para_type: 参数类型,可选 'text'、'value'、'index' :param deselect: 是否取消选择 @@ -1664,7 +1664,7 @@ class ChromiumElementWaiter(object): """等待元素在dom中某种状态,如删除、显示、隐藏""" def __init__(self, page_or_ele, loc_or_ele, timeout=None): - """等待元素在dom中某种状态,如删除、显示、隐藏 \n + """等待元素在dom中某种状态,如删除、显示、隐藏 :param page_or_ele: 页面或父元素 :param loc_or_ele: 要等待的元素,可以是已有元素、定位符 :param timeout: 超时时间,默认读取页面超时时间 diff --git a/DrissionPage/chromium_frame.py b/DrissionPage/chromium_frame.py index ab34be3..517b4ff 100644 --- a/DrissionPage/chromium_frame.py +++ b/DrissionPage/chromium_frame.py @@ -30,8 +30,8 @@ class ChromiumFrame(ChromiumBase): self.doc_ele = ChromiumElement(self, obj_id=obj_id) def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele2 = ele1('@id=ele_id') \n + """在内部查找元素 + 例:ele2 = ele1('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 超时时间 :return: ChromiumElement对象或属性、文本 @@ -255,7 +255,7 @@ class ChromiumFrame(ChromiumBase): self.doc_ele.run_js('this.location.reload();') def attr(self, attr): - """返回frame元素attribute属性值 \n + """返回frame元素attribute属性值 :param attr: 属性名 :return: 属性值文本,没有该属性返回None """ @@ -263,7 +263,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.attr(attr) def set_attr(self, attr, value): - """设置frame元素attribute属性 \n + """设置frame元素attribute属性 :param attr: 属性名 :param value: 属性值 :return: None @@ -272,7 +272,7 @@ class ChromiumFrame(ChromiumBase): self.frame_ele.set_attr(attr, value) def remove_attr(self, attr): - """删除frame元素attribute属性 \n + """删除frame元素attribute属性 :param attr: 属性名 :return: None """ @@ -280,7 +280,7 @@ class ChromiumFrame(ChromiumBase): self.frame_ele.remove_attr(attr) def run_js(self, script, as_expr=False, *args): - """运行javascript代码 \n + """运行javascript代码 :param script: js文本 :param as_expr: 是否作为表达式运行,为True时args无效 :param args: 参数,按顺序在js文本中对应argument[0]、argument[1]... @@ -290,7 +290,7 @@ class ChromiumFrame(ChromiumBase): return self.doc_ele.run_js(script, as_expr=as_expr, *args) def parent(self, level_or_loc=1): - """返回上面某一级父元素,可指定层数或用查询语法定位 \n + """返回上面某一级父元素,可指定层数或用查询语法定位 :param level_or_loc: 第几级父元素,或定位符 :return: 上级元素对象 """ @@ -298,7 +298,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.parent(level_or_loc) def prev(self, filter_loc='', index=1, timeout=0): - """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param filter_loc: 用于筛选元素的查询语法 :param index: 前面第几个查询结果元素 :param timeout: 查找元素的超时时间 @@ -308,7 +308,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.prev(filter_loc, index, timeout) def next(self, filter_loc='', index=1, timeout=0): - """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param filter_loc: 用于筛选元素的查询语法 :param index: 后面第几个查询结果元素 :param timeout: 查找元素的超时时间 @@ -318,7 +318,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.next(filter_loc, index, timeout) def before(self, filter_loc='', index=1, timeout=None): - """返回当前元素前面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元素,而是整个DOM文档 \n + """返回当前元素前面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元素,而是整个DOM文档 :param filter_loc: 用于筛选元素的查询语法 :param index: 前面第几个查询结果元素 :param timeout: 查找元素的超时时间 @@ -328,7 +328,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.before(filter_loc, index, timeout) def after(self, filter_loc='', index=1, timeout=None): - """返回当前元素后面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元素,而是整个DOM文档 \n + """返回当前元素后面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元素,而是整个DOM文档 :param filter_loc: 用于筛选元素的查询语法 :param index: 后面第几个查询结果元素 :param timeout: 查找元素的超时时间 @@ -338,7 +338,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.after(filter_loc, index, timeout) def prevs(self, filter_loc='', timeout=0): - """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 兄弟元素或节点文本组成的列表 @@ -347,7 +347,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.prevs(filter_loc, timeout) def nexts(self, filter_loc='', timeout=0): - """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 兄弟元素或节点文本组成的列表 @@ -356,7 +356,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.nexts(filter_loc, timeout) def befores(self, filter_loc='', timeout=None): - """返回当前元素后面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元素,而是整个DOM文档 \n + """返回当前元素后面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元素,而是整个DOM文档 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 本元素前面的元素或节点组成的列表 @@ -365,7 +365,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.befores(filter_loc, timeout) def afters(self, filter_loc='', timeout=None): - """返回当前元素后面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元素,而是整个DOM文档 \n + """返回当前元素后面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元素,而是整个DOM文档 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 本元素前面的元素或节点组成的列表 @@ -374,7 +374,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.afters(filter_loc, timeout) def _ele(self, loc_or_ele, timeout=None, single=True, relative=False): - """在frame内查找单个元素 \n + """在frame内查找单个元素 :param loc_or_ele: 定位符或元素对象 :param timeout: 查找超时时间 :return: ChromiumElement对象 @@ -388,7 +388,7 @@ class ChromiumFrame(ChromiumBase): return self.doc_ele.ele(loc_or_ele, timeout) if single else self.doc_ele.eles(loc_or_ele, timeout) def _d_connect(self, to_url, times=0, interval=1, show_errmsg=False, timeout=None): - """尝试连接,重试若干次 \n + """尝试连接,重试若干次 :param to_url: 要访问的url :param times: 重试次数 :param interval: 重试间隔(秒) diff --git a/DrissionPage/chromium_page.py b/DrissionPage/chromium_page.py index 50d4d20..8bc9e77 100644 --- a/DrissionPage/chromium_page.py +++ b/DrissionPage/chromium_page.py @@ -28,7 +28,7 @@ class ChromiumPage(ChromiumBase): super().__init__(addr_driver_opts, tab_id, timeout) def _connect_browser(self, addr_driver_opts=None, tab_id=None): - """连接浏览器,在第一次时运行 \n + """连接浏览器,在第一次时运行 :param addr_driver_opts: 浏览器地址、ChromiumDriver对象或DriverOptions对象 :param tab_id: 要控制的标签页id,不指定默认为激活的 :return: None @@ -140,7 +140,7 @@ class ChromiumPage(ChromiumBase): return ChromiumDownloadSetter(self) def get_tab(self, tab_id=None): - """获取一个标签页对象 \n + """获取一个标签页对象 :param tab_id: 要获取的标签页id,为None时获取当前tab :return: 标签页对象 """ @@ -148,7 +148,7 @@ class ChromiumPage(ChromiumBase): return ChromiumTab(self, tab_id) def get_screenshot(self, path=None, as_bytes=None, full_page=False, left_top=None, right_bottom=None): - """对页面进行截图,可对整个网页、可见网页、指定范围截图。对可视范围外截图需要90以上版本浏览器支持 \n + """对页面进行截图,可对整个网页、可见网页、指定范围截图。对可视范围外截图需要90以上版本浏览器支持 :param path: 完整路径,后缀可选 'jpg','jpeg','png','webp' :param as_bytes: 是否已字节形式返回图片,可选 'jpg','jpeg','png','webp',生效时path参数无效 :param full_page: 是否整页截图,为True截取整个网页,为False截取可视窗口 @@ -204,7 +204,7 @@ class ChromiumPage(ChromiumBase): self._control_session.get(f'http://{self.address}/json/activate/{self.tab_id}') def new_tab(self, url=None, switch_to=True): - """新建一个标签页,该标签页在最后面 \n + """新建一个标签页,该标签页在最后面 :param url: 新标签页跳转到的网址 :param switch_to: 新建标签页后是否把焦点移过去 :return: None @@ -231,7 +231,7 @@ class ChromiumPage(ChromiumBase): self.run_cdp('Target.createTarget', url='') def set_main_tab(self, tab_id=None): - """设置主tab \n + """设置主tab :param tab_id: 标签页id,不传入则设置当前tab :return: None """ @@ -242,7 +242,7 @@ class ChromiumPage(ChromiumBase): self.to_tab(self._main_tab) def to_tab(self, tab_id=None, activate=True): - """跳转到标签页 \n + """跳转到标签页 :param tab_id: 标签页id字符串,默认跳转到main_tab :param activate: 切换后是否变为活动状态 :return: None @@ -250,7 +250,7 @@ class ChromiumPage(ChromiumBase): self._to_tab(tab_id, activate) def _to_tab(self, tab_id=None, activate=True, read_doc=True): - """跳转到标签页 \n + """跳转到标签页 :param tab_id: 标签页id字符串,默认跳转到main_tab :param activate: 切换后是否变为活动状态 :param read_doc: 切换后是否读取文档 @@ -274,7 +274,7 @@ class ChromiumPage(ChromiumBase): self._get_document() def close_tabs(self, tab_ids=None, others=False): - """关闭传入的标签页,默认关闭当前页。可传入多个 \n + """关闭传入的标签页,默认关闭当前页。可传入多个 :param tab_ids: 要关闭的标签页id,可传入id组成的列表或元组,为None时关闭当前页 :param others: 是否关闭指定标签页之外的 :return: None @@ -309,14 +309,14 @@ class ChromiumPage(ChromiumBase): self.to_tab() def close_other_tabs(self, tab_ids=None): - """关闭传入的标签页以外标签页,默认保留当前页。可传入多个 \n + """关闭传入的标签页以外标签页,默认保留当前页。可传入多个 :param tab_ids: 要保留的标签页id,可传入id组成的列表或元组,为None时保存当前页 :return: None """ self.close_tabs(tab_ids, True) def handle_alert(self, accept=True, send=None, timeout=None): - """处理提示框,可以自动等待提示框出现 \n + """处理提示框,可以自动等待提示框出现 :param accept: True表示确认,False表示取消,其它值不会按按钮但依然返回文本值 :param send: 处理prompt提示框时可输入文本 :param timeout: 等待提示框出现的超时时间,为None则使用self.timeout属性的值 @@ -426,7 +426,7 @@ class WindowSetter(object): self._perform({'windowState': 'normal'}) def size(self, width=None, height=None): - """设置窗口大小 \n + """设置窗口大小 :param width: 窗口宽度 :param height: 窗口高度 :return: None @@ -438,7 +438,7 @@ class WindowSetter(object): self._perform({'width': width, 'height': height}) def location(self, x=None, y=None): - """设置窗口在屏幕中的位置,相对左上角坐标 \n + """设置窗口在屏幕中的位置,相对左上角坐标 :param x: 距离顶部距离 :param y: 距离左边距离 :return: None diff --git a/DrissionPage/configs/chromium_options.py b/DrissionPage/configs/chromium_options.py index f610933..bfcf84c 100644 --- a/DrissionPage/configs/chromium_options.py +++ b/DrissionPage/configs/chromium_options.py @@ -307,11 +307,12 @@ class ChromiumOptions(object): return self - def auto_port(self, data_path): + def auto_port(self, data_path=None): """自动获取可用端口 \n - :param data_path: 用户文件夹保存路径 + :param data_path: 用户文件夹保存路径,为None则保存在当前路径 :return: 当前对象 """ + data_path = data_path or '' port, path = PortFinder().get_port(data_path) self.set_paths(local_port=port, user_data_path=path) return self diff --git a/DrissionPage/configs/chromium_options.pyi b/DrissionPage/configs/chromium_options.pyi index 45f6e44..640bf2f 100644 --- a/DrissionPage/configs/chromium_options.pyi +++ b/DrissionPage/configs/chromium_options.pyi @@ -93,7 +93,7 @@ class ChromiumOptions(object): debugger_address: str = None, download_path: Union[str, Path] = None, user_data_path: Union[str, Path] = None, cache_path: Union[str, Path] = None) -> ChromiumOptions: ... - def auto_port(self, data_path: Union[str, Path]) -> ChromiumOptions: ... + def auto_port(self, data_path: Union[str, Path]=None) -> ChromiumOptions: ... def save(self, path: Union[str, Path] = None) -> str: ... diff --git a/DrissionPage/configs/session_options.py b/DrissionPage/configs/session_options.py index d2b16f0..c10a108 100644 --- a/DrissionPage/configs/session_options.py +++ b/DrissionPage/configs/session_options.py @@ -75,7 +75,7 @@ class SessionOptions(object): return self._download_path def set_paths(self, download_path=None): - """设置默认下载路径 \n + """设置默认下载路径 :param download_path: 下载路径 :return: 返回当前对象 """ @@ -104,7 +104,7 @@ class SessionOptions(object): return self._proxies def set_proxies(self, http, https=None): - """设置proxies参数 \n + """设置proxies参数 :param http: http代理地址 :param https: https代理地址 :return: 返回当前对象 @@ -123,7 +123,7 @@ class SessionOptions(object): return self._headers def set_headers(self, headers): - """设置headers参数 \n + """设置headers参数 :param headers: 参数值,传入None可在ini文件标记删除 :return: 返回当前对象 """ @@ -135,7 +135,7 @@ class SessionOptions(object): return self def set_a_header(self, attr, value): - """设置headers中一个项 \n + """设置headers中一个项 :param attr: 设置名称 :param value: 设置值 :return: 返回当前对象 @@ -147,7 +147,7 @@ class SessionOptions(object): return self def remove_a_header(self, attr): - """从headers中删除一个设置 \n + """从headers中删除一个设置 :param attr: 要删除的设置 :return: 返回当前对象 """ @@ -168,7 +168,7 @@ class SessionOptions(object): return self._cookies def set_cookies(self, cookies): - """设置cookies信息 \n + """设置cookies信息 :param cookies: cookies,可为CookieJar, list, tuple, str, dict,传入None可在ini文件标记删除 :return: 返回当前对象 """ @@ -182,7 +182,7 @@ class SessionOptions(object): return self._auth def set_auth(self, auth): - """设置认证元组或对象 \n + """设置认证元组或对象 :param auth: 认证元组或对象 :return: 返回当前对象 """ @@ -197,7 +197,7 @@ class SessionOptions(object): return self._hooks def set_hooks(self, hooks): - """设置回调方法 \n + """设置回调方法 :param hooks: :return: 返回当前对象 """ @@ -212,7 +212,7 @@ class SessionOptions(object): return self._params def set_params(self, params): - """设置查询参数字典 \n + """设置查询参数字典 :param params: 查询参数字典 :return: 返回当前对象 """ @@ -225,7 +225,7 @@ class SessionOptions(object): return self._verify def set_verify(self, on_off): - """设置是否验证SSL证书 \n + """设置是否验证SSL证书 :param on_off: 是否验证 SSL 证书 :return: 返回当前对象 """ @@ -238,7 +238,7 @@ class SessionOptions(object): return self._cert def set_cert(self, cert): - """SSL客户端证书文件的路径(.pem格式),或(‘cert’, ‘key’)元组 \n + """SSL客户端证书文件的路径(.pem格式),或(‘cert’, ‘key’)元组 :param cert: 证书路径或元组 :return: 返回当前对象 """ @@ -253,7 +253,7 @@ class SessionOptions(object): return self._adapters def add_adapter(self, url, adapter): - """添加适配器 \n + """添加适配器 :param url: 适配器对应url :param adapter: 适配器对象 :return: 返回当前对象 @@ -267,7 +267,7 @@ class SessionOptions(object): return self._stream def set_stream(self, on_off): - """设置是否使用流式响应内容 \n + """设置是否使用流式响应内容 :param on_off: 是否使用流式响应内容 :return: 返回当前对象 """ @@ -280,7 +280,7 @@ class SessionOptions(object): return self._trust_env def set_trust_env(self, on_off): - """设置是否信任环境 \n + """设置是否信任环境 :param on_off: 是否信任环境 :return: 返回当前对象 """ @@ -293,7 +293,7 @@ class SessionOptions(object): return self._max_redirects def set_max_redirects(self, times): - """设置最大重定向次数 \n + """设置最大重定向次数 :param times: 最大重定向次数 :return: 返回当前对象 """ @@ -315,7 +315,7 @@ class SessionOptions(object): self._del_set.remove(arg) def save(self, path=None): - """保存设置到文件 \n + """保存设置到文件 :param path: ini文件的路径,传入 'default' 保存到默认ini文件 :return: 保存文件的绝对路径 """ @@ -373,7 +373,7 @@ class SessionOptions(object): def session_options_to_dict(options): - """把session配置对象转换为字典 \n + """把session配置对象转换为字典 :param options: session配置对象或字典 :return: 配置字典 """ diff --git a/DrissionPage/drission.py b/DrissionPage/drission.py index c4afc4f..b74212e 100644 --- a/DrissionPage/drission.py +++ b/DrissionPage/drission.py @@ -25,7 +25,7 @@ class Drission(object): """Drission类用于管理WebDriver对象和Session对象,是驱动器的角色""" def __init__(self, driver_or_options=None, session_or_options=None, ini_path=None, proxy=None): - """初始化,可接收现成的WebDriver和Session对象,或接收它们的配置信息生成对象 \n + """初始化,可接收现成的WebDriver和Session对象,或接收它们的配置信息生成对象 :param driver_or_options: driver对象或DriverOptions、Options类,传入False则创建空配置对象 :param session_or_options: Session对象或设置字典,传入False则创建空配置对象 :param ini_path: ini文件路径 @@ -93,7 +93,7 @@ class Drission(object): @property def driver(self): - """返回WebDriver对象,如未初始化则按配置信息创建。 \n + """返回WebDriver对象,如未初始化则按配置信息创建。 如设置了本地调试浏览器,可自动接入或打开浏览器进程。 """ if self._driver is None: @@ -130,7 +130,7 @@ class Drission(object): @session_options.setter def session_options(self, options): - """设置session配置 \n + """设置session配置 :param options: session配置字典 :return: None """ @@ -144,7 +144,7 @@ class Drission(object): @proxy.setter def proxy(self, proxies=None): - """设置代理信息 \n + """设置代理信息 :param proxies: 代理信息字典 :return: None """ @@ -226,7 +226,7 @@ class Drission(object): ShowWindow(hd, sw) def set_cookies(self, cookies, set_session=False, set_driver=False): - """设置cookies \n + """设置cookies :param cookies: cookies信息,可为CookieJar, list, tuple, str, dict :param set_session: 是否设置session的cookies :param set_driver: 是否设置driver的cookies @@ -283,7 +283,7 @@ class Drission(object): self.driver.add_cookie(cookie) def _set_session(self, data): - """根据传入字典对session进行设置 \n + """根据传入字典对session进行设置 :param data: session配置字典 :return: None """ @@ -302,7 +302,7 @@ class Drission(object): self._session.__setattr__(i, data[i]) def cookies_to_session(self, copy_user_agent=False): - """把driver对象的cookies复制到session对象 \n + """把driver对象的cookies复制到session对象 :param copy_user_agent: 是否复制ua信息 :return: None """ @@ -312,7 +312,7 @@ class Drission(object): self.set_cookies(self.driver.get_cookies(), set_session=True) def cookies_to_driver(self, url): - """把session对象的cookies复制到driver对象 \n + """把session对象的cookies复制到driver对象 :param url: 作用域 :return: None """ @@ -362,7 +362,7 @@ class Drission(object): def user_agent_to_session(driver, session): - """把driver的user-agent复制到session \n + """把driver的user-agent复制到session :param driver: 来源driver对象 :param session: 目标session对象 :return: None @@ -374,7 +374,7 @@ def user_agent_to_session(driver, session): def create_driver(chrome_path, driver_path, options): - """创建 WebDriver 对象 \n + """创建 WebDriver 对象 :param chrome_path: chrome.exe 路径 :param driver_path: chromedriver.exe 路径 :param options: Options 对象 @@ -431,7 +431,7 @@ def get_chrome_hwnds_from_pid(pid): def kill_progress(pid=None, port=None): - """关闭浏览器进程 \n + """关闭浏览器进程 :param pid: 进程id :param port: 端口号,如没有进程id,从端口号获取 :return: 是否成功 diff --git a/DrissionPage/driver_element.py b/DrissionPage/driver_element.py index 78218ac..7e98efc 100644 --- a/DrissionPage/driver_element.py +++ b/DrissionPage/driver_element.py @@ -25,7 +25,7 @@ class DriverElement(DrissionElement): """driver模式的元素对象,包装了一个WebElement对象,并封装了常用功能""" def __init__(self, ele, page=None): - """初始化对象 \n + """初始化对象 :param ele: 被包装的WebElement元素 :param page: 元素所在页面 """ @@ -39,8 +39,8 @@ class DriverElement(DrissionElement): return f'' def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele2 = ele1('@id=ele_id') \n + """在内部查找元素 + 例:ele2 = ele1('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 超时时间 :return: DriverElement对象或属性、文本 @@ -97,7 +97,7 @@ class DriverElement(DrissionElement): return self.inner_ele.get_attribute('innerText') def attr(self, attr): - """获取attribute属性值 \n + """获取attribute属性值 :param attr: 属性名 :return: 属性值文本 """ @@ -113,7 +113,7 @@ class DriverElement(DrissionElement): return format_html(self.inner_ele.get_attribute(attr)) def ele(self, loc_or_str, timeout=None): - """返回当前元素下级符合条件的第一个元素、属性或节点文本 \n + """返回当前元素下级符合条件的第一个元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与元素所在页面等待时间一致 :return: DriverElement对象或属性、文本 @@ -121,7 +121,7 @@ class DriverElement(DrissionElement): return self._ele(loc_or_str, timeout) def eles(self, loc_or_str, timeout=None): - """返回当前元素下级所有符合条件的子元素、属性或节点文本 \n + """返回当前元素下级所有符合条件的子元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与元素所在页面等待时间一致 :return: DriverElement对象或属性、文本组成的列表 @@ -129,21 +129,21 @@ class DriverElement(DrissionElement): return self._ele(loc_or_str, timeout=timeout, single=False) def s_ele(self, loc_or_str=None): - """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 \n + """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ return make_session_ele(self, loc_or_str) def s_eles(self, loc_or_str): - """查找所有符合条件的元素以SessionElement列表形式返回 \n + """查找所有符合条件的元素以SessionElement列表形式返回 :param loc_or_str: 定位符 :return: SessionElement或属性、文本组成的列表 """ return make_session_ele(self, loc_or_str, single=False) def _ele(self, loc_or_str, timeout=None, single=True, relative=False): - """返回当前元素下级符合条件的子元素、属性或节点文本,默认返回第一个 \n + """返回当前元素下级符合条件的子元素、属性或节点文本,默认返回第一个 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间 :param single: True则返回第一个,False则返回全部 @@ -247,14 +247,14 @@ class DriverElement(DrissionElement): return self._scroll def parent(self, level_or_loc=1): - """返回上面某一级父元素,可指定层数或用查询语法定位 \n + """返回上面某一级父元素,可指定层数或用查询语法定位 :param level_or_loc: 第几级父元素,或定位符 :return: 上级元素对象 """ return super().parent(level_or_loc) def prev(self, index=1, filter_loc='', timeout=0): - """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 前面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 @@ -264,7 +264,7 @@ class DriverElement(DrissionElement): return super().prev(index, filter_loc, timeout) def next(self, index=1, filter_loc='', timeout=0): - """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 后面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 @@ -274,7 +274,7 @@ class DriverElement(DrissionElement): return super().next(index, filter_loc, timeout) def before(self, index=1, filter_loc='', timeout=None): - """返回当前元素前面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元,而是整个DOM文档 \n + """返回当前元素前面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元,而是整个DOM文档 :param index: 前面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 @@ -284,7 +284,7 @@ class DriverElement(DrissionElement): return super().before(index, filter_loc, timeout) def after(self, index=1, filter_loc='', timeout=None): - """返回当前元素后面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元,而是整个DOM文档 \n + """返回当前元素后面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元,而是整个DOM文档 :param index: 后面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 @@ -294,7 +294,7 @@ class DriverElement(DrissionElement): return super().after(index, filter_loc, timeout) def prevs(self, filter_loc='', timeout=0): - """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 兄弟元素或节点文本组成的列表 @@ -302,7 +302,7 @@ class DriverElement(DrissionElement): return super().prevs(filter_loc, timeout) def nexts(self, filter_loc='', timeout=0): - """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 兄弟元素或节点文本组成的列表 @@ -310,7 +310,7 @@ class DriverElement(DrissionElement): return super().nexts(filter_loc, timeout) def befores(self, filter_loc='', timeout=None): - """返回当前元素后面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元,而是整个DOM文档 \n + """返回当前元素后面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元,而是整个DOM文档 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 本元素前面的元素或节点组成的列表 @@ -318,7 +318,7 @@ class DriverElement(DrissionElement): return super().befores(filter_loc, timeout) def afters(self, filter_loc='', timeout=None): - """返回当前元素前面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元,而是整个DOM文档 \n + """返回当前元素前面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元,而是整个DOM文档 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 本元素后面的元素或节点组成的列表 @@ -326,7 +326,7 @@ class DriverElement(DrissionElement): return super().afters(filter_loc, timeout) def left(self, index=1, filter_loc=''): - """获取网页上显示在当前元素左边的某个元素,可设置选取条件,可指定结果中第几个 \n + """获取网页上显示在当前元素左边的某个元素,可设置选取条件,可指定结果中第几个 :param index: 获取第几个 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象 @@ -335,7 +335,7 @@ class DriverElement(DrissionElement): return eles[index - 1] if index <= len(eles) else None def right(self, index=1, filter_loc=''): - """获取网页上显示在当前元素右边的某个元素,可设置选取条件,可指定结果中第几个 \n + """获取网页上显示在当前元素右边的某个元素,可设置选取条件,可指定结果中第几个 :param index: 获取第几个 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象 @@ -344,7 +344,7 @@ class DriverElement(DrissionElement): return eles[index - 1] if index <= len(eles) else None def above(self, index=1, filter_loc=''): - """获取网页上显示在当前元素上边的某个元素,可设置选取条件,可指定结果中第几个 \n + """获取网页上显示在当前元素上边的某个元素,可设置选取条件,可指定结果中第几个 :param index: 获取第几个 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象 @@ -353,7 +353,7 @@ class DriverElement(DrissionElement): return eles[index - 1] if index <= len(eles) else None def below(self, index=1, filter_loc=''): - """获取网页上显示在当前元素下边的某个元素,可设置选取条件,可指定结果中第几个 \n + """获取网页上显示在当前元素下边的某个元素,可设置选取条件,可指定结果中第几个 :param index: 获取第几个 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象 @@ -362,7 +362,7 @@ class DriverElement(DrissionElement): return eles[index - 1] if index <= len(eles) else None def near(self, index=1, filter_loc=''): - """获取网页上显示在当前元素最近的某个元素,可设置选取条件,可指定结果中第几个 \n + """获取网页上显示在当前元素最近的某个元素,可设置选取条件,可指定结果中第几个 :param index: 获取第几个 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象 @@ -371,42 +371,42 @@ class DriverElement(DrissionElement): return eles[index - 1] if index <= len(eles) else None def lefts(self, filter_loc=''): - """获取网页上显示在当前元素左边的所有元素,可设置选取条件,从近到远排列 \n + """获取网页上显示在当前元素左边的所有元素,可设置选取条件,从近到远排列 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象组成的列表 """ return self._get_relative_eles('left', filter_loc) def rights(self, filter_loc=''): - """获取网页上显示在当前元素右边的所有元,可设置选取条件,从近到远排列 \n + """获取网页上显示在当前元素右边的所有元,可设置选取条件,从近到远排列 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象组成的列表 """ return self._get_relative_eles('right', filter_loc) def aboves(self, filter_loc=''): - """获取网页上显示在当前元素上边的所有元素,可设置选取条件,从近到远排列 \n + """获取网页上显示在当前元素上边的所有元素,可设置选取条件,从近到远排列 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象组成的列表 """ return self._get_relative_eles('left', filter_loc) def belows(self, filter_loc=''): - """获取网页上显示在当前元素下边的所有元素,可设置选取条件,从近到远排列 \n + """获取网页上显示在当前元素下边的所有元素,可设置选取条件,从近到远排列 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象组成的列表 """ return self._get_relative_eles('left', filter_loc) def nears(self, filter_loc=''): - """获取网页上显示在当前元素附近元素,可设置选取条件,从近到远排列 \n + """获取网页上显示在当前元素附近元素,可设置选取条件,从近到远排列 :param filter_loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象组成的列表 """ return self._get_relative_eles('near', filter_loc) def wait_ele(self, loc_or_ele, timeout=None): - """等待子元素从dom删除、显示、隐藏 \n + """等待子元素从dom删除、显示、隐藏 :param loc_or_ele: 可以是元素、查询字符串、loc元组 :param timeout: 等待超时时间 :return: 等待是否成功 @@ -414,7 +414,7 @@ class DriverElement(DrissionElement): return ElementWaiter(self, loc_or_ele, timeout) def style(self, style, pseudo_ele=''): - """返回元素样式属性值,可获取伪元素属性值 \n + """返回元素样式属性值,可获取伪元素属性值 :param style: 样式属性名称 :param pseudo_ele: 伪元素名称(如有) :return: 样式属性的值 @@ -426,8 +426,8 @@ class DriverElement(DrissionElement): return None if r == 'none' else r def click(self, by_js=None, timeout=None): - """点击元素 \n - 尝试点击直到超时,若都失败就改用js点击 \n + """点击元素 + 尝试点击直到超时,若都失败就改用js点击 :param by_js: 是否用js点击,为True时直接用js点击,为False时重试失败也不会改用js :param timeout: 尝试点击的超时时间,不指定则使用父页面的超时时间 :return: 是否点击成功 @@ -458,7 +458,7 @@ class DriverElement(DrissionElement): return False def click_at(self, x=None, y=None, by_js=False): - """带偏移量点击本元素,相对于左上角坐标。不传入x或y值时点击元素中点 \n + """带偏移量点击本元素,相对于左上角坐标。不传入x或y值时点击元素中点 :param x: 相对元素左上角坐标的x轴偏移量 :param y: 相对元素左上角坐标的y轴偏移量 :param by_js: 是否用js点击 @@ -489,7 +489,7 @@ class DriverElement(DrissionElement): ActionChains(self.page.driver).context_click(self.inner_ele).perform() def r_click_at(self, x=None, y=None): - """带偏移量右键单击本元素,相对于左上角坐标。不传入x或y值时点击元素中点 \n + """带偏移量右键单击本元素,相对于左上角坐标。不传入x或y值时点击元素中点 :param x: 相对元素左上角坐标的x轴偏移量 :param y: 相对元素左上角坐标的y轴偏移量 :return: None @@ -500,7 +500,7 @@ class DriverElement(DrissionElement): ActionChains(self.page.driver).move_to_element_with_offset(self.inner_ele, x, y).context_click().perform() def input(self, vals, clear=True, insure=True, timeout=None): - """输入文本或组合键,也可用于输入文件路径到input元素(文件间用\n间隔) \n + """输入文本或组合键,也可用于输入文件路径到input元素(文件间用\n间隔) :param vals: 文本值或按键组合 :param clear: 输入前是否清空文本框 :param insure: 确保输入正确,解决文本框有时输入失效的问题,不能用于输入组合键 @@ -546,7 +546,7 @@ class DriverElement(DrissionElement): return True def run_script(self, script, *args): - """执行js代码,代码中用arguments[0]表示自己 \n + """执行js代码,代码中用arguments[0]表示自己 :param script: js文本 :param args: 传入的参数 :return: js执行结果 @@ -562,7 +562,7 @@ class DriverElement(DrissionElement): pass def clear(self, insure=True): - """清空元素文本 \n + """清空元素文本 :param insure: 是否确保清空 :return: 是否清空成功,不能清空的元素返回None """ @@ -597,7 +597,7 @@ class DriverElement(DrissionElement): return False def screenshot(self, path=None, filename=None, as_bytes=False): - """对元素进行截图 \n + """对元素进行截图 :param path: 保存路径 :param filename: 图片文件名,不传入时以元素tag name命名 :param as_bytes: 是否已字节形式返回图片,为True时上面两个参数失效 @@ -627,14 +627,14 @@ class DriverElement(DrissionElement): return img_path def prop(self, prop): - """获取property属性值 \n + """获取property属性值 :param prop: 属性名 :return: 属性值文本 """ return format_html(self.inner_ele.get_property(prop)) def set_prop(self, prop, value): - """设置元素property属性 \n + """设置元素property属性 :param prop: 属性名 :param value: 属性值 :return: 是否设置成功 @@ -647,7 +647,7 @@ class DriverElement(DrissionElement): return False def set_attr(self, attr, value): - """设置元素attribute属性 \n + """设置元素attribute属性 :param attr: 属性名 :param value: 属性值 :return: 是否设置成功 @@ -659,7 +659,7 @@ class DriverElement(DrissionElement): return False def remove_attr(self, attr): - """删除元素attribute属性 \n + """删除元素attribute属性 :param attr: 属性名 :return: 是否删除成功 """ @@ -670,7 +670,7 @@ class DriverElement(DrissionElement): return False def drag(self, x, y, speed=40, shake=True): - """拖拽当前元素到相对位置 \n + """拖拽当前元素到相对位置 :param x: x变化值 :param y: y变化值 :param speed: 拖动的速度,传入0即瞬间到达 @@ -682,7 +682,7 @@ class DriverElement(DrissionElement): self.drag_to((x, y), speed, shake) def drag_to(self, ele_or_loc, speed=40, shake=True): - """拖拽当前元素,目标为另一个元素或坐标元组 \n + """拖拽当前元素,目标为另一个元素或坐标元组 :param ele_or_loc: 另一个元素或坐标元组,坐标为元素中点的坐标 :param speed: 拖动的速度,传入0即瞬间到达 :param shake: 是否随机抖动 @@ -722,7 +722,7 @@ class DriverElement(DrissionElement): actions.release().perform() def hover(self, x=None, y=None): - """鼠标悬停,可接受偏移量,偏移量相对于元素左上角坐标。不传入x或y值时悬停在元素中点 \n + """鼠标悬停,可接受偏移量,偏移量相对于元素左上角坐标。不传入x或y值时悬停在元素中点 :param x: 相对元素左上角坐标的x轴偏移量 :param y: 相对元素左上角坐标的y轴偏移量 :return: None @@ -733,7 +733,7 @@ class DriverElement(DrissionElement): ActionChains(self.page.driver).move_to_element_with_offset(self.inner_ele, x, y).perform() def _get_relative_eles(self, mode, loc=''): - """获取网页上相对于当前元素周围的某个元素,可设置选取条件 \n + """获取网页上相对于当前元素周围的某个元素,可设置选取条件 :param mode: 可选:'left', 'right', 'above', 'below', 'near' :param loc: 筛选条件,可用selenium的(By, str),也可用本库定位语法 :return: DriverElement对象 @@ -762,8 +762,8 @@ class DriverElement(DrissionElement): def make_driver_ele(page_or_ele, loc, single=True, timeout=None): - """执行driver模式元素的查找 \n - 页面查找元素及元素查找下级元素皆使用此方法 \n + """执行driver模式元素的查找 + 页面查找元素及元素查找下级元素皆使用此方法 :param page_or_ele: DriverPage对象或DriverElement对象 :param loc: 元素定位元组 :param single: True则返回第一个,False则返回全部 @@ -939,7 +939,7 @@ class Select(object): self.select_ele = SeleniumSelect(ele.inner_ele) def __call__(self, text_or_index, timeout=None): - """选定下拉列表中子元素 \n + """选定下拉列表中子元素 :param text_or_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: None @@ -959,7 +959,7 @@ class Select(object): @property def selected_option(self): - """返回第一个被选中的option元素 \n + """返回第一个被选中的option元素 :return: DriverElement对象或None """ ele = self.inner_ele.run_script('return arguments[0].options[arguments[0].selectedIndex];') @@ -967,7 +967,7 @@ class Select(object): @property def selected_options(self): - """返回所有被选中的option元素列表 \n + """返回所有被选中的option元素列表 :return: DriverElement对象组成的列表 """ return [x for x in self.options if x.is_selected()] @@ -977,7 +977,7 @@ class Select(object): self.select_ele.deselect_all() def select(self, text_or_index, timeout=None): - """选定下拉列表中子元素 \n + """选定下拉列表中子元素 :param text_or_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: 是否选择成功 @@ -987,7 +987,7 @@ class Select(object): return self._select(text_or_index, i, False, timeout) def select_by_value(self, value, timeout=None): - """此方法用于根据value值选择项。当元素是多选列表时,可以接收list或tuple \n + """此方法用于根据value值选择项。当元素是多选列表时,可以接收list或tuple :param value: value属性值,传入list或tuple可选择多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: None @@ -996,7 +996,7 @@ class Select(object): return self._select(value, 'value', False, timeout) def deselect(self, text_or_index, timeout=None): - """取消选定下拉列表中子元素 \n + """取消选定下拉列表中子元素 :param text_or_index: 根据文本或序号取消择选项,若允许多选,传入list或tuple可取消多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: None @@ -1006,7 +1006,7 @@ class Select(object): return self._select(text_or_index, i, True, timeout) def deselect_by_value(self, value, timeout=None): - """此方法用于根据value值取消选择项。当元素是多选列表时,可以接收list或tuple \n + """此方法用于根据value值取消选择项。当元素是多选列表时,可以接收list或tuple :param value: value属性值,传入list或tuple可取消多项 :param timeout: 超时时间,不输入默认实用页面超时时间 :return: None @@ -1023,7 +1023,7 @@ class Select(object): i.click(by_js=True) def _select(self, text_value_index, para_type='text', deselect=False, timeout=None): - """选定或取消选定下拉列表中子元素 \n + """选定或取消选定下拉列表中子元素 :param text_value_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 :param para_type: 参数类型,可选 'text'、'value'、'index' :param deselect: 是否取消选择 @@ -1072,7 +1072,7 @@ class Select(object): raise TypeError('只能传入str、int、list和tuple类型。') def _select_multi(self, text_value_index=None, para_type='text', deselect=False) -> bool: - """选定或取消选定下拉列表中多个子元素 \n + """选定或取消选定下拉列表中多个子元素 :param text_value_index: 根据文本、值选或序号择选多项 :param para_type: 参数类型,可选 'text'、'value'、'index' :param deselect: 是否取消选择 @@ -1100,7 +1100,7 @@ class ElementWaiter(object): """等待元素在dom中某种状态,如删除、显示、隐藏""" def __init__(self, page_or_ele, loc_or_ele, timeout=None): - """等待元素在dom中某种状态,如删除、显示、隐藏 \n + """等待元素在dom中某种状态,如删除、显示、隐藏 :param page_or_ele: 页面或父元素 :param loc_or_ele: 要等待的元素,可以是已有元素、定位符 :param timeout: 超时时间,默认读取页面超时时间 @@ -1142,7 +1142,7 @@ class ElementWaiter(object): return self._wait_ele('hidden') def _wait_ele(self, mode): - """执行等待 \n + """执行等待 :param mode: 等待模式 :return: 是否等待成功 """ @@ -1215,7 +1215,7 @@ class Scroll(object): self.driver.run_script(f'{self.t1}.scrollTo(0,{self.t2}.scrollTop);') def to_location(self, x, y): - """滚动到指定位置 \n + """滚动到指定位置 :param x: 水平距离 :param y: 垂直距离 :return: None @@ -1223,7 +1223,7 @@ class Scroll(object): self.driver.run_script(f'{self.t1}.scrollTo({x},{y});') def up(self, pixel=300): - """向上滚动若干像素,水平位置不变 \n + """向上滚动若干像素,水平位置不变 :param pixel: 滚动的像素 :return: None """ @@ -1231,14 +1231,14 @@ class Scroll(object): self.driver.run_script(f'{self.t1}.scrollBy(0,{pixel});') def down(self, pixel=300): - """向下滚动若干像素,水平位置不变 \n + """向下滚动若干像素,水平位置不变 :param pixel: 滚动的像素 :return: None """ self.driver.run_script(f'{self.t1}.scrollBy(0,{pixel});') def left(self, pixel=300): - """向左滚动若干像素,垂直位置不变 \n + """向左滚动若干像素,垂直位置不变 :param pixel: 滚动的像素 :return: None """ @@ -1246,7 +1246,7 @@ class Scroll(object): self.driver.run_script(f'{self.t1}.scrollBy({pixel},0);') def right(self, pixel=300): - """向右滚动若干像素,垂直位置不变 \n + """向右滚动若干像素,垂直位置不变 :param pixel: 滚动的像素 :return: None """ diff --git a/DrissionPage/driver_page.py b/DrissionPage/driver_page.py index 02350a7..286b96d 100644 --- a/DrissionPage/driver_page.py +++ b/DrissionPage/driver_page.py @@ -29,8 +29,8 @@ class DriverPage(BasePage): self._scroll = None def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele = page('@id=ele_id') \n + """在内部查找元素 + 例:ele = page('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 超时时间 :return: DriverElement对象或属性、文本 @@ -58,7 +58,7 @@ class DriverPage(BasePage): return loads(self('t:pre').text) def get(self, url, show_errmsg=False, retry=None, interval=None): - """访问url \n + """访问url :param url: 目标url :param show_errmsg: 是否显示和抛出异常 :param retry: 重试次数 @@ -70,7 +70,7 @@ class DriverPage(BasePage): return self._url_available def ele(self, loc_or_ele, timeout=None): - """返回页面中符合条件的第一个元素 \n + """返回页面中符合条件的第一个元素 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与页面等待时间一致 :return: DriverElement对象或属性、文本 @@ -78,7 +78,7 @@ class DriverPage(BasePage): return self._ele(loc_or_ele, timeout) def eles(self, loc_or_str, timeout=None): - """返回页面中所有符合条件的元素 \n + """返回页面中所有符合条件的元素 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与页面等待时间一致 :return: DriverElement对象或属性、文本组成的列表 @@ -86,7 +86,7 @@ class DriverPage(BasePage): return self._ele(loc_or_str, timeout, single=False) def s_ele(self, loc_or_ele=None): - """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 \n + """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 :param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ @@ -96,14 +96,14 @@ class DriverPage(BasePage): return make_session_ele(self, loc_or_ele) def s_eles(self, loc_or_str): - """查找所有符合条件的元素以SessionElement列表形式返回 \n + """查找所有符合条件的元素以SessionElement列表形式返回 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象组成的列表 """ return make_session_ele(self, loc_or_str, single=False) def _ele(self, loc_or_ele, timeout=None, single=True): - """返回页面中符合条件的元素,默认返回第一个 \n + """返回页面中符合条件的元素,默认返回第一个 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :param timeout: 查找元素超时时间 :param single: True则返回第一个,False则返回全部 @@ -144,7 +144,7 @@ class DriverPage(BasePage): self._wait_object = None def _d_connect(self, to_url, times=0, interval=1, show_errmsg=False): - """尝试连接,重试若干次 \n + """尝试连接,重试若干次 :param to_url: 要访问的url :param times: 重试次数 :param interval: 重试间隔(秒) @@ -234,21 +234,21 @@ class DriverPage(BasePage): @property def to_frame(self): - """用于跳转到frame的对象,调用其方法实现跳转 \n - 示例: \n - page.to_frame.by_loc('tag:iframe') - 通过传入frame的查询字符串定位 \n - page.to_frame.by_loc((By.TAG_NAME, 'iframe')) - 通过传入定位符定位 \n - page.to_frame.by_id('iframe_id') - 通过frame的id属性定位 \n - page.to_frame('iframe_name') - 通过frame的name属性定位 \n - page.to_frame(iframe_element) - 通过传入元素对象定位 \n - page.to_frame(0) - 通过frame的序号定位 \n - page.to_frame.main() - 跳到最顶层 \n + """用于跳转到frame的对象,调用其方法实现跳转 + 示例: + page.to_frame.by_loc('tag:iframe') - 通过传入frame的查询字符串定位 + page.to_frame.by_loc((By.TAG_NAME, 'iframe')) - 通过传入定位符定位 + page.to_frame.by_id('iframe_id') - 通过frame的id属性定位 + page.to_frame('iframe_name') - 通过frame的name属性定位 + page.to_frame(iframe_element) - 通过传入元素对象定位 + page.to_frame(0) - 通过frame的序号定位 + page.to_frame.main() - 跳到最顶层 page.to_frame.parent() - 跳到上一层 """ return ToFrame(self) def set_timeouts(self, implicit=None, pageLoad=None, script=None): - """设置超时时间,单位为秒,selenium4以上版本有效 \n + """设置超时时间,单位为秒,selenium4以上版本有效 :param implicit: 查找元素超时时间 :param pageLoad: 页面加载超时时间 :param script: 脚本运行超时时间 @@ -264,7 +264,7 @@ class DriverPage(BasePage): self.driver.set_script_timeout(script) def wait_ele(self, loc_or_ele, timeout=None): - """等待元素从dom删除、显示、隐藏 \n + """等待元素从dom删除、显示、隐藏 :param loc_or_ele: 可以是元素、查询字符串、loc元组 :param timeout: 等待超时时间 :return: 用于等待的ElementWaiter对象 @@ -272,13 +272,13 @@ class DriverPage(BasePage): return ElementWaiter(self, loc_or_ele, timeout) def check_page(self): - """检查页面是否符合预期 \n + """检查页面是否符合预期 由子类自行实现各页面的判定规则 """ return None def run_script(self, script, *args): - """执行js代码 \n + """执行js代码 :param script: js文本 :param args: 传入的参数 :return: js执行结果 @@ -286,7 +286,7 @@ class DriverPage(BasePage): return self.driver.execute_script(script, *args) def run_async_script(self, script, *args): - """以异步方式执行js代码 \n + """以异步方式执行js代码 :param script: js文本 :param args: 传入的参数 :return: js执行结果 @@ -302,7 +302,7 @@ class DriverPage(BasePage): return self.driver.execute_cdp_cmd(cmd, cmd_args) def create_tab(self, url=''): - """新建并定位到一个标签页,该标签页在最后面 \n + """新建并定位到一个标签页,该标签页在最后面 :param url: 新标签页跳转到的网址 :return: None """ @@ -311,8 +311,8 @@ class DriverPage(BasePage): self.get(url) def close_tabs(self, num_or_handles=None): - """关闭传入的标签页,默认关闭当前页。可传入多个 \n - 注意:当程序使用的是接管的浏览器,获取到的 handle 顺序和视觉效果不一致,不能按序号关闭。 \n + """关闭传入的标签页,默认关闭当前页。可传入多个 + 注意:当程序使用的是接管的浏览器,获取到的 handle 顺序和视觉效果不一致,不能按序号关闭。 :param num_or_handles:要关闭的标签页序号或handle,可传入handle和序号组成的列表或元组,为None时关闭当前页 :return: None """ @@ -324,8 +324,8 @@ class DriverPage(BasePage): self.to_tab(0) def close_other_tabs(self, num_or_handles=None): - """关闭传入的标签页以外标签页,默认保留当前页。可传入多个 \n - 注意:当程序使用的是接管的浏览器,获取到的 handle 顺序和视觉效果不一致,不能按序号关闭。 \n + """关闭传入的标签页以外标签页,默认保留当前页。可传入多个 + 注意:当程序使用的是接管的浏览器,获取到的 handle 顺序和视觉效果不一致,不能按序号关闭。 :param num_or_handles: 要保留的标签页序号或handle,可传入handle和序号组成的列表或元组,为None时保存当前页 :return: None """ @@ -339,8 +339,8 @@ class DriverPage(BasePage): self.to_tab(0) def to_tab(self, num_or_handle=0): - """跳转到标签页 \n - 注意:当程序使用的是接管的浏览器,获取到的 handle 顺序和视觉效果不一致 \n + """跳转到标签页 + 注意:当程序使用的是接管的浏览器,获取到的 handle 顺序和视觉效果不一致 :param num_or_handle: 标签页序号或handle字符串,序号第一个为0,最后为-1 :return: None """ @@ -353,14 +353,14 @@ class DriverPage(BasePage): self.driver.switch_to.window(tab) def set_ua_to_tab(self, ua): - """为当前tab设置user agent,只在当前tab有效 \n + """为当前tab设置user agent,只在当前tab有效 :param ua: user agent字符串 :return: None """ self.driver.execute_cdp_cmd("Network.setUserAgentOverride", {"userAgent": ua}) def get_session_storage(self, item=None): - """获取sessionStorage信息,不设置item则获取全部 \n + """获取sessionStorage信息,不设置item则获取全部 :param item: 要获取的项,不设置则返回全部 :return: sessionStorage一个或所有项内容 """ @@ -368,7 +368,7 @@ class DriverPage(BasePage): return self.run_script(js) def get_local_storage(self, item=None): - """获取localStorage信息,不设置item则获取全部 \n + """获取localStorage信息,不设置item则获取全部 :param item: 要获取的项目,不设置则返回全部 :return: localStorage一个或所有项内容 """ @@ -376,7 +376,7 @@ class DriverPage(BasePage): return self.run_script(js) def set_session_storage(self, item, value): - """设置或删除某项sessionStorage信息 \n + """设置或删除某项sessionStorage信息 :param item: 要设置的项 :param value: 项的值,设置为False时,删除该项 :return: None @@ -385,7 +385,7 @@ class DriverPage(BasePage): self.run_script(s) def set_local_storage(self, item, value): - """设置或删除某项localStorage信息 \n + """设置或删除某项localStorage信息 :param item: 要设置的项 :param value: 项的值,设置为False时,删除该项 :return: None @@ -394,7 +394,7 @@ class DriverPage(BasePage): self.run_script(s) def clean_cache(self, session_storage=True, local_storage=True, cache=True, cookies=True): - """清除缓存,可选要清除的项 \n + """清除缓存,可选要清除的项 :param session_storage: 是否清除sessionStorage :param local_storage: 是否清除localStorage :param cache: 是否清除cache @@ -411,7 +411,7 @@ class DriverPage(BasePage): self.run_cdp('Network.clearBrowserCookies') def screenshot(self, path=None, filename=None, as_bytes=False): - """截取页面可见范围截图 \n + """截取页面可见范围截图 :param path: 保存路径 :param filename: 图片文件名,不传入时以页面title命名 :param as_bytes: 是否已字节形式返回图片,为True时上面两个参数失效 @@ -430,7 +430,7 @@ class DriverPage(BasePage): return img_path def scroll_to_see(self, loc_or_ele): - """滚动页面直到元素可见 \n + """滚动页面直到元素可见 :param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串(详见ele函数注释) :return: None """ @@ -454,7 +454,7 @@ class DriverPage(BasePage): self.driver.forward() def set_window_size(self, width=None, height=None): - """设置浏览器窗口大小,默认最大化,任一参数为0最小化 \n + """设置浏览器窗口大小,默认最大化,任一参数为0最小化 :param width: 浏览器窗口高 :param height: 浏览器窗口宽 :return: None @@ -474,14 +474,14 @@ class DriverPage(BasePage): self.driver.set_window_size(new_x, new_y) def chrome_downloading(self, download_path): - """返回浏览器下载中的文件列表 \n + """返回浏览器下载中的文件列表 :param download_path: 下载文件夹路径 :return: 文件列表 """ return glob(f'{download_path}{sep}*.crdownload') def process_alert(self, ok=True, send=None, timeout=None): - """处理提示框 \n + """处理提示框 :param ok: True表示确认,False表示取消,其它值不会按按钮但依然返回文本值 :param send: 处理prompt提示框时可输入文本 :param timeout: 等待提示框出现的超时时间 @@ -523,7 +523,7 @@ class ToFrame(object): self.page = page def __call__(self, condition='main'): - """跳转到(i)frame,可传入id、name、序号、元素对象、定位符 \n + """跳转到(i)frame,可传入id、name、序号、元素对象、定位符 :param condition: (i)frame,可传入id、name、序号、元素对象、定位符 :return: 当前页面对象 """ @@ -544,7 +544,7 @@ class ToFrame(object): return self.page def parent(self, level=1): - """焦点跳转到上级框架,可指定上级层数 \n + """焦点跳转到上级框架,可指定上级层数 :param level: 上面第几层框架 :return: 框架所在页面对象 """ @@ -555,7 +555,7 @@ class ToFrame(object): return self.page def by_id(self, id_): - """焦点跳转到id为该值的(i)frame \n + """焦点跳转到id为该值的(i)frame :param id_: (i)frame的id属性值 :return: 框架所在页面对象 """ @@ -563,7 +563,7 @@ class ToFrame(object): return self.page def by_name(self, name): - """焦点跳转到name为该值的(i)frame \n + """焦点跳转到name为该值的(i)frame :param name: (i)frame的name属性值 :return: 框架所在页面对象 """ @@ -571,7 +571,7 @@ class ToFrame(object): return self.page def by_index(self, index): - """焦点跳转到页面中第几个(i)frame \n + """焦点跳转到页面中第几个(i)frame :param index: 页面中第几个(i)frame :return: 框架所在页面对象 """ @@ -579,7 +579,7 @@ class ToFrame(object): return self.page def by_loc(self, loc): - """焦点跳转到根据定位符获取到的(i)frame \n + """焦点跳转到根据定位符获取到的(i)frame :param loc: 定位符,支持selenium原生和DriverPage定位符 :return: 框架所在页面对象 """ @@ -587,7 +587,7 @@ class ToFrame(object): return self.page def by_ele(self, ele): - """焦点跳转到传入的(i)frame元素对象 \n + """焦点跳转到传入的(i)frame元素对象 :param ele: (i)frame元素对象 :return: 框架所在页面对象 """ diff --git a/DrissionPage/mix_page.py b/DrissionPage/mix_page.py index cd2c574..c224192 100644 --- a/DrissionPage/mix_page.py +++ b/DrissionPage/mix_page.py @@ -18,7 +18,7 @@ class MixPage(SessionPage, DriverPage, BasePage): """ def __init__(self, mode='d', drission=None, timeout=None, driver_options=None, session_options=None): - """初始化函数 \n + """初始化函数 :param mode: 'd' 或 's',即driver模式和session模式 :param drission: Drission对象,不传入时会自动创建,有传入时driver_options和session_options参数无效 :param timeout: 超时时间,d模式时为寻找元素时间,s模式时为连接时间,默认10秒 @@ -46,8 +46,8 @@ class MixPage(SessionPage, DriverPage, BasePage): self.timeout = timeout if timeout is not None else 10 def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele = page('@id=ele_id') \n + """在内部查找元素 + 例:ele = page('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 超时时间 :return: 子元素对象或属性文本 @@ -91,7 +91,7 @@ class MixPage(SessionPage, DriverPage, BasePage): return super(SessionPage, self).json def get(self, url, show_errmsg=False, retry=None, interval=None, **kwargs): - """跳转到一个url \n + """跳转到一个url :param url: 目标url :param show_errmsg: 是否显示和抛出异常 :param retry: 重试次数 @@ -105,7 +105,7 @@ class MixPage(SessionPage, DriverPage, BasePage): return super().get(url, show_errmsg, retry, interval, **kwargs) def ele(self, loc_or_ele, timeout=None): - """返回第一个符合条件的元素、属性或节点文本 \n + """返回第一个符合条件的元素、属性或节点文本 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与页面等待时间一致 :return: 元素对象或属性、文本节点文本 @@ -116,7 +116,7 @@ class MixPage(SessionPage, DriverPage, BasePage): return super(SessionPage, self).ele(loc_or_ele, timeout=timeout) def eles(self, loc_or_str, timeout=None): - """返回页面中所有符合条件的元素、属性或节点文本 \n + """返回页面中所有符合条件的元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与页面等待时间一致 :return: 元素对象或属性、文本组成的列表 @@ -127,7 +127,7 @@ class MixPage(SessionPage, DriverPage, BasePage): return super(SessionPage, self).eles(loc_or_str, timeout=timeout) def s_ele(self, loc_or_ele=None): - """查找第一个符合条件的元素以SessionElement形式返回,d模式处理复杂页面时效率很高 \n + """查找第一个符合条件的元素以SessionElement形式返回,d模式处理复杂页面时效率很高 :param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ @@ -137,7 +137,7 @@ class MixPage(SessionPage, DriverPage, BasePage): return super(SessionPage, self).s_ele(loc_or_ele) def s_eles(self, loc_or_str): - """查找所有符合条件的元素以SessionElement形式返回,d模式处理复杂页面时效率很高 \n + """查找所有符合条件的元素以SessionElement形式返回,d模式处理复杂页面时效率很高 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本组成的列表 """ @@ -147,7 +147,7 @@ class MixPage(SessionPage, DriverPage, BasePage): return super(SessionPage, self).s_eles(loc_or_str) def _ele(self, loc_or_ele, timeout=None, single=True): - """返回页面中符合条件的元素、属性或节点文本,默认返回第一个 \n + """返回页面中符合条件的元素、属性或节点文本,默认返回第一个 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :param timeout: 查找元素超时时间,d模式专用 :param single: True则返回第一个,False则返回全部 @@ -159,7 +159,7 @@ class MixPage(SessionPage, DriverPage, BasePage): return super(SessionPage, self)._ele(loc_or_ele, timeout=timeout, single=single) def get_cookies(self, as_dict=False, all_domains=False): - """返回cookies \n + """返回cookies :param as_dict: 是否以字典方式返回 :param all_domains: 是否返回所有域的cookies :return: cookies信息 @@ -177,7 +177,7 @@ class MixPage(SessionPage, DriverPage, BasePage): @property def driver(self): - """返回 driver 对象,如没有则创建 \n + """返回 driver 对象,如没有则创建 每次访问时切换到 d 模式,用于独有函数及外部调用 :return: WebDriver对象 """ @@ -206,10 +206,10 @@ class MixPage(SessionPage, DriverPage, BasePage): return self._response.url if self._response else None def change_mode(self, mode=None, go=True, copy_cookies=True): - """切换模式,接收's'或'd',除此以外的字符串会切换为 d 模式 \n - 切换时会把当前模式的cookies复制到目标模式 \n - 切换后,如果go是True,调用相应的get函数使访问的页面同步 \n - 注意:s转d时,若浏览器当前网址域名和s模式不一样,必须会跳转 \n + """切换模式,接收's'或'd',除此以外的字符串会切换为 d 模式 + 切换时会把当前模式的cookies复制到目标模式 + 切换后,如果go是True,调用相应的get函数使访问的页面同步 + 注意:s转d时,若浏览器当前网址域名和s模式不一样,必须会跳转 :param mode: 模式字符串 :param go: 是否跳转到原模式的url :param copy_cookies: 是否复制cookies到目标模式 @@ -244,7 +244,7 @@ class MixPage(SessionPage, DriverPage, BasePage): self.get(self._drission.driver.current_url) def set_cookies(self, cookies, refresh=True): - """设置cookies \n + """设置cookies :param cookies: cookies信息,可为CookieJar, list, tuple, str, dict :param refresh: 设置cookies后是否刷新页面 :return: None @@ -257,14 +257,14 @@ class MixPage(SessionPage, DriverPage, BasePage): self.refresh() def cookies_to_session(self, copy_user_agent=False): - """从driver复制cookies到session \n + """从driver复制cookies到session :param copy_user_agent : 是否复制user agent信息 """ self._drission.cookies_to_session(copy_user_agent) def cookies_to_driver(self, url=None): - """从session复制cookies到driver \n - chrome需要指定域才能接收cookies \n + """从session复制cookies到driver + chrome需要指定域才能接收cookies :param url: 目标域 :return: None """ @@ -272,8 +272,8 @@ class MixPage(SessionPage, DriverPage, BasePage): self._drission.cookies_to_driver(url) def check_page(self, by_requests=False): - """d模式时检查网页是否符合预期 \n - 默认由response状态检查,可重载实现针对性检查 \n + """d模式时检查网页是否符合预期 + 默认由response状态检查,可重载实现针对性检查 :param by_requests: 是否用内置response检查 :return: bool或None,None代表不知道结果 """ @@ -299,7 +299,7 @@ class MixPage(SessionPage, DriverPage, BasePage): # ----------------重写SessionPage的函数----------------------- def post(self, url, data=None, show_errmsg=False, retry=None, interval=None, **kwargs): - """用post方式跳转到url,会切换到s模式 \n + """用post方式跳转到url,会切换到s模式 :param url: 目标url :param data: post方式时提交的数据 :param show_errmsg: 是否显示和抛出异常 @@ -319,7 +319,7 @@ class MixPage(SessionPage, DriverPage, BasePage): return super().download def chrome_downloading(self, path=None): - """返回浏览器下载中的文件列表 \n + """返回浏览器下载中的文件列表 :param path: 下载文件夹路径,默认读取配置信息 :return: 正在下载的文件列表 """ diff --git a/DrissionPage/session_element.py b/DrissionPage/session_element.py index 57c7d66..cce9e77 100644 --- a/DrissionPage/session_element.py +++ b/DrissionPage/session_element.py @@ -18,7 +18,7 @@ class SessionElement(DrissionElement): """session模式的元素对象,包装了一个lxml的Element对象,并封装了常用功能""" def __init__(self, ele, page=None): - """初始化对象 \n + """初始化对象 :param ele: 被包装的HtmlElement元素 :param page: 元素所在页面对象,如果是从 html 文本生成的元素,则为 None """ @@ -34,8 +34,8 @@ class SessionElement(DrissionElement): return f'' def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele2 = ele1('@id=ele_id') \n + """在内部查找元素 + 例:ele2 = ele1('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 不起实际作用,用于和DriverElement对应,便于无差别调用 :return: SessionElement对象或属性、文本 @@ -75,14 +75,14 @@ class SessionElement(DrissionElement): return str(self._inner_ele.text_content()) def parent(self, level_or_loc=1): - """返回上面某一级父元素,可指定层数或用查询语法定位 \n + """返回上面某一级父元素,可指定层数或用查询语法定位 :param level_or_loc: 第几级父元素,或定位符 :return: 上级元素对象 """ return super().parent(level_or_loc) def prev(self, filter_loc='', index=1, timeout=0): - """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param filter_loc: 用于筛选元素的查询语法 :param index: 前面第几个查询结果元素 :param timeout: 查找元素的超时时间 @@ -91,7 +91,7 @@ class SessionElement(DrissionElement): return super().prev(index, filter_loc, timeout) def next(self, filter_loc='', index=1, timeout=0): - """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param filter_loc: 用于筛选元素的查询语法 :param index: 后面第几个查询结果元素 :param timeout: 查找元素的超时时间 @@ -100,7 +100,7 @@ class SessionElement(DrissionElement): return super().next(index, filter_loc, timeout) def before(self, filter_loc='', index=1, timeout=None): - """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param filter_loc: 用于筛选元素的查询语法 :param index: 前面第几个查询结果元素 :param timeout: 查找元素的超时时间 @@ -109,7 +109,7 @@ class SessionElement(DrissionElement): return super().before(index, filter_loc, timeout) def after(self, filter_loc='', index=1, timeout=None): - """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param filter_loc: 用于筛选元素的查询语法 :param index: 后面第几个查询结果元素 :param timeout: 查找元素的超时时间 @@ -118,7 +118,7 @@ class SessionElement(DrissionElement): return super().after(index, filter_loc, timeout) def prevs(self, filter_loc='', timeout=0): - """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 兄弟元素或节点文本组成的列表 @@ -126,7 +126,7 @@ class SessionElement(DrissionElement): return super().prevs(filter_loc, timeout) def nexts(self, filter_loc='', timeout=0): - """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 兄弟元素或节点文本组成的列表 @@ -134,7 +134,7 @@ class SessionElement(DrissionElement): return super().nexts(filter_loc, timeout) def befores(self, filter_loc='', timeout=None): - """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 本元素前面的元素或节点组成的列表 @@ -142,7 +142,7 @@ class SessionElement(DrissionElement): return super().befores(filter_loc, timeout) def afters(self, filter_loc='', timeout=None): - """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :param timeout: 查找元素的超时时间 :return: 本元素后面的元素或节点组成的列表 @@ -150,7 +150,7 @@ class SessionElement(DrissionElement): return super().afters(filter_loc, timeout) def attr(self, attr): - """返回attribute属性值 \n + """返回attribute属性值 :param attr: 属性名 :return: 属性值文本,没有该属性返回None """ @@ -183,7 +183,7 @@ class SessionElement(DrissionElement): return self.inner_ele.get(attr) def ele(self, loc_or_str, timeout=None): - """返回当前元素下级符合条件的第一个元素、属性或节点文本 \n + """返回当前元素下级符合条件的第一个元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 不起实际作用,用于和DriverElement对应,便于无差别调用 :return: SessionElement对象或属性、文本 @@ -191,7 +191,7 @@ class SessionElement(DrissionElement): return self._ele(loc_or_str) def eles(self, loc_or_str, timeout=None): - """返回当前元素下级所有符合条件的子元素、属性或节点文本 \n + """返回当前元素下级所有符合条件的子元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 不起实际作用,用于和DriverElement对应,便于无差别调用 :return: SessionElement对象或属性、文本组成的列表 @@ -199,21 +199,21 @@ class SessionElement(DrissionElement): return self._ele(loc_or_str, single=False) def s_ele(self, loc_or_str=None): - """返回当前元素下级符合条件的第一个元素、属性或节点文本 \n + """返回当前元素下级符合条件的第一个元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ return self._ele(loc_or_str) def s_eles(self, loc_or_str): - """返回当前元素下级所有符合条件的子元素、属性或节点文本 \n + """返回当前元素下级所有符合条件的子元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本组成的列表 """ return self._ele(loc_or_str, single=False) def _ele(self, loc_or_str, timeout=None, single=True, relative=False): - """返回当前元素下级符合条件的子元素、属性或节点文本,默认返回第一个 \n + """返回当前元素下级符合条件的子元素、属性或节点文本,默认返回第一个 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 不起实际作用,用于和父类对应 :param single: True则返回第一个,False则返回全部 @@ -244,8 +244,8 @@ class SessionElement(DrissionElement): def make_session_ele(html_or_ele, loc=None, single=True): - """从接收到的对象或html文本中查找元素,返回SessionElement对象 \n - 如要直接从html生成SessionElement而不在下级查找,loc输入None即可 \n + """从接收到的对象或html文本中查找元素,返回SessionElement对象 + 如要直接从html生成SessionElement而不在下级查找,loc输入None即可 :param html_or_ele: html文本、BaseParser对象 :param loc: 定位元组或字符串,为None时不在下级查找,返回根元素 :param single: True则返回第一个,False则返回全部 diff --git a/DrissionPage/session_page.py b/DrissionPage/session_page.py index 1848018..67dd129 100644 --- a/DrissionPage/session_page.py +++ b/DrissionPage/session_page.py @@ -48,7 +48,7 @@ class SessionPage(BasePage): self._set_options() def _set_session(self, opt): - """根据传入字典对session进行设置 \n + """根据传入字典对session进行设置 :param opt: session配置字典 :return: None """ @@ -90,7 +90,7 @@ class SessionPage(BasePage): self.session.cookies.set(cookie['name'], cookie['value'], **kwargs) def set_headers(self, headers): - """设置通用的headers,设置的headers值回逐个覆盖原有的,不会清理原来的 \n + """设置通用的headers,设置的headers值回逐个覆盖原有的,不会清理原来的 :param headers: dict形式的headers :return: None """ @@ -99,8 +99,8 @@ class SessionPage(BasePage): self.session.headers[i] = headers[i] def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele2 = ele1('@id=ele_id') \n + """在内部查找元素 + 例:ele2 = ele1('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 不起实际作用,用于和DriverElement对应,便于无差别调用 :return: SessionElement对象或属性文本 @@ -137,7 +137,7 @@ class SessionPage(BasePage): return DownloadSetter(self) def get(self, url, show_errmsg=False, retry=None, interval=None, timeout=None, **kwargs): - """用get方式跳转到url \n + """用get方式跳转到url :param url: 目标url :param show_errmsg: 是否显示和抛出异常 :param retry: 重试次数 @@ -149,7 +149,7 @@ class SessionPage(BasePage): return self._s_connect(url, 'get', None, show_errmsg, retry, interval, **kwargs) def ele(self, loc_or_ele, timeout=None): - """返回页面中符合条件的第一个元素、属性或节点文本 \n + """返回页面中符合条件的第一个元素、属性或节点文本 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :param timeout: 不起实际作用,用于和DriverElement对应,便于无差别调用 :return: SessionElement对象或属性、文本 @@ -157,7 +157,7 @@ class SessionPage(BasePage): return self._ele(loc_or_ele) def eles(self, loc_or_str, timeout=None): - """返回页面中所有符合条件的元素、属性或节点文本 \n + """返回页面中所有符合条件的元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 不起实际作用,用于和DriverElement对应,便于无差别调用 :return: SessionElement对象或属性、文本组成的列表 @@ -165,21 +165,21 @@ class SessionPage(BasePage): return self._ele(loc_or_str, single=False) def s_ele(self, loc_or_ele=None): - """返回页面中符合条件的第一个元素、属性或节点文本 \n + """返回页面中符合条件的第一个元素、属性或节点文本 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ return make_session_ele(self.html) if loc_or_ele is None else self._ele(loc_or_ele) def s_eles(self, loc_or_str): - """返回页面中符合条件的所有元素、属性或节点文本 \n + """返回页面中符合条件的所有元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ return self._ele(loc_or_str, single=False) def _ele(self, loc_or_ele, timeout=None, single=True): - """返回页面中符合条件的元素、属性或节点文本,默认返回第一个 \n + """返回页面中符合条件的元素、属性或节点文本,默认返回第一个 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :param timeout: 不起实际作用,用于和父类对应 :param single: True则返回第一个,False则返回全部 @@ -188,7 +188,7 @@ class SessionPage(BasePage): return loc_or_ele if isinstance(loc_or_ele, SessionElement) else make_session_ele(self, loc_or_ele, single) def get_cookies(self, as_dict=False, all_domains=False): - """返回cookies \n + """返回cookies :param as_dict: 是否以字典方式返回 :param all_domains: 是否返回所有域的cookies :return: cookies信息 @@ -227,7 +227,7 @@ class SessionPage(BasePage): return self._download_kit def post(self, url, data=None, show_errmsg=False, retry=None, interval=None, **kwargs): - """用post方式跳转到url \n + """用post方式跳转到url :param url: 目标url :param data: 提交的数据 :param show_errmsg: 是否显示和抛出异常 @@ -239,7 +239,7 @@ class SessionPage(BasePage): return self._s_connect(url, 'post', data, show_errmsg, retry, interval, **kwargs) def _s_connect(self, url, mode, data=None, show_errmsg=False, retry=None, interval=None, **kwargs): - """执行get或post连接 \n + """执行get或post连接 :param url: 目标url :param mode: 'get' 或 'post' :param data: 提交的数据 @@ -267,7 +267,7 @@ class SessionPage(BasePage): return self._url_available def _make_response(self, url, mode='get', data=None, retry=None, interval=None, show_errmsg=False, **kwargs): - """生成Response对象 \n + """生成Response对象 :param url: 目标url :param mode: 'get' 或 'post' :param data: post方式要提交的数据 @@ -341,7 +341,7 @@ class DownloadSetter(object): self._page = page def save_path(self, path): - """设置下载保存路径 \n + """设置下载保存路径 :param path: 下载保存路径 :return: None """ diff --git a/DrissionPage/shadow_root_element.py b/DrissionPage/shadow_root_element.py index ed3c29e..9e750e1 100644 --- a/DrissionPage/shadow_root_element.py +++ b/DrissionPage/shadow_root_element.py @@ -30,8 +30,8 @@ class ShadowRootElement(BaseElement): return f'' def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele2 = ele1('@id=ele_id') \n + """在内部查找元素 + 例:ele2 = ele1('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 超时时间 :return: DriverElement对象或属性、文本 @@ -54,7 +54,7 @@ class ShadowRootElement(BaseElement): return shadow_root.get_attribute('innerHTML') def parent(self, level_or_loc=1): - """返回上面某一级父元素,可指定层数或用查询语法定位 \n + """返回上面某一级父元素,可指定层数或用查询语法定位 :param level_or_loc: 第几级父元素,或定位符 :return: DriverElement对象 """ @@ -75,7 +75,7 @@ class ShadowRootElement(BaseElement): return self.parent_ele.ele(loc, timeout=0) def next(self, index=1, filter_loc=''): - """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :return: DriverElement对象 @@ -84,7 +84,7 @@ class ShadowRootElement(BaseElement): return nodes[index - 1] if nodes else None def before(self, index=1, filter_loc=''): - """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 前面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :return: 本元素前面的某个元素或节点 @@ -93,7 +93,7 @@ class ShadowRootElement(BaseElement): return nodes[index - 1] if nodes else None def after(self, index=1, filter_loc=''): - """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n + """返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 :param index: 后面第几个查询结果元素 :param filter_loc: 用于筛选元素的查询语法 :return: 本元素后面的某个元素或节点 @@ -102,7 +102,7 @@ class ShadowRootElement(BaseElement): return nodes[index - 1] if nodes else None def nexts(self, filter_loc=''): - """返回后面所有兄弟元素或节点组成的列表 \n + """返回后面所有兄弟元素或节点组成的列表 :param filter_loc: 用于筛选元素的查询语法 :return: DriverElement对象组成的列表 """ @@ -115,7 +115,7 @@ class ShadowRootElement(BaseElement): return self.parent_ele.eles(xpath, timeout=0.1) def befores(self, filter_loc=''): - """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :return: 本元素前面的元素或节点组成的列表 """ @@ -128,7 +128,7 @@ class ShadowRootElement(BaseElement): return self.parent_ele.eles(xpath, timeout=0.1) def afters(self, filter_loc=''): - """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n + """返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 :param filter_loc: 用于筛选元素的查询语法 :return: 本元素后面的元素或节点组成的列表 """ @@ -138,7 +138,7 @@ class ShadowRootElement(BaseElement): return eles1 + self.parent_ele.eles(xpath, timeout=0.1) def ele(self, loc_or_str, timeout=None): - """返回当前元素下级符合条件的第一个元素,默认返回 \n + """返回当前元素下级符合条件的第一个元素,默认返回 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与元素所在页面等待时间一致 :return: DriverElement对象或属性、文本 @@ -146,7 +146,7 @@ class ShadowRootElement(BaseElement): return self._ele(loc_or_str, timeout) def eles(self, loc_or_str, timeout=None): - """返回当前元素下级所有符合条件的子元素 \n + """返回当前元素下级所有符合条件的子元素 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与元素所在页面等待时间一致 :return: DriverElement对象或属性、文本组成的列表 @@ -154,21 +154,21 @@ class ShadowRootElement(BaseElement): return self._ele(loc_or_str, timeout=timeout, single=False) def s_ele(self, loc_or_str=None) -> Union[SessionElement, str, None]: - """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 \n + """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ return make_session_ele(self, loc_or_str) def s_eles(self, loc_or_str): - """查找所有符合条件的元素以SessionElement列表形式返回,处理复杂页面时效率很高 \n + """查找所有符合条件的元素以SessionElement列表形式返回,处理复杂页面时效率很高 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ return make_session_ele(self, loc_or_str, single=False) def _ele(self, loc_or_str, timeout=None, single=True, relative=False): - """返回当前元素下级符合条件的子元素,默认返回第一个 \n + """返回当前元素下级符合条件的子元素,默认返回第一个 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间 :param single: True则返回第一个,False则返回全部 @@ -197,7 +197,7 @@ class ShadowRootElement(BaseElement): return [make_driver_ele(self, f'css:{css}', True, timeout) for css in css_paths] def run_script(self, script, *args): - """执行js代码,传入自己为第一个参数 \n + """执行js代码,传入自己为第一个参数 :param script: js文本 :param args: 传入的参数 :return: js执行结果 diff --git a/DrissionPage/web_page.py b/DrissionPage/web_page.py index dd9e3a7..81a8c15 100644 --- a/DrissionPage/web_page.py +++ b/DrissionPage/web_page.py @@ -24,7 +24,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): """整合浏览器和request的页面类""" def __init__(self, mode='d', timeout=None, tab_id=None, driver_or_options=None, session_or_options=None): - """初始化函数 \n + """初始化函数 :param mode: 'd' 或 's',即driver模式和session模式 :param tab_id: 要控制的标签页id,不指定默认为激活的 :param timeout: 超时时间,d模式时为寻找元素时间,s模式时为连接时间,默认10秒 @@ -121,8 +121,8 @@ class WebPage(SessionPage, ChromiumPage, BasePage): pass def __call__(self, loc_or_str, timeout=None): - """在内部查找元素 \n - 例:ele = page('@id=ele_id') \n + """在内部查找元素 + 例:ele = page('@id=ele_id') :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 超时时间 :return: 子元素对象 @@ -219,7 +219,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): @timeout.setter def timeout(self, second): - """设置通用超时时间 \n + """设置通用超时时间 :param second: 秒数 :return: None """ @@ -238,7 +238,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return self._download_set def get(self, url, show_errmsg=False, retry=None, interval=None, timeout=None, **kwargs): - """跳转到一个url \n + """跳转到一个url :param url: 目标url :param show_errmsg: 是否显示和抛出异常 :param retry: 重试次数 @@ -255,7 +255,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return super().get(url, show_errmsg, retry, interval, timeout, **kwargs) def ele(self, loc_or_ele, timeout=None): - """返回第一个符合条件的元素、属性或节点文本 \n + """返回第一个符合条件的元素、属性或节点文本 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与页面等待时间一致 :return: 元素对象或属性、文本节点文本 @@ -266,7 +266,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return super(SessionPage, self).ele(loc_or_ele, timeout=timeout) def eles(self, loc_or_str, timeout=None): - """返回页面中所有符合条件的元素、属性或节点文本 \n + """返回页面中所有符合条件的元素、属性或节点文本 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :param timeout: 查找元素超时时间,默认与页面等待时间一致 :return: 元素对象或属性、文本组成的列表 @@ -277,7 +277,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return super(SessionPage, self).eles(loc_or_str, timeout=timeout) def s_ele(self, loc_or_ele=None): - """查找第一个符合条件的元素以SessionElement形式返回,d模式处理复杂页面时效率很高 \n + """查找第一个符合条件的元素以SessionElement形式返回,d模式处理复杂页面时效率很高 :param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本 """ @@ -287,7 +287,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return super(SessionPage, self).s_ele(loc_or_ele) def s_eles(self, loc_or_str): - """查找所有符合条件的元素以SessionElement形式返回,d模式处理复杂页面时效率很高 \n + """查找所有符合条件的元素以SessionElement形式返回,d模式处理复杂页面时效率很高 :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串 :return: SessionElement对象或属性、文本组成的列表 """ @@ -297,9 +297,9 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return super(SessionPage, self).s_eles(loc_or_str) def change_mode(self, mode=None, go=True, copy_cookies=True): - """切换模式,接收's'或'd',除此以外的字符串会切换为 d 模式 \n - 如copy_cookies为True,切换时会把当前模式的cookies复制到目标模式 \n - 切换后,如果go是True,调用相应的get函数使访问的页面同步 \n + """切换模式,接收's'或'd',除此以外的字符串会切换为 d 模式 + 如copy_cookies为True,切换时会把当前模式的cookies复制到目标模式 + 切换后,如果go是True,调用相应的get函数使访问的页面同步 :param mode: 模式字符串 :param go: 是否跳转到原模式的url :param copy_cookies: 是否复制cookies到目标模式 @@ -339,7 +339,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): self.get(url) def cookies_to_session(self, copy_user_agent=True): - """把driver对象的cookies复制到session对象 \n + """把driver对象的cookies复制到session对象 :param copy_user_agent: 是否复制ua信息 :return: None """ @@ -363,7 +363,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): self.set_cookies(cookies, set_driver=True) def get_cookies(self, as_dict=False, all_domains=False): - """返回cookies \n + """返回cookies :param as_dict: 是否以字典方式返回 :param all_domains: 是否返回所有域的cookies :return: cookies信息 @@ -374,7 +374,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return self._get_driver_cookies(as_dict) def _get_driver_cookies(self, as_dict=False): - """获取浏览器cookies \n + """获取浏览器cookies :param as_dict: 以dict形式返回 :return: cookies信息 """ @@ -385,7 +385,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return cookies def set_cookies(self, cookies, set_session=False, set_driver=False): - """添加cookies信息到浏览器或session对象 \n + """添加cookies信息到浏览器或session对象 :param cookies: 可以接收`CookieJar`、`list`、`tuple`、`str`、`dict`格式的`cookies` :param set_session: 是否设置到Session对象 :param set_driver: 是否设置到浏览器 @@ -409,7 +409,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): super().set_cookies(cookies) def set_headers(self, headers: dict) -> None: - """设置固定发送的headers \n + """设置固定发送的headers :param headers: dict格式的headers数据 :return: None """ @@ -439,7 +439,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): # ----------------重写SessionPage的函数----------------------- def post(self, url: str, data=None, show_errmsg=False, retry=None, interval=None, **kwargs): - """用post方式跳转到url,会切换到s模式 \n + """用post方式跳转到url,会切换到s模式 :param url: 目标url :param data: post方式时提交的数据 :param show_errmsg: 是否显示和抛出异常 @@ -459,7 +459,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): return super().download def _ele(self, loc_or_ele, timeout=None, single=True, relative=False): - """返回页面中符合条件的元素、属性或节点文本,默认返回第一个 \n + """返回页面中符合条件的元素、属性或节点文本,默认返回第一个 :param loc_or_ele: 元素的定位信息,可以是元素对象,loc元组,或查询字符串 :param timeout: 查找元素超时时间,d模式专用 :param single: True则返回第一个,False则返回全部