mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
修改ChromiumFrame,未完成
This commit is contained in:
parent
4a0b2a7a92
commit
0e0e34868e
@ -12,6 +12,7 @@ from .common import get_loc
|
||||
from .config import cookies_to_tuple
|
||||
from .session_element import make_session_ele
|
||||
from .tab import Tab
|
||||
from .chromium_frame import ChromiumFrame
|
||||
|
||||
|
||||
class ChromiumBase(BasePage):
|
||||
@ -632,7 +633,7 @@ class ChromiumBase(BasePage):
|
||||
return True
|
||||
|
||||
|
||||
class ChromiumFrame(ChromiumBase):
|
||||
class Chromiu1mFrame(ChromiumBase):
|
||||
"""实现浏览器frame的类"""
|
||||
|
||||
def __init__(self, page, ele):
|
||||
|
@ -15,6 +15,7 @@ from .base import DrissionElement, BaseElement
|
||||
from .common import make_absolute_link, get_loc, get_ele_txt, format_html, is_js_func, _location_in_viewport
|
||||
from .keys import _keys_to_typing, _keyDescriptionForString, _keyDefinitions
|
||||
from .session_element import make_session_ele
|
||||
from .chromium_frame import ChromiumFrame
|
||||
|
||||
|
||||
class ChromiumElement(DrissionElement):
|
||||
@ -1184,7 +1185,7 @@ def _make_chromium_ele(page, node_id=None, obj_id=None):
|
||||
netloc1 = urlparse(src).netloc
|
||||
netloc2 = urlparse(page.url).netloc
|
||||
if netloc1 != netloc2:
|
||||
from .chromium_base import ChromiumFrame
|
||||
# from .chromium_base import ChromiumFrame
|
||||
ele = ChromiumFrame(page, ele)
|
||||
|
||||
return ele
|
||||
@ -1243,6 +1244,7 @@ def run_script(page_or_ele, script, as_expr=False, timeout=None, args=None):
|
||||
if isinstance(page_or_ele, (ChromiumElement, ChromiumShadowRootElement)):
|
||||
page = page_or_ele.page
|
||||
obj_id = page_or_ele.obj_id
|
||||
# todo:
|
||||
# elif isinstance(page_or_ele, ChromiumFrame):
|
||||
# pass
|
||||
else:
|
||||
@ -1270,7 +1272,7 @@ def run_script(page_or_ele, script, as_expr=False, timeout=None, args=None):
|
||||
|
||||
exceptionDetails = res.get('exceptionDetails')
|
||||
if exceptionDetails:
|
||||
raise RuntimeError(f'Evaluation failed: {exceptionDetails}')
|
||||
raise RuntimeError(f'javascript错误: {exceptionDetails}')
|
||||
|
||||
try:
|
||||
return _parse_js_result(page, page_or_ele, res.get('result'))
|
||||
|
@ -1,6 +1,5 @@
|
||||
# -*- coding:utf-8 -*-
|
||||
from re import search
|
||||
from typing import Union, Tuple, List
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from .chromium_element import ChromiumElement
|
||||
@ -8,7 +7,15 @@ from .chromium_base import ChromiumBase
|
||||
|
||||
|
||||
class ChromiumFrame(object):
|
||||
def __init__(self, page: ChromiumBase, ele: ChromiumElement):
|
||||
"""frame元素的类。
|
||||
frame既是元素,也是页面,可以获取元素属性和定位周边元素,也能跳转到网址。
|
||||
同域和异域的frame处理方式不一样,同域的当作元素看待,异域的当作页面看待。"""
|
||||
|
||||
def __init__(self, page, ele):
|
||||
"""
|
||||
:param page: frame所在页面对象
|
||||
:param ele: frame容器元素对象
|
||||
"""
|
||||
self.page = page
|
||||
self._inner_ele = ele
|
||||
self._is_diff_domain = False
|
||||
@ -22,18 +29,18 @@ class ChromiumFrame(object):
|
||||
self.inner_page.set_page_load_strategy(self.page.page_load_strategy)
|
||||
self.inner_page.timeouts = self.page.timeouts
|
||||
|
||||
def __repr__(self) -> str:
|
||||
def __repr__(self):
|
||||
attrs = self._inner_ele.attrs
|
||||
attrs = [f"{attr}='{attrs[attr]}'" for attr in attrs]
|
||||
return f'<ChromiumFrame {self._inner_ele.tag} {" ".join(attrs)}>'
|
||||
|
||||
@property
|
||||
def tag(self) -> str:
|
||||
def tag(self):
|
||||
"""返回元素tag"""
|
||||
return self._inner_ele.tag
|
||||
|
||||
@property
|
||||
def url(self) -> str:
|
||||
def url(self):
|
||||
""""""
|
||||
if self._is_diff_domain:
|
||||
return self.inner_page.url
|
||||
@ -42,7 +49,7 @@ class ChromiumFrame(object):
|
||||
return r['node']['contentDocument']['documentURL']
|
||||
|
||||
@property
|
||||
def html(self) -> str:
|
||||
def html(self):
|
||||
"""返回元素outerHTML文本"""
|
||||
if self._is_diff_domain:
|
||||
tag = self.tag
|
||||
@ -55,7 +62,7 @@ class ChromiumFrame(object):
|
||||
return self._inner_ele.html
|
||||
|
||||
@property
|
||||
def title(self) -> str:
|
||||
def title(self):
|
||||
d = self.inner_page if self._is_diff_domain else self._inner_ele
|
||||
ele = d.ele('xpath://title')
|
||||
return ele.text if ele else None
|
||||
@ -65,16 +72,16 @@ class ChromiumFrame(object):
|
||||
return self.inner_page.cookies if self._is_diff_domain else self.page.cookies
|
||||
|
||||
@property
|
||||
def inner_html(self) -> str:
|
||||
def inner_html(self):
|
||||
"""返回元素innerHTML文本"""
|
||||
return self.inner_page.html if self._is_diff_domain else self._inner_ele.inner_html
|
||||
|
||||
@property
|
||||
def attrs(self) -> dict:
|
||||
def attrs(self):
|
||||
return self._inner_ele.attrs
|
||||
|
||||
@property
|
||||
def frame_size(self) -> dict:
|
||||
def frame_size(self):
|
||||
if self._is_diff_domain:
|
||||
return self.inner_page.size
|
||||
else:
|
||||
@ -83,71 +90,66 @@ class ChromiumFrame(object):
|
||||
return {'height': h, 'width': w}
|
||||
|
||||
@property
|
||||
def size(self) -> dict:
|
||||
def size(self):
|
||||
"""返回frame元素大小"""
|
||||
return self._inner_ele.size
|
||||
|
||||
@property
|
||||
def obj_id(self) -> str:
|
||||
def obj_id(self):
|
||||
"""返回js中的object id"""
|
||||
return self._inner_ele.obj_id
|
||||
|
||||
@property
|
||||
def node_id(self) -> str:
|
||||
def node_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
return self._inner_ele.node_id
|
||||
|
||||
@property
|
||||
def location(self) -> dict:
|
||||
def location(self):
|
||||
"""返回frame元素左上角的绝对坐标"""
|
||||
return self._inner_ele.location
|
||||
|
||||
@property
|
||||
def is_displayed(self) -> bool:
|
||||
def is_displayed(self):
|
||||
"""返回frame元素是否显示"""
|
||||
return self._inner_ele.is_displayed
|
||||
|
||||
def get(self, url):
|
||||
self.page._get(url, False, None, None, None, self.frame_id)
|
||||
|
||||
def ele(self,
|
||||
loc_or_ele: Union[Tuple[str, str], str, ChromiumElement, 'ChromiumFrame'],
|
||||
timeout: float = None):
|
||||
def ele(self, loc_or_ele, timeout=None):
|
||||
d = self.inner_page if self._is_diff_domain else self._inner_ele
|
||||
return d.ele(loc_or_ele, timeout)
|
||||
|
||||
def eles(self,
|
||||
loc_or_ele: Union[Tuple[str, str], str],
|
||||
timeout: float = None):
|
||||
def eles(self, loc_or_ele, timeout=None):
|
||||
d = self.inner_page if self._is_diff_domain else self._inner_ele
|
||||
return d.eles(loc_or_ele, timeout)
|
||||
|
||||
# def s_ele(self, loc_or_ele: Union[Tuple[str, str], str, ChromiumElement] = None) \
|
||||
# -> Union[SessionElement, str, None]:
|
||||
# """查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 \n
|
||||
# :param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串
|
||||
# :return: SessionElement对象或属性、文本
|
||||
# """
|
||||
# if isinstance(loc_or_ele, ChromiumElement):
|
||||
# return make_session_ele(loc_or_ele)
|
||||
# else:
|
||||
# return make_session_ele(self, loc_or_ele)
|
||||
#
|
||||
# def s_eles(self, loc_or_str: Union[Tuple[str, str], str] = None) -> List[Union[SessionElement, str]]:
|
||||
# """查找所有符合条件的元素以SessionElement列表形式返回 \n
|
||||
# :param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串
|
||||
# :return: SessionElement对象组成的列表
|
||||
# """
|
||||
# return make_session_ele(self, loc_or_str, single=False)
|
||||
def s_ele(self, loc_or_ele=None):
|
||||
"""查找第一个符合条件的元素以SessionElement形式返回,处理复杂页面时效率很高 \n
|
||||
:param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串
|
||||
:return: SessionElement对象或属性、文本
|
||||
"""
|
||||
if isinstance(loc_or_ele, ChromiumElement):
|
||||
return make_session_ele(loc_or_ele)
|
||||
else:
|
||||
return make_session_ele(self, loc_or_ele)
|
||||
|
||||
def attr(self, attr: str) -> Union[str, None]:
|
||||
def s_eles(self, loc_or_str=None):
|
||||
"""查找所有符合条件的元素以SessionElement列表形式返回 \n
|
||||
:param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串
|
||||
:return: SessionElement对象组成的列表
|
||||
"""
|
||||
return make_session_ele(self, loc_or_str, single=False)
|
||||
|
||||
def attr(self, attr):
|
||||
"""返回frame元素attribute属性值 \n
|
||||
:param attr: 属性名
|
||||
:return: 属性值文本,没有该属性返回None
|
||||
"""
|
||||
return self._inner_ele.attr(attr)
|
||||
|
||||
def set_attr(self, attr: str, value: str) -> None:
|
||||
def set_attr(self, attr, value):
|
||||
"""设置frame元素attribute属性 \n
|
||||
:param attr: 属性名
|
||||
:param value: 属性值
|
||||
@ -155,24 +157,21 @@ class ChromiumFrame(object):
|
||||
"""
|
||||
self._inner_ele.set_attr(attr, value)
|
||||
|
||||
def remove_attr(self, attr: str) -> None:
|
||||
def remove_attr(self, attr):
|
||||
"""删除frame元素attribute属性 \n
|
||||
:param attr: 属性名
|
||||
:return: None
|
||||
"""
|
||||
self._inner_ele.remove_attr(attr)
|
||||
|
||||
def parent(self, level_or_loc: Union[tuple, str, int] = 1) -> Union['ChromiumElement', None]:
|
||||
def parent(self, level_or_loc=1):
|
||||
"""返回上面某一级父元素,可指定层数或用查询语法定位 \n
|
||||
:param level_or_loc: 第几级父元素,或定位符
|
||||
:return: 上级元素对象
|
||||
"""
|
||||
return self._inner_ele.parent(level_or_loc)
|
||||
|
||||
def prev(self,
|
||||
filter_loc: Union[tuple, str] = '',
|
||||
index: int = 1,
|
||||
timeout: float = 0) -> Union['ChromiumElement', str, None]:
|
||||
def prev(self, filter_loc='', index=1, timeout=0):
|
||||
"""返回前面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n
|
||||
:param filter_loc: 用于筛选元素的查询语法
|
||||
:param index: 前面第几个查询结果元素
|
||||
@ -181,10 +180,7 @@ class ChromiumFrame(object):
|
||||
"""
|
||||
return self._inner_ele.prev(filter_loc, index, timeout)
|
||||
|
||||
def next(self,
|
||||
filter_loc: Union[tuple, str] = '',
|
||||
index: int = 1,
|
||||
timeout: float = 0) -> Union['ChromiumElement', str, None]:
|
||||
def next(self, filter_loc='', index=1, timeout=0):
|
||||
"""返回后面的一个兄弟元素,可用查询语法筛选,可指定返回筛选结果的第几个 \n
|
||||
:param filter_loc: 用于筛选元素的查询语法
|
||||
:param index: 后面第几个查询结果元素
|
||||
@ -193,10 +189,7 @@ class ChromiumFrame(object):
|
||||
"""
|
||||
return self._inner_ele.next(filter_loc, index, timeout)
|
||||
|
||||
def before(self,
|
||||
filter_loc: Union[tuple, str] = '',
|
||||
index: int = 1,
|
||||
timeout: float = None) -> Union['ChromiumElement', str, None]:
|
||||
def before(self, filter_loc='', index=1, timeout=None):
|
||||
"""返回当前元素前面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元素,而是整个DOM文档 \n
|
||||
:param filter_loc: 用于筛选元素的查询语法
|
||||
:param index: 前面第几个查询结果元素
|
||||
@ -205,10 +198,7 @@ class ChromiumFrame(object):
|
||||
"""
|
||||
return self._inner_ele.before(filter_loc, index, timeout)
|
||||
|
||||
def after(self,
|
||||
filter_loc: Union[tuple, str] = '',
|
||||
index: int = 1,
|
||||
timeout: float = None) -> Union['ChromiumElement', str, None]:
|
||||
def after(self, filter_loc='', index=1, timeout=None):
|
||||
"""返回当前元素后面的一个元素,可指定筛选条件和第几个。查找范围不限兄弟元素,而是整个DOM文档 \n
|
||||
:param filter_loc: 用于筛选元素的查询语法
|
||||
:param index: 后面第几个查询结果元素
|
||||
@ -217,9 +207,7 @@ class ChromiumFrame(object):
|
||||
"""
|
||||
return self._inner_ele.after(filter_loc, index, timeout)
|
||||
|
||||
def prevs(self,
|
||||
filter_loc: Union[tuple, str] = '',
|
||||
timeout: float = 0) -> List[Union['ChromiumElement', str]]:
|
||||
def prevs(self, filter_loc='', timeout=0):
|
||||
"""返回前面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n
|
||||
:param filter_loc: 用于筛选元素的查询语法
|
||||
:param timeout: 查找元素的超时时间
|
||||
@ -227,9 +215,7 @@ class ChromiumFrame(object):
|
||||
"""
|
||||
return self._inner_ele.prevs(filter_loc, timeout)
|
||||
|
||||
def nexts(self,
|
||||
filter_loc: Union[tuple, str] = '',
|
||||
timeout: float = 0) -> List[Union['ChromiumElement', str]]:
|
||||
def nexts(self, filter_loc='', timeout=0):
|
||||
"""返回后面全部兄弟元素或节点组成的列表,可用查询语法筛选 \n
|
||||
:param filter_loc: 用于筛选元素的查询语法
|
||||
:param timeout: 查找元素的超时时间
|
||||
@ -237,9 +223,7 @@ class ChromiumFrame(object):
|
||||
"""
|
||||
return self._inner_ele.nexts(filter_loc, timeout)
|
||||
|
||||
def befores(self,
|
||||
filter_loc: Union[tuple, str] = '',
|
||||
timeout: float = None) -> List[Union['ChromiumElement', str]]:
|
||||
def befores(self, filter_loc='', timeout=None):
|
||||
"""返回当前元素后面符合条件的全部兄弟元素或节点组成的列表,可用查询语法筛选。查找范围不限兄弟元素,而是整个DOM文档 \n
|
||||
:param filter_loc: 用于筛选元素的查询语法
|
||||
:param timeout: 查找元素的超时时间
|
||||
|
115
DrissionPage/chromium_frame.pyi
Normal file
115
DrissionPage/chromium_frame.pyi
Normal file
@ -0,0 +1,115 @@
|
||||
# -*- coding:utf-8 -*-
|
||||
from typing import Union, Tuple, List
|
||||
|
||||
from session_element import SessionElement
|
||||
from .chromium_element import ChromiumElement
|
||||
from .chromium_base import ChromiumBase
|
||||
|
||||
|
||||
class ChromiumFrame(object):
|
||||
"""frame元素的类。
|
||||
frame既是元素,也是页面,可以获取元素属性和定位周边元素,也能跳转到网址。
|
||||
同域和异域的frame处理方式不一样,同域的当作元素看待,异域的当作页面看待。"""
|
||||
|
||||
def __init__(self, page: ChromiumBase, ele: ChromiumElement):
|
||||
self.inner_page: ChromiumBase = ...
|
||||
self._inner_ele: ChromiumElement = ...
|
||||
self.page: ChromiumBase = ...
|
||||
self.frame_id: str = ...
|
||||
self._is_diff_domain: bool = ...
|
||||
|
||||
def __repr__(self) -> str: ...
|
||||
|
||||
@property
|
||||
def tag(self) -> str: ...
|
||||
|
||||
@property
|
||||
def url(self) -> str: ...
|
||||
|
||||
@property
|
||||
def html(self) -> str: ...
|
||||
|
||||
@property
|
||||
def title(self) -> str: ...
|
||||
|
||||
@property
|
||||
def cookies(self) -> dict: ...
|
||||
|
||||
@property
|
||||
def inner_html(self) -> str: ...
|
||||
|
||||
@property
|
||||
def attrs(self) -> dict: ...
|
||||
|
||||
@property
|
||||
def frame_size(self) -> dict: ...
|
||||
|
||||
@property
|
||||
def size(self) -> dict: ...
|
||||
|
||||
@property
|
||||
def obj_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def node_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def location(self) -> dict: ...
|
||||
|
||||
@property
|
||||
def is_displayed(self) -> bool: ...
|
||||
|
||||
def get(self, url) -> bool: ...
|
||||
|
||||
def ele(self,
|
||||
loc_or_ele: Union[Tuple[str, str], str, ChromiumElement, 'ChromiumFrame'],
|
||||
timeout: float = ...): ...
|
||||
|
||||
def eles(self,
|
||||
loc_or_ele: Union[Tuple[str, str], str],
|
||||
timeout: float = ...): ...
|
||||
|
||||
def s_ele(self, loc_or_ele: Union[Tuple[str, str], str, ChromiumElement] = ...) -> Union[
|
||||
SessionElement, str, None]: ...
|
||||
|
||||
def s_eles(self, loc_or_str: Union[Tuple[str, str], str] = ...) -> List[Union[SessionElement, str]]: ...
|
||||
|
||||
def attr(self, attr: str) -> Union[str, None]: ...
|
||||
|
||||
def set_attr(self, attr: str, value: str) -> None: ...
|
||||
|
||||
def remove_attr(self, attr: str) -> None: ...
|
||||
|
||||
def parent(self, level_or_loc: Union[tuple, str, int] = ...) -> Union[ChromiumElement, None]: ...
|
||||
|
||||
def prev(self,
|
||||
filter_loc: Union[tuple, str] = ...,
|
||||
index: int = ...,
|
||||
timeout: float = ...) -> Union[ChromiumElement, str, None]: ...
|
||||
|
||||
def next(self,
|
||||
filter_loc: Union[tuple, str] = ...,
|
||||
index: int = ...,
|
||||
timeout: float = ...) -> Union[ChromiumElement, str, None]: ...
|
||||
|
||||
def before(self,
|
||||
filter_loc: Union[tuple, str] = ...,
|
||||
index: int = ...,
|
||||
timeout: float = ...) -> Union[ChromiumElement, str, None]: ...
|
||||
|
||||
def after(self,
|
||||
filter_loc: Union[tuple, str] = ...,
|
||||
index: int = ...,
|
||||
timeout: float = ...) -> Union[ChromiumElement, str, None]: ...
|
||||
|
||||
def prevs(self,
|
||||
filter_loc: Union[tuple, str] = ...,
|
||||
timeout: float = ...) -> List[Union[ChromiumElement, str]]: ...
|
||||
|
||||
def nexts(self,
|
||||
filter_loc: Union[tuple, str] = ...,
|
||||
timeout: float = ...) -> List[Union[ChromiumElement, str]]: ...
|
||||
|
||||
def befores(self,
|
||||
filter_loc: Union[tuple, str] = ...,
|
||||
timeout: float = ...) -> List[Union[ChromiumElement, str]]: ...
|
@ -1,7 +1,7 @@
|
||||
本节讲解 DrissionPage 的一些基本概念。了解它大概的构成和运作原理。
|
||||
默认读者对网络协议、html、网页自动化、requests 等有基本认识。
|
||||
|
||||
# 网页自动化
|
||||
# ✔️ 网页自动化
|
||||
|
||||
网页自动化的形式通常有两种,它们各有优劣:
|
||||
|
||||
@ -17,24 +17,24 @@
|
||||
在旧版本,本库是通过对 selenium 和 requests 的重新封装实现的。
|
||||
从 3.0 版开始,作者另起炉灶,用 chromium 协议自行实现了 selenium 全部功能,从而摆脱了对 selenium 的依赖,功能更多更强,运行效率更高,开发更灵活。
|
||||
|
||||
# 工作模式
|
||||
# ✔️ 工作模式
|
||||
|
||||
如上所述,DrissionPage 既可控制浏览器,也可用数据包方式访问网络数据。它有两种工作方式:d 模式和 s 模式。
|
||||
页面对象可以在这两种模式间切换,两种模式拥有一致的使用方法,但任一时间只能处于其中一种模式。
|
||||
|
||||
## d 模式
|
||||
## 📍 d 模式
|
||||
|
||||
d 模式既表示 Driver,还有 Dynamic 的意思。
|
||||
d 模式用于控制浏览器,不仅可以读取浏览器获取到的信息,还能对页面进行操作,如点击、填写、开关标签页、改变元素属性、执行 js 脚本等等。
|
||||
d 模式功能强大,但运行速度受浏览器制约非常缓慢,而且需要占用大量内存。
|
||||
|
||||
## s 模式
|
||||
## 📍 s 模式
|
||||
|
||||
s 模式既表示 Session,还有 speed、silence 的意思。
|
||||
s 模式的运行速度比 d 模式快几个数量级,但只能基于数据包进行读取或发送,不能对页面进行操作,不能运行 js。
|
||||
爬取数据时,如网站数据包较为简单,应首选 s 模式。
|
||||
|
||||
## 模式切换
|
||||
## 📍 模式切换
|
||||
|
||||
页面对象可以在 d 模式和 s 模式之间切换,这通常用于以下情况:
|
||||
|
||||
@ -58,9 +58,9 @@ ele = ele.s_ele()
|
||||
rows = ele.eles('tag:tr')
|
||||
```
|
||||
|
||||
# 主要对象
|
||||
# ✔️ 主要对象
|
||||
|
||||
## WebPage
|
||||
## 📍 `WebPage`
|
||||
|
||||
是从 3.0 版开始推出的页面页面控制对象,整合了两种模式,d 模式所有页面的跳转、读取、操作、标签页控,s 模式发送和解析数据都由该对象进行。
|
||||
该对象是作者用 chromium devtools protocol 开发而成,不依赖 selenium 对浏览器进行控制。
|
||||
@ -78,7 +78,7 @@ page.ele('@value=百度一下').click()
|
||||
|
||||
详细使用方法见“创建页面对象”和“操作页面”章节。
|
||||
|
||||
## ChromiumElement
|
||||
## 📍 `ChromiumElement`
|
||||
|
||||
`ChromiumElemnet`对象是 `WebPage`在 d 模式所产生的页面元素对象,用于可对其进行点击、文本输入、拖拽、运行 js 脚本等操作,也可以基于这个元素查找其下级或周围的元素。
|
||||
|
||||
@ -97,7 +97,7 @@ links = ele1.eles('tag:a')
|
||||
|
||||
详细使用方法见“获取页面元素”、“获取元素信息”和“操作页面元素”章节。
|
||||
|
||||
## SessionElement
|
||||
## 📍 `SessionElement`
|
||||
|
||||
`SessionElement`对象是 s 模式所产生的页面元素对象,可以读取元素信息,或基于它进行下级元素查找、相对定位其它元素,但不能执行点击等操作。
|
||||
这种对象解析效率非常高,当 d 模式页面太复杂时,可把 d 模式的元素转换为`SessionElement`进行解析,提高速度。转换的同时可以执行下级元素的查找。
|
||||
@ -112,7 +112,7 @@ ele2 = ele1.ele('@name=name1')
|
||||
ele2 = d_ele.s_ele('@name=name1')
|
||||
```
|
||||
|
||||
## MixPage
|
||||
## 📍 `MixPage`
|
||||
|
||||
`MixPage`对象使用方法与`WebPage`大致相同,不同的是它控制浏览器方面的功能是通过封装 selenium 实现的。作者以后主要对`WebPage`进行更新,`MixPage`会一直维持当前状态。
|
||||
|
||||
@ -129,7 +129,7 @@ page.ele('@value=百度一下').click()
|
||||
|
||||
详细使用方法见“创建页面对象”和“操作页面”章节。
|
||||
|
||||
## DriverElement
|
||||
## 📍 `DriverElement`
|
||||
|
||||
`DriverElemnet`对象与`ChromiumElement`大致相同。区别是它是由`MiPage`所产生。
|
||||
|
||||
@ -148,7 +148,7 @@ links = ele1.eles('tag:a')
|
||||
|
||||
详细使用方法见“获取页面元素”、“获取元素信息”和“操作页面元素”章节。
|
||||
|
||||
## Drission
|
||||
## 📍 `Drission`
|
||||
|
||||
`Drission`对象用于管理`MixPage`中与网页通讯的`WebDriver`对象和`Session`对象,相当于驱动器的角色。能实现这两个对象间的登录状态传递等。但它提供的功能往往通过`MixPage`
|
||||
调用,所以出场几率并不高。
|
||||
@ -172,13 +172,13 @@ from DrissionPage import MixPage
|
||||
page = MixPage()
|
||||
```
|
||||
|
||||
# 结构图
|
||||
# ✔️ 结构图
|
||||
|
||||
## `WebPage`结构图
|
||||
## 📍 `WebPage`结构图
|
||||
|
||||
待更新。
|
||||
|
||||
## `MixPage`结构图
|
||||
## 📍 `MixPage`结构图
|
||||
|
||||
如图所示,`Drission`对象负责链接的创建、共享登录状态等工作,类似 selenium 中 driver 的概念。
|
||||
`MixPage`对象负责对获取到的页面进行解析、操作。
|
||||
@ -186,11 +186,51 @@ page = MixPage()
|
||||
|
||||

|
||||
|
||||
# 配置管理
|
||||
# ✔️ 配置管理
|
||||
|
||||
无论 requests 还是浏览器,都通常须要一些配置信息才能正常工作,如长长的`user_agent`、driver 路径、浏览器配置等。这些代码往往是繁琐而重复的,不利于代码的简洁。
|
||||
因此,DrissionPage 使用配置文件记录常用配置信息,程序会自动读取默认配置文件里的内容。所以,在示例中,通常看不见配置信息的代码。
|
||||
|
||||
这个功能支持用户保存不同的配置文件,按情况调研,也可以支持直接把配置写在代码里面,屏蔽读取配置文件。
|
||||
|
||||
?> **Tips:** <br>当须要打包程序时,必须把配置写到代码里,或打包后手动复制配置文件到运行路径,否则会报错。
|
||||
?> **Tips:** <br>当须要打包程序时,必须把配置写到代码里,或打包后手动复制配置文件到运行路径,否则会报错。
|
||||
|
||||
# ✔️ 定位符
|
||||
|
||||
定位符用于定位页面中的元素,是本库一大特色,能够用非常简明的方式来获取元素,简洁易用。可读性和易用性高于 xpath 等其它方式,并且兼容 xpath、css selector、selenium 定位符。
|
||||
|
||||
以下是一组对比:
|
||||
|
||||
定位文本包含`'abc'`的元素:
|
||||
|
||||
```python
|
||||
# DrissionPage
|
||||
ele = page('abc')
|
||||
|
||||
# selenium
|
||||
ele = driver.find_element(By.XPATH, '//*[contains(text(), "abc"]')
|
||||
```
|
||||
|
||||
定位 class 为`'abc'`的元素
|
||||
|
||||
```python
|
||||
# DrissionPage
|
||||
ele = page('.abc')
|
||||
|
||||
# selenium
|
||||
ele = driver.find_element(By.CLASS_NAME, 'abc')
|
||||
```
|
||||
|
||||
定位 ele 元素的兄弟元素
|
||||
|
||||
```python
|
||||
# DrissionPage
|
||||
ele1 = ele.next() # 获取后一个元素
|
||||
ele1 = ele.prev(index=2) # 获取前面第二个元素
|
||||
|
||||
# selenium
|
||||
ele1 = ele.find_element(By.XPATH, './/following-sibling::*') # 获取有i一个元素
|
||||
ele1 = ele.find_element(By.XPATH, './/preceding-sibling::*[2]') # 获取前面第二个元素
|
||||
```
|
||||
|
||||
显然,本库的定位语句更简洁易懂,还有很多灵活好用的方法,详见“使用方法”里“查找元素章节”。
|
Loading…
x
Reference in New Issue
Block a user