diff --git a/docs/MixPage使用方法/Drission对象.md b/docs/MixPage使用方法/Drission对象.md
index ff31f33..0674004 100644
--- a/docs/MixPage使用方法/Drission对象.md
+++ b/docs/MixPage使用方法/Drission对象.md
@@ -2,14 +2,14 @@
可直接读取 ini 文件配置信息创建,也可以在初始化时传入配置信息。
在“[使用方法->创建页面对象](创建页面对象.md)”章节已经涉及过`Drission`的用法,这里介绍属性和方法。
-# `Drission`类
+# ✔️ `Drission`类
-初始化参数:
+**初始化参数:**
-- driver_or_options:`WebDriver`对象或`DriverOptions`、`Options`类,传入`False`则创建空配置对象
-- session_or_options:`Session`对象或设置字典,传入`False`则创建空配置对象
-- ini_path:ini 文件路径
-- proxy:代理设置,`dict`类型。格式:{'http': '127.0.0.1:1080', 'https': '127.0.0.1:1080'}
+- `driver_or_options`:`WebDriver`对象或`DriverOptions`、`Options`类,传入`False`则创建空配置对象
+- `session_or_options`:`Session`对象或设置字典,传入`False`则创建空配置对象
+- `ini_path`:ini 文件路径
+- `proxy`:代理设置,`dict`类型。格式:{'http': '127.0.0.1:1080', 'https': '127.0.0.1:1080'}
前两个参数可直接接收`WebDriver`和`Session`对象,这时后面两个参数无效。
若接收配置对象,则按照配置创建`WebDriver`和`Session`对象。
@@ -35,117 +35,117 @@ do = DriverOptions()
drission = Drission(driver_options=do)
```
-## session
+## 📍 `session`
此属性返回该对象管理的`Session`对象。
-## driver
+## 📍 `driver`
此属性返回该对象管理的`WebDriver`对象。
-## driver_options
+## 📍 `driver_options`
此属性返回用于创建`WebDriver`对象的`DriverOptions`对象。
-## session_options
+## 📍 `session_options`
此属性以`dict`形式返回用于创建 Session 对象的配置参数。可传入`dict`或`SessionOptions`赋值。
-## proxy
+## 📍 `proxy`
此属性返回代理信息,`dict`形式。可传入`dict`赋值。格式:{'http': '127.0.0.1:1080', 'https': '127.0.0.1:1080'}
-## debugger_progress
+## 📍 `debugger_progress`
此属性返回浏览器进程(如有)。
-## kill_browser()
+## 📍 `kill_browser()`
此方法用于关闭浏览器进程。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## get_browser_progress_id()
+## 📍 `get_browser_progress_id()`
此方法用于获取浏览器进程 id。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## hide_browser()
+## 📍 `hide_browser()`
此方法用于隐藏浏览器进程窗口。
-参数:无
+**参数:** 无
-返回: `None`
+**返回:**`None`
-## show_browser()
+## 📍 `show_browser()`
此方法用于显示浏览器进程窗口。
-参数:无
+**参数:** 无
-返回: `None`
+**返回:**`None`
-## set_cookies()
+## 📍 `set_cookies()`
此方法用于设置`cookies`。可选择对某个对象设置。
-参数:
+**参数:**
-- cookies:`cookies`信息,可为`CookieJar`,`list`,`tuple`,`str`,`dict`
-- set_session:是否设置`Session`对象的`cookies`
-- set_driver:是否设置浏览器的`cookies`
+- `cookies`:`cookies`信息,可为`CookieJar`,`list`,`tuple`,`str`,`dict`
+- `set_session`:是否设置`Session`对象的`cookies`
+- `set_driver`:是否设置浏览器的`cookies`
-返回:None
+**返回:**`None`
-## cookies_to_session()
+## 📍 `cookies_to_session()`
此方法用于把`WebDriver`对象的`cookies`复制到`Session`对象。
-参数:
+**参数:**
-- copy_user_agent:是否复制 user agent 信息
+- `copy_user_agent`:是否复制 user agent 信息
-返回:None
+**返回:**`None`
-## cookies_to_driver()
+## 📍 `cookies_to_driver()`
此方法用于把`Session`对象的`cookies`复制到`WebDriver`对象。
复制`cookies`到浏览器必须指定域名。
-参数:
+**参数:**
-- url:作用域
+- `url`:作用域
-返回:`None`
+**返回:**`None`
-## close_driver()
+## 📍 `close_driver()`
此方法用于关闭`WebDriver`对象,可选择是否关闭浏览器进程。
-参数:
+**参数:**
-- kill:是否关闭浏览器进程
+- `kill`:是否关闭浏览器进程
-返回:None
+**返回:**`None`
-## close_session()
+## 📍 `close_session()`
此方法用于关闭`Session`对象。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## close()
+## 📍 `close()`
此方法用于关闭`Session`和`WebDriver`对象。
-参数:无
+**参数:** 无
-返回:`None`
\ No newline at end of file
+**返回:**`None`
\ No newline at end of file
diff --git a/docs/MixPage使用方法/DriverPage和SessionPage.md b/docs/MixPage使用方法/DriverPage和SessionPage.md
index 9221712..c581a7f 100644
--- a/docs/MixPage使用方法/DriverPage和SessionPage.md
+++ b/docs/MixPage使用方法/DriverPage和SessionPage.md
@@ -1,7 +1,7 @@
如果无须切换模式,可根据需要只使用 DriverPage 或 SessionPage。
分别对应 d 和 s 模式,用法和 MixPage 相似。
-# SessionPage
+# ✔️ SessionPage
```python
from DrissionPage.session_page import SessionPage
@@ -18,7 +18,7 @@ page.get('http://www.baidu.com')
print(page.ele('#su').text)
```
-# DriverPage
+# ✔️ DriverPage
```python
from DrissionPage.driver_page import DriverPage
@@ -34,4 +34,3 @@ page.get('http://www.baidu.com')
# 输出:百度一下
print(page.ele('#su').text)
```
-
diff --git a/docs/MixPage使用方法/cookies的使用.md b/docs/MixPage使用方法/cookies的使用.md
index 64d14d0..54ea8a9 100644
--- a/docs/MixPage使用方法/cookies的使用.md
+++ b/docs/MixPage使用方法/cookies的使用.md
@@ -14,7 +14,4 @@ page.get_cookies(all_domains=True)
page.set_cookies(cookies)
```
-?> **Tips:**
-d 模式设置`cookies`后要刷新页面才能看到效果。
-s 模式可在 ini 文件、`SessionOptions`、配置字典中设置`cookies`,在`MixPage`初始化时即可传入,d 模式只能用`set_cookies()`函数设置。
-
+?> **Tips:**
d 模式设置`cookies`后要刷新页面才能看到效果。
s 模式可在 ini 文件、`SessionOptions`、配置字典中设置`cookies`,在`MixPage`初始化时即可传入,d 模式只能用`set_cookies()`函数设置。
diff --git a/docs/MixPage使用方法/元素操作.md b/docs/MixPage使用方法/元素操作.md
index a270dc2..ffdb328 100644
--- a/docs/MixPage使用方法/元素操作.md
+++ b/docs/MixPage使用方法/元素操作.md
@@ -1,8 +1,8 @@
d 模式下的`DriverElement`对象可以对浏览器相应元素进行控制。
-# 元素操作方法
+# ✔️ 元素操作方法
-## click()
+## 📍 `click()`
此方法用于点击元素。可以选择是否用 js 方式点击,可以在点击失败时自动重试。默认情况下,使用 selenium 原生的点击方法,如果重试超过限定时间,自动改用 js 方式点击。可通过`by_js`参数设置点击方式。
此设计除了可保证点击成功,还可以用于检测页面上的遮罩层是否消失。遮罩层经常出现在 js 方式翻页的时候,它出现的时候会阻碍 selenium
@@ -11,12 +11,12 @@ d 模式下的`DriverElement`对象可以对浏览器相应元素进行控制。
!> 注意:
使用 js 方式点击时,是不会进行重试的。
-参数:
+**参数:**
-- by_js:是否用 js 方式点击,为`None`时先用 selenium 原生方法点击,重试失败超时后改为用 js 点击;为`True`时直接用 js 点击;为`False`时即使重试超时也不会改用 js。
-- timeout:点击失败重试超时时间,为`None`时使用父页面`timeout`设置。
+- `by_js`:是否用 js 方式点击,为`None`时先用 selenium 原生方法点击,重试失败超时后改为用 js 点击;为`True`时直接用 js 点击;为`False`时即使重试超时也不会改用 js。
+- `timeout`:点击失败重试超时时间,为`None`时使用父页面`timeout`设置。
-返回:`bool`,表示是否点击成功。
+**返回:**`bool`,表示是否点击成功。
```python
# 点击一个元素,重试超时根据所在页面元素而定,都失败就改用 js 点击
@@ -30,19 +30,19 @@ ele.click(timeout = 10) # 不断重试点击,直到遮罩层消失,或到
ele.click(by_js=True) # 无视遮罩层,直接用 js 点击下方元素
```
-## click_at()
+## 📍 `click_at()`
此方法用于带偏移量点击元素,偏移量相对于元素左上角坐标。不传入`x`或`y`值时点击元素中点。可选择是否用 js 方式点击,但不会进行重试。
可用于点击一些奇怪的东西,比如用伪元素表示的控件。
点击的目标不一定在元素上,可以传入负值,或大于元素大小的值,点击元素附近的区域。向右和向下为正值,向左和向上为负值。
-参数:
+**参数:**
-- x:相对元素左上角坐标的 x 轴偏移量
-- y:相对元素左上角坐标的 y 轴偏移量
-- by_js:是否用 js 点击
+- `x`:相对元素左上角坐标的 x 轴偏移量
+- `y`:相对元素左上角坐标的 y 轴偏移量
+- `by_js`:是否用 js 点击
-返回:`None`
+**返回:**`None`
```python
# 点击元素右上方 50*50 的位置
@@ -55,35 +55,35 @@ ele.click_at(x=50)
ele.click_at()
```
-## r_click()
+## 📍 `r_click()`
此方法实现右键单击元素。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
```python
ele.r_click()
```
-## r_click_at()
+## 📍 `r_click_at()`
此方法用于带偏移量右键点击元素,用法和`click_at()`相似,但没有`by_js`参数。
-参数:
+**参数:**
-- x:相对元素左上角坐标的x轴偏移量
-- y:相对元素左上角坐标的y轴偏移量
+- `x`:相对元素左上角坐标的x轴偏移量
+- `y`:相对元素左上角坐标的y轴偏移量
-返回:`None`
+**返回:** `None`
```python
# 点击距离元素左上角 50*50 的位置(位于元素内部)
ele.r_click_at(50, 50)
```
-## input()
+## 📍 `input()`
此方法用于向元素输入文本或组合键,也可用于输入文件路径到`input`元素(文件间用`\n`间隔)。可选择输入前是否清空元素。
insure 参数为 `True` 时可自动确保输入正确。该功能是为了应对 selenium 原生输入在某些i情况下会失效的问题。但只能用于 input 元素且 `type` 为 `text` 的情况。 接收组合键的时候可接收
@@ -91,14 +91,14 @@ selenium 的 `Keys` 对象的值。组合键要放在一个 `tuple` 中传入。
!> **注意:**
`insure` 为 `True` 时不能用于接收组合键。
?> **Tips:**
- 有些文本框可以接收回车代替点击按钮,可以直接在文本末尾加上`'\n'`。
- 非传入`tuple`时,会自动把非`str`转换为`str`。
-参数:
+**参数:**
-- vals:文本值或按键组合
-- clear:输入前是否清空文本框
-- insure:是否确保输入正确,不能用于输入组合键
-- timeout:尝试输入的超时时间,不指定则使用父页面的超时时间,只在 `insure_input` 参数为 `True` 时生效
+- `vals`:文本值或按键组合
+- `clear`:输入前是否清空文本框
+- `insure`:是否确保输入正确,不能用于输入组合键
+- `timeout`:尝试输入的超时时间,不指定则使用父页面的超时时间,只在 `insure_input` 参数为 `True` 时生效
-返回:`bool`类型,表示是否成功输入。`insure` 为 `False` 时始终返回 `True`。
+**返回:**`bool`类型,表示是否成功输入。`insure` 为 `False` 时始终返回 `True`。
```python
# 输入文本
@@ -116,47 +116,47 @@ ele.input((Keys.CONTROL, 'a'), insure=False)
ele.input('D:\\test1.txt\nD:\\test2.txt')
```
-## clear()
+## 📍 `clear()`
此方法用于清空元素文本,可使用确保清空的方式,若元素是不可编辑的,返回`None`。
-参数:
+**参数:**
-- insure:是否确保清空。为`True`则用`input()`确保值变成`''`,为`False`则用 selenium 元素`clear()`方法
+- `insure`:是否确保清空。为`True`则用`input()`确保值变成`''`,为`False`则用 selenium 元素`clear()`方法
-返回:`bool`,是否清空成功,不能清空的元素返回`None`
+**返回:**`bool`,是否清空成功,不能清空的元素返回`None`
```python
ele.clear()
```
-## run_script()
+## 📍 `run_script()`
此方法用于对元素执行 js 代码,代码中用`arguments[0]`表示自己。
-参数:
+**参数:**
-- script:js 文本
-- *args:传入 js 的参数
+- `script`:js 文本
+- `*args`:传入 js 的参数
-返回:js 执行的结果
+**返回:** js 执行的结果
```python
# 用执行 js 的方式点击元素
ele.run_script('arguments[0].click()')
```
-## wait_ele()
+## 📍 `wait_ele()`
此方法用于等待当前元素的某个下级元素到达某种状态。
调用此方法返回一个`ElementWaiter`对象,调用该对象方法实现各种方式的等待。
-参数:
+**参数:**
-- loc_or_ele:要等待的元素,可以是元素或定位符
-- timeout:等待超时时间,默认使用页面超时时间
+- `loc_or_ele`:要等待的元素,可以是元素或定位符
+- `timeout`:等待超时时间,默认使用页面超时时间
-方法:
+**方法:**
| 方法 | 参数说明 | 功能 |
|:---------:|:----:|:------------:|
@@ -178,111 +178,111 @@ ele2 = ele1.ele('#div1')
ele1.wait_ele(ele2).hidden()
```
-## screenshot()
+## 📍 `screenshot()`
此方法用于对元素进行截图。
如果是图片元素,会自动等待加载结束才截图。
此方法能自动获取能够使用的文件名,避免重名覆盖原有文件。并返回保存路径。
保存格式为 png,也可以返回图片的二进制文本。
-参数:
+**参数:**
-- path:图片保持路径
-- filename:图片文件名,不传入时以元素`tag`标签命名
-- as_bytes:是否已字节形式返回图片,为True时上面两个参数失效
+- `path`:图片保持路径
+- `filename`:图片文件名,不传入时以元素`tag`标签命名
+- `as_bytes`:是否已字节形式返回图片,为True时上面两个参数失效
-返回:图片完整路径或字节文本
+**返回:** 图片完整路径或字节文本
```python
path = ele.screenshot(r'D:\tmp', 'img1') # 保存到路径,文件名为img1.png
bytes = ele.screenshot(as_bytes=True) # 返回截图二进制文本
```
-## set_prop()
+## 📍 `set_prop()`
此方法用于设置元素`property`属性。
-参数:
+**参数:**
-- prop: 属性名
-- value: 属性值
+- `prop`: 属性名
+- `value`: 属性值
-返回:`bool`,是否设置成功
+**返回:**`bool`,是否设置成功
```python
ele.set_prop('value', 'Hello world!')
```
-## set_attr()
+## 📍 `set_attr()`
此方法用于设置元素`attribute`属性。
-参数:
+**参数:**
-- attr:属性名
-- value:属性值
+- `attr`:属性名
+- `value`:属性值
-返回:`bool`,是否设置成功
+**返回:**`bool`,是否设置成功
```python
ele.set_attr('href', 'http://www.gitee.com')
```
-## remove_attr()
+## 📍 `remove_attr()`
此方法用于删除元素`attribute`属性。
-参数:
+**参数:**
-- attr:属性名
+- `attr`:属性名
-返回:`bool`,是否删除成功
+**返回:**`bool`,是否删除成功
```python
ele.remove_attr('href')
```
-## submit()
+## 📍 `submit()`
此方法用于提交表单,若元素不在表单内,返回`None`,否则返回`True`。
-参数:无
+**参数:** 无
-返回:`True`或`None`
+**返回:**`True`或`None`
```python
ele.submit()
```
-## drag()
+## 📍 `drag()`
此方法用于拖拽元素到相对于当前的一个新位置,可以设置速度,可以选择是否随机抖动。
-参数:
+**参数:**
-- x:x 变化值
-- y:y 变化值
-- speed:拖动的速度,传入 0 即瞬间到达
-- shake:是否随机抖动
+- `x`:x 变化值
+- `y`:y 变化值
+- `speed`:拖动的速度,传入 0 即瞬间到达
+- `shake`:是否随机抖动
-返回:None
+**返回:**`None`
```python
# 拖动当前元素到距离 50*50 的位置,速度为 100,不随机抖动
ele.drag(50, 50, 100, False)
```
-## drag_to()
+## 📍 `drag_to()`
此方法用于拖拽元素到另一个元素上或一个坐标上。
-参数:
+**参数:**
-- ele_or_loc: 另一个元素或坐标元组,接收元素时坐标是元素中点的坐标。可接收 selenium 的`WebElement`或本库的`DriverElement`
-- speed: 拖动的速度,传入 0 即瞬间到达
-- shake: 是否随机抖动
+- `ele_or_loc`: 另一个元素或坐标元组,接收元素时坐标是元素中点的坐标。可接收 selenium 的`WebElement`或本库的`DriverElement`
+- `speed`: 拖动的速度,传入 0 即瞬间到达
+- `shake`: 是否随机抖动
-返回:None
+**返回:**`None`
```python
# 把 ele1 拖拽到 ele2 上
@@ -294,7 +294,7 @@ ele1.drag_to(ele2)
ele1.drag_to((50, 50))
```
-## scroll
+## 📍 `scroll`
此属性用于以某种方式滚动元素中的滚动条。
调用此属性返回一个`Scroll`对象,调用该对象方法实现各种方式的滚动。
@@ -326,16 +326,16 @@ ele.scroll.down(200)
ele.scroll.to_location(100, 300)
```
-## hover()
+## 📍 `hover()`
此方法用于模拟鼠标悬停在元素上,可接受偏移量,偏移量相对于元素左上角坐标。不传入`x`或`y`值时悬停在元素中点。`x`和`y`值可接受负值。
-参数:
+**参数:**
-- x:相对元素左上角坐标的 x 轴偏移量
-- y:相对元素左上角坐标的 y 轴偏移量
+- `x`:相对元素左上角坐标的 x 轴偏移量
+- `y`:相对元素左上角坐标的 y 轴偏移量
-返回:`None`
+**返回:**`None`
```python
# 悬停在元素右上方 50*50 的位置
@@ -348,7 +348,7 @@ ele.hover(x=50)
ele.hover()
```
-# `Select`类
+# ✔️ `Select`类
`select`元素的操作较为复杂,因此专门做了一个类用于处理它。每个`DriverElement`都有`select`属性,如果是`select`元素,该属性是一个`Select`类,否则该属性为`False`。
`select`元素要操作列表时,实际上是对这个`Select`对象进行操作。
@@ -359,9 +359,9 @@ ele.select
?> **Tips:**
网页操作中经常遇到动态变化的表单,这时需要等待列表项加载。`Select`类内置等待功能,默认为页面等待时间。
-## 属性
+## 📍 属性
-### is_multi
+### 📎 `is_multi`
该属性表示当前`select`元素是否多选列表。
@@ -369,7 +369,7 @@ ele.select
ele.select.is_multi
```
-### options
+### 📎 `options`
该属性以列表形式返回当前`select`元素下所有列表项元素对象,这些对象是`DriverElement`。
@@ -377,7 +377,7 @@ ele.select.is_multi
options = ele.select.options
```
-### selected_option
+### 📎 `selected_option`
该属性返回第一个被选中的元素对象。
@@ -385,7 +385,7 @@ options = ele.select.options
option_ele = ele.select.selected_option
```
-### selected_options
+### 📎 `selected_options`
该属性以列表形式返回第所有被选中的元素对象。如果是单选列表,返回一个列表
@@ -393,21 +393,21 @@ option_ele = ele.select.selected_option
options = ele.select.select.selected_options
```
-## 方法
+## 📍 方法
-### select()
+### 📎 `select()`
该方法用于选定下拉列表中子元素。
接收`int`类型时根据序号选择,接收`str`类型时根据文本选择。
接收`list`或`tuple`时同时选择多个项,多项可序号和文本混排。只能在多选列表使用。
Select 类的`__call__()`方法直接调用这个方法,因此可以直接`ele.select()`来替代这个方法。写法更直观。
-参数:
+**参数:**
-- text_or_index:根据文本或序号择选项,若允许多选,传入`list`或`tuple`可多选
-- timeout:等待列表项出现的时间
+- `text_or_index`:根据文本或序号择选项,若允许多选,传入`list`或`tuple`可多选
+- `timeout`:等待列表项出现的时间
-返回:是否选择成功
+**返回:** 是否选择成功
```python
# 根据文本选择下拉列表项,等待1秒
@@ -426,14 +426,14 @@ ele.select((0, 2))
ele.select(('text1', 2))
```
-### select_by_value()
+### 📎 `select_by_value()`
-参数:
+**参数:**
-- value:`value`属性值,若允许多选,传入`list`或`tuple`可多选
-- timeout:等待列表项出现的时间
+- `value`:`value`属性值,若允许多选,传入`list`或`tuple`可多选
+- `timeout`:等待列表项出现的时间
-返回:是否选择成功
+**返回:** 是否选择成功
此方法用于根据`value`值选择项。当元素是多选列表时,可以接受`list`或`tuple`,同时选择多个项,可和序号混排。
@@ -445,16 +445,16 @@ ele.select.select_by_value('value1')
ele.select.select_by_value(('value1', 2))
```
-### deselect()
+### 📎 `deselect()`
此方法用于取消选定下拉列表中子元素。当元素是多选列表时,可以接受`list`或`tuple`,同时取消选择多个项。
-参数:
+**参数:**
-- text_or_index:根据文本、值选或序号择选项,若允许多选,传入`list`或`tuple`可多选
-- timeout:等待列表项出现的时间
+- `text_or_index`:根据文本、值选或序号择选项,若允许多选,传入`list`或`tuple`可多选
+- `timeout`:等待列表项出现的时间
-返回:是否取消选择成功
+**返回:** 是否取消选择成功
```python
# 根据文本取消选择下拉列表项
@@ -473,16 +473,16 @@ ele.select.deselect((0, 1))
ele.select.deselect(('text1', 2))
```
-### deselect_by_value()
+### 📎 `deselect_by_value()`
此方法用于根据`value`值取消选择项。当元素是多选列表时,可以接受`list`或`tuple`,同时取消选择多个项,可和序号混排。
-参数:
+**参数:**
-- value:`value`属性值,若允许多选,传入`list`或`tuple`可取消多项
-- timeout:等待列表项出现的时间
+- `value`:`value`属性值,若允许多选,传入`list`或`tuple`可取消多项
+- `timeout`:等待列表项出现的时间
-返回:是否取消选择成功
+**返回:** 是否取消选择成功
```python
# 根据 value 值取消选择列表项
@@ -492,27 +492,27 @@ ele.select.deselect_by_value('value1')
ele.select.deselect_by_value(('value1', 2))
```
-## 多项列表独有功能
+## 📍 多项列表独有功能
-### clear()
+### 📎 `clear()`
此方法用于清空多选列表选项。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
```python
ele.select.clear()
```
-### invert()
+### 📎 `invert()`
此方法用于反选多选列表选项。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
```python
ele.select.invert()
diff --git a/docs/MixPage使用方法/创建页面对象.md b/docs/MixPage使用方法/创建页面对象.md
index 3be9ea3..2eedbce 100644
--- a/docs/MixPage使用方法/创建页面对象.md
+++ b/docs/MixPage使用方法/创建页面对象.md
@@ -3,22 +3,22 @@
可以通过指定配置信息创建须要的页面对象,如无界面的浏览器、是否加载插件、是否接管已打开的浏览器、设置`headers`、设置代理等等。
这些配置信息,可以通过几种方式设置。配置的详细用法后文再讲。本节先了解创建页面对象的几种方式。
-# `MixPage`类
+# ✔️ `MixPage`类
`MixPage`页面对象封装了常用的网页操作,并实现在两种模式之间的切换。
`MixPage`须控制一个`Drission`对象并使用其中的`WebDriver`或`Session`对象来实现。对浏览器或网络连接的操作。如没有传入,`MixPage`会自己创建一个(使用传入的配置信息或从默认 ini 文件读取)。
-初始化参数:
+**初始化参数:**
-- mode:初始化时模式,`'d'`或`'s'`,默认为`'d'`
-- drission:Drission 对象,不传入时会自动创建
-- timeout:超时时间,s 模式时为连接时间,d 模式时为查找元素、处理弹出框、输入文本等超时时间
-- driver_options:浏览器设置,没传入`drission`参数时会用这个设置新建`Drission`对象中的`WebDriver`对象,传入`False`则不创建
-- session_options:requests 设置,没传入`drission`参数时会用这个设置新建`Drission`对象中的`Session`对象,传入`False`则不创建
+- `mode`:初始化时模式,`'d'`或`'s'`,默认为`'d'`
+- `drission`:Drission 对象,不传入时会自动创建
+- `timeout`:超时时间,s 模式时为连接时间,d 模式时为查找元素、处理弹出框、输入文本等超时时间
+- `driver_options`:浏览器设置,没传入`drission`参数时会用这个设置新建`Drission`对象中的`WebDriver`对象,传入`False`则不创建
+- `session_options`:requests 设置,没传入`drission`参数时会用这个设置新建`Drission`对象中的`Session`对象,传入`False`则不创建
!> **注意:**
有传入`drission`参数时,`driver_options`和`session_options`参数无效
-# 直接创建
+# ✔️ 直接创建
这种方式代码最简洁,程序会从配置文件中读取配置,自动生成页面对象。可以保持代码简洁。
在基本概念一节我们提到过,本库使用配置文件记录常用配置信息,也可以直接把配置写在代码里。
@@ -31,20 +31,20 @@ page = MixPage('d')
page = MixPage('s')
```
-# 通过配置信息创建
+# ✔️ 通过配置信息创建
本库有两种管理配置信息的对象,分别是`DriverOptions`和`SessionOptions`,对应 d 模式和 s 模式的配置。
须要时,可以创建相应的配置对象进行设置。
-## `DriverOptions`类
+## 📍 `DriverOptions`类
`DriverOptions`用于管理创建浏览器时的配置,浏览器创建后再修改这个配置是没有效果的。
`DriverOptions`对象能实现链式操作。
-初始化参数:
+**初始化参数:**
-- read_file:是否从 ini 文件中读取配置信息
-- ini_path:ini 文件路径,为`None`则读取默认 ini 文件
+- `read_file`:是否从 ini 文件中读取配置信息
+- `ini_path`:ini 文件路径,为`None`则读取默认 ini 文件
```python
# 导入 DriverOptions
@@ -56,14 +56,14 @@ do = DriverOptions().set_mute().set_no_imgs()
page = MixPage(driver_options=do)
```
-## `SessionOptions`类
+## 📍 `SessionOptions`类
`SessionOptions`用于管理创建`Session`对象时的配置,内置了常用的配置,并能实现链式操作。详细使用方法见“启动配置”一节。
-初始化参数:
+**初始化参数:**
-- read_file:是否从 ini 文件中读取配置信息
-- ini_path:ini 文件路径,为`None`则读取默认 ini 文件
+- `read_file`:是否从 ini 文件中读取配置信息
+- `ini_path`:ini 文件路径,为`None`则读取默认 ini 文件
!>**注意:**
`Session`对象创建后再修改这个配置是没有效果的。
@@ -86,7 +86,7 @@ d 模式的配置和 s 模式的配置是可以同时使用的,不会互相影
page = MixPage(mode='s', session_options=so, driver_options=do)
```
-# 传入`Drission`对象创建
+# ✔️ 传入`Drission`对象创建
在入门指南的基本概念一节里,我们讲过`Drission`对象相当于驱动器的角色。事实上,上述两种方式,`MixPage`都会自动创建一个`Drission`对象用于管理与网站或浏览器的连接,我们当然也可以手动创建并传入`MixPage`。
`Drission`一般是不用手动创建的,要手动创建的时候,一般是用于i以下几种情况:
@@ -95,16 +95,16 @@ page = MixPage(mode='s', session_options=so, driver_options=do)
- 在不同`MixPage`间传递驱动器
- 与 selenium 或 requests 原生代码拼接,用于兼容这两者的代码
-## `Drission`类
+## 📍 `Drission`类
-初始化参数:
+**初始化参数:**
-- driver_or_options:`WebDriver`对象、`DriverOptions`对象或`Options`对象。传入`False`时自动创建一个空配置对象。
-- session_or_options:`Session`对象、`SessionOptions`对象、`Options`对象或设置字典。传入`False`时自动创建一个空配置对象。
-- ini_path:要使用的 ini 文件的路径
-- proxy:初始化时设置代理
+- `driver_or_options`:`WebDriver`对象、`DriverOptions`对象或`Options`对象。传入`False`时自动创建一个空配置对象。
+- `session_or_options`:`Session`对象、`SessionOptions`对象、`Options`对象或设置字典。传入`False`时自动创建一个空配置对象。
+- `ini_path`:要使用的 ini 文件的路径
+- `proxy`:初始化时设置代理
-## 使用其它 ini 文件创建
+## 📍 使用其它 ini 文件创建
```python
from DrissionPage import MixPage, Drission
@@ -113,7 +113,7 @@ d = Drission(ini_path=r'./config1.ini')
page = MixPage(drission=d)
```
-## 传递驱动器
+## 📍 传递驱动器
多页面对象间共用驱动器,如多个`MixPage`控制一个浏览器:
@@ -125,7 +125,7 @@ d = page1.drission
page2 = MixPage(drission=d)
```
-## 从 selenium 和 requests 代码传入
+## 📍 从 selenium 和 requests 代码传入
DrissionPage 的代码能和 selenium 及 requests 代码兼容,便于不同程序间的对接。
只需把`WebDriver`对象或`Session`传入`Drission`对象即可。
@@ -143,7 +143,7 @@ page = MixPage(drission=d)
page.get('https://www.baidu.com')
```
-## 用配置信息创建
+## 📍 用配置信息创建
因为`MixPage`创建时能直接接收配置信息,所以这个方法基本不需要用到,写出来只是表示有这个功能。
@@ -157,7 +157,7 @@ d = Drission(driver_or_options=do, session_or_options=so)
page = MixPage(drission=d)
```
-# 接管手动打开的浏览器
+# ✔️ 接管手动打开的浏览器
如果须要手动打开浏览器,手动操作后再接管,可以这样做:
@@ -184,7 +184,7 @@ page = MixPage(driver_options=do)
?>**Tips:**
接管使用 bat 文件打开的浏览器也是一样做法做法。
接管浏览器时只有`local_port`、`debugger_address`、`driver_path`参数是有效的。
-# 多 Chrome 浏览器共存
+# ✔️ 多 Chrome 浏览器共存
如果想要同时操作多个 Chrome 浏览器,或者自己在使用 Chrome 上网,同时控制另外几个跑自动化,就须要给这些被程序控制的浏览器设置单独的端口和用户文件夹,否则会造成冲突。具体用`DriverOptions`对象进行设置,示例如下:
@@ -223,19 +223,19 @@ page2 = MixPage(driver_options=do2)
?> **Tips:**
使用 bat 文件打开浏览器再接管操作是一样的。
-# 一些技巧
+# ✔️ 一些技巧
事实上,本库默认启动浏览器的方式是先通过程序在 9222(或用户指定的)端口运行一个浏览器进程,然后通过程序接管。这种做法有很多好处:
-## 可重复使用的浏览器对象
+## 📍 可重复使用的浏览器对象
当程序运行完毕,浏览器不会主动关闭,下次再运行的时候可以直接在当前状态下继续运行。于是无须每次打开新的浏览器对象,无须从最开始步骤重新运行整个程序,一些前置条件(如登录)也无须每次运行,大大提高开发效率。
-## 简便的调试方式
+## 📍 简便的调试方式
通过重复使用浏览器对象,用户可以把浏览器页面调整到某个状态再用程序接管,对调试某个特定问题效率极高。比如有些通过很多步骤才能到达的页面,如果每次重新运行会花费大量时间,而将页面固定再由程序接管,测试各种细节非常方便快捷。
-## 一行代码传递登录状态到 requests
+## 📍 一行代码传递登录状态到 requests
本库的一个特点是打通了浏览器和`requests`之间的登录状态,我们可以手动登录浏览器,再用程序接管,然后切换到 s 模式,这时 s 模式的`Session`对象即已活动浏览器的登录信息,无须用`requests`
处理登录过程,极大地简化了开发复杂程度。示例:
diff --git a/docs/MixPage使用方法/启动配置/Chrome启动配置.md b/docs/MixPage使用方法/启动配置/Chrome启动配置.md
deleted file mode 100644
index 1310406..0000000
--- a/docs/MixPage使用方法/启动配置/Chrome启动配置.md
+++ /dev/null
@@ -1,185 +0,0 @@
-为使浏览器设置更便利,本库扩展了`selenium.webdriver.chrome.options`的`Options`对象功能,创建了`DriverOptions`类,专门用于管理浏览器的启动配置。
-
-!> **注意:**
-1、`DriverOptions`仅用于管理启动配置,浏览器启动后再修改无效。
-2、若设置了`local_port`或`debugger_address`且浏览器未启动,则只有`arguments`、`driver_path`、`chrome_path`参数生效。
-3、若设置了`local_port`或`debugger_address`且接管已有浏览器,只有`driver_path`参数生效。
-
-# DriverOptions 类
-
-`DriverOptions`类继承自`Options 类`,保留了原来所有功能,原生功能不在这里叙述,只介绍增加的功能。
-对象创建时,可从配置文件中读取配置来进行初始化,不从文件读取则创建一个空配置对象。
-该类绝大部分方法都支持链式操作。
-
-初始化参数:
-
-- read_file:是否从默认 ini 文件中读取配置信息
-- ini_path:ini 文件路径,为`None`则读取默认 ini 文件
-
-## driver_path
-
-此属性返回 chromedriver 文件路径。
-
-## chrome_path
-
-此属性返回 Chrome 浏览器启动文件路径,即`binary_location`。
-为空时程序会根据注册表或系统路径查找。
-
-## set_paths()
-
-该方法用于设置浏览器用到的几种路径信息。
-
-参数:
-
-- driver_path:chromedriver.exe 路径
-- chrome_path:chrome.exe 路径
-- local_port:本地端口号
-- debugger_address:调试浏览器地址,会覆盖`local_port`设置,例:127.0.0.1:9222
-- download_path:下载文件路径
-- user_data_path:用户数据路径
-- cache_path:缓存路径
-
-返回:`None`
-
-## save()
-
-此方法用于保存当前配置对象的信息到配置文件。
-
-参数:
-
-- path:配置文件的路径,默认保存到当前读取的配置文件,传入`'default'`保存到默认 ini 文件
-
-返回:配置文件绝对路径
-
-## save_to_default()
-
-此方法用于保存当前配置对象的信息到默认 ini 文件。
-
-参数:无
-
-返回:配置文件绝对路径
-
-## remove_argument()
-
-此方法用于移除一个`argument`项。
-
-参数:
-
-- value:设置项名称,带有值的设置项传入设置名称即可
-
-返回:当前对象
-
-## remove_experimental_option()
-
-此方法用于移除一个实验设置,传入key值删除。
-
-参数:
-
-- key:实验设置的名称
-
-返回:当前对象
-
-## remove_all_extensions()
-
-此方法用于移除所有插件。
-
-参数:无
-
-返回:当前对象
-
-## set_argument()
-
-此方法用于设置浏览器配置的`argument`属性。
-
-参数:
-
-- arg:属性名
-- value:属性值,有值的属性传入值,没有的传入`bool`类型表示开关
-
-返回:当前对象
-
-## set_timeouts()
-
-此方法用于设置三种超时时间,selenium 4 以上版本有效。
-
-参数:
-
-- implicit:查找元素超时时间
-- pageLoad:页面加载超时时间
-- script:脚本运行超时时间
-
-返回:当前对象
-
-## set_headless()
-
-该方法用于设置是否已无头模式启动浏览器。
-
-参数:
-
-- on_off:`bool`类型,表示开或关
-
-返回:None
-
-## set_no_imgs()
-
-该方法用于设置是否禁止加载图片。
-
-参数:
-
-- on_off:`bool`类型,表示开或关
-
-返回:`None`
-
-## set_mute()
-
-该方法用于设置是否静音。
-
-参数:
-
-- on_off:`bool`类型,表示开或关
-
-返回:None
-
-## set_proxy()
-
-该方法用于设置代理。
-
-参数:
-
-- proxy: 代理网址和端口,如 127.0.0.1:1080
-
-返回:`None`
-
-## set_user_agent()
-
-该方法用于设置 user agent。
-
-参数:
-
-- user_agent:user agent文本
-
-返回:`None`
-
-## as_dict()
-
-该方法以`dict`方式返回所有配置信息。
-
-参数:无
-
-返回:配置信息
-
-# 简单示例
-
-```python
-from DrissionPage import MixPage
-from DrissionPage.config import DriverOptions
-
-# 创建配置对象(默认从 ini 文件中读取配置)
-do = DriverOptions()
-# 设置不加载图片、静音
-do.set_no_imgs(True).set_mute(True)
-
-# 以该配置创建页面对象
-page = MixPage(driver_options=do)
-```
-
diff --git a/docs/MixPage使用方法/启动配置/使用配置文件.md b/docs/MixPage使用方法/启动配置/使用配置文件.md
deleted file mode 100644
index d11271a..0000000
--- a/docs/MixPage使用方法/启动配置/使用配置文件.md
+++ /dev/null
@@ -1,265 +0,0 @@
-本库使用 ini 文件记录浏览器或`Session`对象的启动配置。便于配置复用,免于在代码中加入繁琐的配置信息。
-默认情况下,`MixPage`对象启动时自动加载文件中的配置信息。
-也可以在默认配置基础上用简单的方法再次修改,再保存到 ini 文件。
-也可以保存多个 ini 文件,按不同项目须要调用。
-
-!> **注意:**
-ini 文件仅用于管理启动配置,浏览器或`Session`创建后再修改 ini 文件内容是没有效果的。
-如果是接管已打开的浏览器,这些设置也没有用。
-每次升级本库,ini 文件都会被重置,可另存到其它路径以免重置。
-
-# ini 文件内容
-
-ini 文件默认拥有三部分配置:`paths`、`chrome_options`、`session_options`,初始内容如下。
-
-```
-[paths]
-; chromedriver.exe路径
-chromedriver_path =
-
-; 临时文件夹路径,暂时没有实际作用
-tmp_path =
-
-[chrome_options]
-; 浏览器默认地址和端口,程序会启动或接管这个端口的浏览器进程,设为 '' 则用 selenium 普通方式启动浏览器
-debugger_address = 127.0.0.1:9222
-
-; chrome.exe路径
-binary_location =
-
-; 配置信息
-arguments = [
- ; 静音
- '--mute-audio',
- ; 不使用沙盒
- '--no-sandbox',
- ; 谷歌文档提到需要加上这个属性来规避bug
- '--disable-gpu',
- ; 忽略警告
- 'ignore-certificate-errors',
- ; 不显示信息栏
- '--disable-infobars'
- ]
-
-; 插件
-extensions = []
-
-; 实验性配置
-experimental_options = {
- 'prefs': {
- ; 下载不弹出窗口
- 'profile.default_content_settings.popups': 0,
- ; 无弹窗
- 'profile.default_content_setting_values': {'notifications': 2},
- ; 禁用PDF插件
- 'plugins.plugins_list': [{"enabled": False, "name": "Chrome PDF Viewer"}]
- },
- ; 设置为开发者模式,防反爬虫
- 'excludeSwitches': ["enable-automation"],
- 'useAutomationExtension': False
- }
-
-[session_options]
-headers = {
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8",
- "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
- "Connection": "keep-alive",
- "Accept-Charset": "utf-8;q=0.7,*;q=0.7"
- }
-```
-
-# 文件位置
-
-默认配置文件存放在库文件夹下,文件名为 configs.ini。
-用户可另存其它配置文件,或从另存的文件读取配置,但默认文件的位置和名称不会改变。
-
-# 使用默认配置文件启动
-
-## 使用`MixPage`对象自动加载
-
-这是默认启动方式。
-
-```python
-from DrissionPage import MixPage
-
-page = MixPage()
-```
-
-## 使用配置对象加载
-
-这种方式一般用于加载配置后须要进一步修改。
-
-```python
-from Drission.config import DriverOptions, SessionOptions
-
-do = DriverOptions()
-so = SessionOptions()
-
-page = MixPaage(driver_options=do, session_option=so)
-```
-
-## 使用 Drission 对象加载
-
-这种方式一般用于加载非默认配置文件,或须在多个页面对象间传递`Drission`对象的情况。
-
-```python
-from DrissionPage import MixPage, Drission
-
-ds = Drission(ini_path=r'D:\config1.ini')
-page = MixPage(drission=ds)
-```
-
-# 保存/另存 ini 文件
-
-```python
-from DrissionPage.config import DriverOptions
-
-do = DriverOptions()
-# 设置不加载图片
-do.set_no_imgs()
-
-# 保存到默认 ini 文件
-do.save()
-
-# 保存到其它位置的配置文件
-do.save(r'D:\config1.ini')
-```
-
-# easy_set 方法
-
-Chrome 浏览器的配置繁琐且难以记忆,本库提供一些常用功能的快速设置方法,调用即可修改 ini 文件中该部分内容。
-
-!> **注意:**
-easy_set 方法仅用于设置 ini 文件,浏览器或 Session 创建后再调用没有效果的。
-如果是接管已打开的浏览器,这些设置也没有用。
-
-## 简单示例
-
-```python
-# 导入
-from DrissionPage.easy_set import set_headless
-
-# 设置无头模式
-set_headless(True)
-```
-
-## show_settings()
-
-该方法用于打印 ini 文件内容。
-
-参数:
-
-- ini_path:ini 文件路径,默认读取默认 ini 文件
-
-返回:`None`
-
-## set_paths()
-
-该方法用于设置浏览器用到的几种路径信息,设置后可检查 driver 是否和浏览器匹配。
-
-参数:
-
-- driver_path:chromedriver.exe 路径
-- chrome_path:chrome.exe 路径
-- local_port:本地端口号
-- debugger_address:调试浏览器地址,会覆盖 local_port 设置,例:127.0.0.1:9222
-- download_path:下载文件路径
-- tmp_path:临时文件夹路径,暂时没有作用
-- user_data_path:用户数据路径
-- cache_path:缓存路径
-- ini_path:要修改的 ini 文件路径,默认设置默认 ini 文件
-- check_version:是否检查 chromedriver 和 Chrome 是否匹配
-
-返回:`None`
-
-## set_headless()
-
-该方法用于设置是否已无头模式启动浏览器。
-
-参数:
-
-- on_off:`bool`类型,表示开或关
-- ini_path: 要修改的 ini 文件路径,默认设置默认 ini 文件
-
-返回:`None`
-
-## set_no_imgs()
-
-该方法用于设置是否禁止加载图片。
-
-参数:
-
-- on_off:`bool`类型,表示开或关
-- ini_path: 要修改的 ini 文件路径,默认设置默认 ini 文件
-
-返回:`None`
-
-## set_mute()
-
-该方法用于设置是否静音。
-
-参数:
-
-- on_off:`bool`类型,表示开或关
-- ini_path: 要修改的 ini 文件路径,默认设置默认 ini 文件
-
-返回:`None`
-
-## set_proxy()
-
-该方法用于设置代理。
-
-参数:
-
-- proxy: 代理网址和端口,如 127.0.0.1:1080
-- ini_path: 要修改的 ini 文件路径,默认设置默认 ini 文件
-
-返回:`None`
-
-## set_user_agent()
-
-该方法用于设置 user agent。
-
-参数:
-
-- user_agent:user agent文本
-- ini_path: 要修改的 ini 文件路径,默认设置默认 ini 文件
-
-返回:`None`
-
-## set_argument()
-
-该方法用于设置浏览器配置 argument 属性。
-
-参数:
-
-- arg:属性名
-- value:属性值,有值的属性传入值。没有的传入`bool`表示开或关
-- ini_path:要修改的 ini 文件路径,默认设置默认 ini 文件
-
-返回:`None`
-
-## check_driver_version()
-
-该方法用于检查传入的 chrome 和 chromedriver 是否匹配。
-
-参数:
-
-- driver_path:chromedriver.exe 路径
-- chrome_path:chrome.exe 路径
-
-返回:`bool`类型,表示是否匹配
-
-## get_match_drive()
-
-该方法用于自动识别 chrome 版本并下载匹配的 driver。
-
-参数:
-
-- ini_path:要读取和修改的 ini 文件路径
-- save_path:chromedriver 保存路径
-- chrome_path:指定 chrome.exe 位置,不指定会自动依次在 ini 文件、注册表、系统路径中查找
-- show_msg:是否打印信息
-- check_version:是否检查版本匹配
-
-返回:成功返回 driver 路径,失败返回`None`
diff --git a/docs/MixPage使用方法/对接selenium及requests代码.md b/docs/MixPage使用方法/对接selenium及requests代码.md
index 0150f76..c87607c 100644
--- a/docs/MixPage使用方法/对接selenium及requests代码.md
+++ b/docs/MixPage使用方法/对接selenium及requests代码.md
@@ -1,7 +1,7 @@
DrissionPage 代码可无缝拼接 selenium 及 requests 代码。既可直接使用 selenium 的`WebDriver`对象,也可导出自身的`WebDriver`给 selenium 代码使用。requests 的
`Session`对象也可直接传递。便于已有项目的迁移。
-# selenium 转 DrissionPage
+# ✔️ selenium 转 DrissionPage
```python
from selenium import webdriver
@@ -17,7 +17,7 @@ page = MixPage(drission=drission)
print(page.title)
```
-# DrissionPage 转 selenium
+# ✔️ DrissionPage 转 selenium
```python
page = MixPage()
@@ -31,9 +31,9 @@ print(driver.title)
element = driver.find_element(By.XPATH, '//div')
```
-# requests 转 DrissionPage
+# ✔️ requests 转 DrissionPage
-``` python
+```python
from requests import Session
session = requets.Session()
@@ -45,7 +45,7 @@ page = MixPage('s', drission=drission)
page.get('https://www.baidu.com')
```
-# DrissionPage 转 requests
+# ✔️ DrissionPage 转 requests
```python
from DrissionPage import MixPage
diff --git a/docs/MixPage使用方法/打包程序.md b/docs/MixPage使用方法/打包程序.md
deleted file mode 100644
index da248a6..0000000
--- a/docs/MixPage使用方法/打包程序.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# 注意事项
-
-程序如直接打包为 exe 文件,运行会遇到报错。这是可能因为程序在默认路径找不到 ini 文件引起的。解决的方法有两种:
-
-1. **把 ini 文件放到打包的程序文件夹**
- 这样程序运行时会根据相对路径查找 ini 文件,避免找不到默认文件的问题
-
-```python
-from DrissionPage import Drission, MixPage
-
-drission = Drission(ini_path=r'.\configs.ini') # ini文件放在程序相同路径下
-page = MixPage(drission=drission)
-```
-
-2. **把配置写到程序中,不使用 ini 文件**
-
-```python
-from DrissionPage.config import DriverOptions, SessionOptions
-from DrissionPage import MixPage
-
-do = DriverOptions(read_file=False)
-so = SessionOptions(read_file=False)
-page = MixPage(driver_options=do, session_options=so)
-```
-
-!> **注意**
这个时候`Drission`的两个参数都要输入内容,如果其中一个不需要设置可以输入`False`.
-
-如:
-
-```python
-drission = Drission(driver_or_options=do, session_or_options=False)
-```
-
-# 实用示例
-
-通常,我会把一个绿色浏览器和打包后的 exe 文件放在一起,程序中用相对路径指向该浏览器,这样拿到别的电脑也可以正常实用。
-
-```python
-from DrissionPage import MixPage
-from DrissionPage.config import DriverOptions
-
-do = DriverOptions(read_file=False).set_paths(local_port='9888',
- chrome_path=r'.\Chrome\chrome.exe',
- driver_path=r'.\Chrome\chromedriver.exe',
- user_data_path=r'.\Chrome\userData')
-page = MixPage(driver_options=do, session_options=False)
-
-page.get('https://www.baidu.com')
-```
-
-注意以下两点,程序就会跳过读取 ini 文件:
-
-- `DriverOptions()`里要设置`read_file=False`
-- 如果不传入某个模式的配置(示例中为 s 模式),要在`MixPage()`初始化是设置对应参数为`False`
diff --git a/docs/MixPage使用方法/查找页面元素.md b/docs/MixPage使用方法/查找页面元素.md
index c08ec9a..614382b 100644
--- a/docs/MixPage使用方法/查找页面元素.md
+++ b/docs/MixPage使用方法/查找页面元素.md
@@ -11,9 +11,9 @@
d 模式的元素还有专门用于处理 shadow dom 的`shadow_root`属性。获取到的元素可继续用这些方法获取后代元素,使用方法和普通元素一致。
-# 示例
+# ✔️ 示例
-## 简单示例
+## 📍 简单示例
```html
@@ -61,7 +61,7 @@ parent = p1.parent()
div2 = p1.after(1, 'tag:div')
```
-## 实际示例
+## 📍 实际示例
复制此代码可直接运行查看结果。
@@ -93,17 +93,17 @@ IOT/物联网/边缘计算
# 查找元素方法
-## ele()
+## 📍 `ele()`
此方法用于查找并返回第一个匹配的元素,d 模式下返回`DriverElement`,s 模式下返回`SessionElement`,用 xpath 获取元素属性时,直接返回属性文本。查找不到结果则返回`None`。
-参数:
+**参数:**
-- loc_or_str(元素对象拥有):元素的定位信息,可以是 loc 元组,或查询字符串
-- loc_or_ele(页面对象拥有):元素的定位信息,可以是元素对象,loc 元组,或查询字符串
-- timeout:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效
+- `loc_or_str`(元素对象拥有):元素的定位信息,可以是 loc 元组,或查询字符串
+- `loc_or_ele`(页面对象拥有):元素的定位信息,可以是元素对象,loc 元组,或查询字符串
+- `timeout`:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效
-返回:s 模式下返回`SessionElement`,d 模式下返回`DriverElement`,或用 xpath 获取到的属性值
+**返回:** s 模式下返回`SessionElement`,d 模式下返回`DriverElement`,或用 xpath 获取到的属性值
```python
# 在页面内查找元素
@@ -117,16 +117,16 @@ ele2 = ele1.ele('search text')
class = ele1.ele('xpath://div/@class')
```
-## eles()
+## 📍 `eles()`
此方法与`ele()`相似,但返回的是匹配到的所有元素组成的列表,用 xpath 获取元素属性时,返回属性文本组成的列表。
-参数:
+**参数:**
-- loc_or_str:元素的定位信息,可以是 loc 元组,或查询字符串
-- timeout:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效
+- `loc_or_str`:元素的定位信息,可以是 loc 元组,或查询字符串
+- `timeout`:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效
-返回:s 模式下返回`SessionElement`组成的列表,d 模式下返回`DriverElement`组成的列表,或用 xpath 获取到的属性值组成的列表
+**返回:** s 模式下返回`SessionElement`组成的列表,d 模式下返回`DriverElement`组成的列表,或用 xpath 获取到的属性值组成的列表
```python
# 获取 ele 元素内的所有 p 元素
@@ -135,7 +135,7 @@ p_eles = ele.eles('tag:p')
print(p_eles[0])
```
-## s_ele()
+## 📍 `s_ele()`
此方法用于在一个元素下查找后代元素,以`SessionElement`形式返回结果(xpath 获取属性值时依然是返回`str`),也可以直接将一个元素或页面转换为`SessionElement`版本。
@@ -143,12 +143,12 @@ print(p_eles[0])
s 模式下这个方法和`ele()`是一样的。
-参数:
+**参数:**
-- loc_or_str(元素对象拥有):元素的定位信息,可以是 loc 元组,或查询字符串。为`None`时直接返回当前元素的`SessionElemnet`版本
-- loc_or_ele(页面对象拥有):元素的定位信息,可以是 loc 元组,或查询字符串。为`None`时直接返回当前页面的 `SessionElemnet`版本
+- `loc_or_str`(元素对象拥有):元素的定位信息,可以是 loc 元组,或查询字符串。为`None`时直接返回当前元素的`SessionElemnet`版本
+- `loc_or_ele`(页面对象拥有):元素的定位信息,可以是 loc 元组,或查询字符串。为`None`时直接返回当前页面的 `SessionElemnet`版本
-返回:`SessionElement`,或用 xpath 获取到的属性值
+**返回:**`SessionElement`,或用 xpath 获取到的属性值
```python
# 获取元素或页面的的 SessionElement 版本
@@ -162,17 +162,17 @@ ele2 = ele1.s_ele('search text')
ele = page.s_ele('search text')
```
-## s_eles()
+## 📍 `s_eles()`
此方法与`s_ele()`相似,但返回的是匹配到的所有元素组成的列表,或属性值组成的列表。
-参数:
+**参数:**
-- loc_or_str:元素的定位信息,可以是 loc 元组,或查询字符串(必填)
+- `loc_or_str`:元素的定位信息,可以是 loc 元组,或查询字符串(必填)
-返回:`SessionElement`组成的列表,或用 xpath 获取到的属性值组成的列表
+**返回:**`SessionElement`组成的列表,或用 xpath 获取到的属性值组成的列表
-## active_ele
+## 📍 `active_ele`
该属性返回当前页面焦点所在元素。d 模式独有。
@@ -180,7 +180,7 @@ ele = page.s_ele('search text')
ele = page.active_ele
```
-## shadow_root
+## 📍 `shadow_root`
`DriverElement`元素除了以上方法和属性外,还有`shadow_root`属性,用于获取其内部的 shadow_root 元素。
该属性返回的是一个`ShadowRootElement`,类似于`DriverElement`,功能比`DriverElement`少。但也有`ele()`和`eles()`方法,可直接搜索其下的元素,返回 `DriverElement`
@@ -202,17 +202,17 @@ ele1.click()
**匹配模式** 指字符串是否完全匹配,有以下两种:
-## `=`
+## 📍 `=`
表示精确匹配,匹配完全符合的文本或属性。
-## `:`
+## 📍 `:`
表示模糊匹配,匹配含有某个字符串的文本或属性。
**关键字** 是出现在定位语句最左边,用于指明该语句以哪种方式去查找元素,有以下这些:
-## `#`
+## 📍 `#`
表示`id`属性,只在语句最前面且单独使用时生效,可配合`=`或`:`。
@@ -224,7 +224,7 @@ ele1 = page.ele('#ele_id')
ele2 = ele1.ele('#:ele_id')
```
-## `.`
+## 📍 `.`
表示`class`属性,只在语句最前面且单独使用时生效,可配合`=`或`:`。
@@ -236,7 +236,7 @@ ele2 = ele1.ele('.ele_class')
ele2 = ele1.ele('.:ele_class')
```
-## `@`
+## 📍 `@`
表示某个属性,只匹配一个属性。
`@`关键字只有一个简单功能,就是匹配`@`后面的内容,不再对后面的字符串进行解析。因此即使后面的字符串也存在`@`或`@@`,也作为要匹配的内容对待。
@@ -264,7 +264,7 @@ ele2 = ele1.ele('@email=abc@def.com')
ele2 = ele1.ele('css:div[abc\@def="v"]')
```
-## `@@`
+## 📍 `@@`
表示某个属性,多属性匹配时使用,个数不限。还能匹配要忽略的元素,匹配文本时也和`@`不一样。
`@@`后跟 - 时,表示 not。如:
@@ -293,7 +293,7 @@ ele2 = ele1.ele('@@-class')
ele2 = ele1.ele('@@-name:ele_name')
```
-## `text`
+## 📍 `text`
要匹配的文本,查询字符串如开头没有任何关键字,也表示根据传入的文本作模糊查找。
如果元素内有多个直接的文本节点,精确查找时可匹配所有文本节点拼成的字符串,模糊查找时可匹配每个文本节点。
@@ -315,7 +315,7 @@ ele2 = ele1.ele('some text')
ele2 = page.ele('text:text:')
```
-## `text()`
+## 📍 `text()`
作为查找属性时使用的文本关键字,必须与`@`或`@@`配合使用。
与`@`配合和与`@@`配合使用时,`text()`的意义是有差别的。
@@ -343,7 +343,7 @@ ele = page.ele('text:some text')
ele = page.ele('@@text():some text')
```
-## `tag`
+## 📍 `tag`
表示元素的标签,只在语句最前面且单独使用时生效,可与`@`或`@@`配合使用。`tag:`与`tag=`效果一致。
@@ -367,10 +367,9 @@ ele2 = ele1.ele('tag:div@text():text')
ele2 = ele1.ele('tag:div@@text():text')
```
-?> **Tips:**
-注意, `tag:div@text():text` 和 `tag:div@@text():text` 是有区别的,前者只在`div`的直接文本节点搜索,后者搜索`div`的整个内部。
+?> **Tips:**
注意, `tag:div@text():text` 和 `tag:div@@text():text` 是有区别的,前者只在`div`的直接文本节点搜索,后者搜索`div`的整个内部。
-## `css`
+## 📍 `css`
表示用 css selector 方式查找元素。`css:`与`css=`效果一致。
@@ -382,7 +381,7 @@ ele2 = ele1.ele('css:.div')
ele2 = ele1.ele('css:>div')
```
-## `xpath`
+## 📍 `xpath`
表示用 xpath 方式查找元素。`xpath:`与`xpath=`效果一致。
该方法支持完整的 xpath 语法,能使用 xpath 直接获取元素属性,selenium 不支持这种用法。
@@ -398,11 +397,10 @@ ele2 = ele1.ele('xpath://div')
txt = ele1.ele('xpath://div/@class')
```
-?> **Tips:**
-查找元素的后代时,selenium 原生代码要求 xpath 前面必须加`.`,否则会变成在全个页面中查找。笔者觉得这个设计是画蛇添足,既然已经通过元素查找了,自然应该只查找这个元素内部的元素。所以,用 xpath
+?> **Tips:**
查找元素的后代时,selenium 原生代码要求 xpath 前面必须加`.`,否则会变成在全个页面中查找。笔者觉得这个设计是画蛇添足,既然已经通过元素查找了,自然应该只查找这个元素内部的元素。所以,用 xpath
在元素下查找时,最前面`//`或`/`前面的`.`可以省略。
-## selenium 的 loc 元组
+## 📍 selenium 的 loc 元组
查找方法能直接接收 selenium 原生定位元组进行查找,s 模式下也支持这种写法。
@@ -418,7 +416,7 @@ loc2 = (By.XPATH, '//div[@class="ele_class"]'
ele = page.ele(loc2)
```
-# 等待
+# ✔️ 等待
d 模式下所有查找元素操作都自带等待,默认为跟随元素所在页面`timeout`属性(默认 10 秒),也可以在每次查找时单独设置,单独设置的等待时间不会改变页面原来设置。
@@ -438,20 +436,20 @@ ele2 = ele1.ele('some text')
ele2 = ele1.ele('some text', timeout=1)
```
-# DOM 内相对定位
+# ✔️ DOM 内相对定位
以下方法可以以某元素为基准,在 DOM 中按照条件获取其兄弟元素、祖先元素、文档前后元素。
除获取元素外,还能通过 xpath 获取任意节点内容,如文本节点、注释节点。这在处理元素和文本节点混排的时候非常有用。
-## parent()
+## 📍 `parent()`
此方法获取当前元素某一级父元素,可指定筛选条件或层数。
-参数:
+**参数:**
-- level_or_loc:第几级父元素,或定位符
+- `level_or_loc`:第几级父元素,或定位符
-返回:
+**返回:** 某层父元素
```python
# 获取 ele1 的第二层父元素
@@ -461,17 +459,17 @@ ele2 = ele1.parent(2)
ele2 = ele1.parent('#id1')
```
-## next()
+## 📍 `next()`
此方法返回当前元素后面的某一个兄弟元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素后面某个兄弟元素或节点文本
+**返回:** 本元素后面某个兄弟元素或节点文本
```python
# 获取 ele1 后面第一个兄弟元素
@@ -487,16 +485,16 @@ ele2 = ele1.next(3, 'tag:div')
txt = ele1.next(1, 'xpath:text()')
```
-## nexts()
+## 📍 `nexts()`
此方法返回后面全部符合条件的兄弟元素或节点组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素前面符合条件的兄弟元素或节点文本组成的列表
+**返回:** 本元素前面符合条件的兄弟元素或节点文本组成的列表
```python
# 获取 ele1 后面所有兄弟元素
@@ -509,17 +507,17 @@ divs = ele1.nexts('tag:div')
txts = ele1.nexts('xpath:text()')
```
-## prev()
+## 📍 `prev()`
此方法返回当前元素前面的某一个兄弟元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素前面某个兄弟元素或节点文本
+**返回:** 本元素前面某个兄弟元素或节点文本
```python
# 获取 ele1 前面第一个兄弟元素
@@ -535,16 +533,16 @@ ele2 = ele1.prev(3, 'tag:div')
txt = ele1.prev(1, 'xpath:text()')
```
-## prevs()
+## 📍 `prevs()`
此方法返回前面全部符合条件的兄弟元素或节点组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素前面符合条件的兄弟元素或节点文本组成的列表
+**返回:** 本元素前面符合条件的兄弟元素或节点文本组成的列表
```python
# 获取 ele1 前面所有兄弟元素
@@ -554,17 +552,17 @@ eles = ele1.prevs()
divs = ele1.prevs('tag:div')
```
-## after()
+## 📍 `after()`
此方法返回当前元素后面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素后面某个元素或节点
+**返回:** 本元素后面某个元素或节点
```python
# 获取 ele1 后面第 3 个元素
@@ -577,16 +575,16 @@ ele2 = ele1.after(3, 'tag:div')
txt = ele1.after(1, 'xpath:text()')
```
-## afters()
+## 📍 `afters()`
此方法返回后面符合条件的全部元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素后面符合条件的元素或节点组成的列表
+**返回:** 本元素后面符合条件的元素或节点组成的列表
```python
# 获取 ele1 后所有元素
@@ -596,17 +594,17 @@ eles = ele1.afters()
divs = ele1.afters('tag:div')
```
-## before()
+## 📍 `before()`
此方法返回当前元素前面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素前面某个元素或节点
+**返回:** 本元素前面某个元素或节点
```python
# 获取 ele1 前面第 3 个元素
@@ -619,16 +617,16 @@ ele2 = ele1.before(3, 'tag:div')
txt = ele1.before(1, 'xpath:text()')
```
-## befores()
+## 📍 `befores()`
此方法返回前面全部符合条件的元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素前面符合条件的元素或节点组成的列表
+**返回:** 本元素前面符合条件的元素或节点组成的列表
```python
# 获取 ele1 前面所有元素
@@ -638,22 +636,22 @@ eles = ele1.befores()
divs = ele1.befores('tag:div')
```
-# 页面布局相对定位
+# ✔️ 页面布局相对定位
以下方法用于在页面上根据显示位置定位元素。只能有在 d 模式,selenium4 版本,且 driver 版本较新的情况下才能使用。
与上面通过 DOM 定位的方法不同,这些方法只能获取元素,不能获取节点。
获取多个元素时,元素由近到远排列。
-## left()
+## 📍 `left()`
此方法返回当前元素左边的某一个元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素左边的某个元素
+**返回:** 本元素左边的某个元素
```python
# 获取 ele1 左边第 3 个元素
@@ -663,15 +661,15 @@ ele2 = ele1.left(3)
ele2 = ele1.left(3, 'tag:div')
```
-## lefts()
+## 📍 `lefts()`
此方法返回左边全部符合条件的元素组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素左边符合条件的元素组成的列表
+**返回:** 本元素左边符合条件的元素组成的列表
```python
# 获取 ele1 左边所有元素
@@ -681,16 +679,16 @@ eles = ele1.lefts()
divs = ele1.lefts('tag:div')
```
-## right()
+## 📍 `right()`
此方法返回当前元素左边的某一个元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素左边的某个元素
+**返回:** 本元素左边的某个元素
```python
# 获取 ele1 左边第 3 个元素
@@ -700,15 +698,15 @@ ele2 = ele1.right(3)
ele2 = ele1.right(3, 'tag:div')
```
-## rights()
+## 📍 `rights()`
此方法返回右边全部符合条件的元素组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素右边符合条件的元素组成的列表
+**返回:** 本元素右边符合条件的元素组成的列表
```python
# 获取 ele1 右边所有元素
@@ -718,16 +716,16 @@ eles = ele1.rights()
divs = ele1.rights('tag:div')
```
-## below()
+## 📍 `below()`
此方法返回当前元素下边的某一个元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素下边的某个元素
+**返回:** 本元素下边的某个元素
```python
# 获取 ele1 下边第 3 个元素
@@ -737,15 +735,15 @@ ele2 = ele1.below(3)
ele2 = ele1.below(3, 'tag:div')
```
-## belows()
+## 📍 `belows()`
此方法返回下边全部符合条件的元素组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素下边符合条件的元素组成的列表
+**返回:** 本元素下边符合条件的元素组成的列表
```python
# 获取 ele1 下边所有元素
@@ -755,16 +753,16 @@ eles = ele1.belows()
divs = ele1.belows('tag:div')
```
-## above()
+## 📍 `above()`
此方法返回当前元素上边的某一个元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素上边的某个元素
+**返回:** 本元素上边的某个元素
```python
# 获取 ele1 上边第 3 个元素
@@ -774,15 +772,15 @@ ele2 = ele1.above(3)
ele2 = ele1.above(3, 'tag:div')
```
-## aboves()
+## 📍 `aboves()`
此方法返回上边全部符合条件的元素组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素上边符合条件的元素组成的列表
+**返回:** 本元素上边符合条件的元素组成的列表
```python
# 获取 ele1 上边所有元素
@@ -792,16 +790,16 @@ eles = ele1.aboves()
divs = ele1.aboves('tag:div')
```
-## near()
+## 📍 `near()`
此方法返回最接近当前元素的某一个元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- index:查询结果中的第几个
-- filter_loc:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `filter_loc`:用于筛选元素的查询语法
-返回:最接近本元素的某个元素
+**返回:** 最接近本元素的某个元素
```python
# 获取最接近 ele1 的第 3 个元素
@@ -811,15 +809,15 @@ ele2 = ele1.near(3)
ele2 = ele1.near(3, 'tag:div')
```
-## nears()
+## 📍 `nears()`
此方法返回该元素附近全部符合条件的元素组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
+- `filter_loc`:用于筛选元素的查询语法
-返回:本元素附近符合条件的元素组成的列表
+**返回:** 本元素附近符合条件的元素组成的列表
```python
# 获取 ele1 附近所有元素
@@ -829,13 +827,12 @@ eles = ele1.nears()
divs = ele1.nears('tag:div')
```
-# `ShadowRootElement`相关查找
+# ✔️ `ShadowRootElement`相关查找
本库把 shadow-root 也作为元素对象看待,是为`ShadowRootElement`对象。对`ShadowRootElement`对象可与普通元素一样查找下级元素和 DOM 内相对定位,但不能用页面布局相对定位。
对`ShadowRootElement`对象进行相对定位时,把它看作其父对象内部的第一个对象,其余定位逻辑与普通对象一致。
-!> **注意:**
-如果`ShadowRootElement`元素的下级元素中有其它`ShadowRootElement`元素,那这些下级`ShadowRootElement`
+!> **注意:**
如果`ShadowRootElement`元素的下级元素中有其它`ShadowRootElement`元素,那这些下级`ShadowRootElement`
元素内部是无法直接通过定位语句查找到的,只能先定位到其父元素,再用`shadow-root`属性获取。
```python
@@ -855,7 +852,7 @@ eles = sr_ele.nexts('tag:div')
sr_ele2 = sr_ele.ele('tag:div').shadow_root
```
-# 简化写法
+# ✔️ 简化写法
为进一步精简代码,对语法进行了精简
@@ -881,16 +878,16 @@ ele2 = ele1('x://div[@class="ele_class"]')
简化写法对应列表
-| 原写法 | 简化写法 |
-|:-----------:|:----:|
-| text | tx |
-| text() | tx() |
-| tag | t |
-| xpath | x |
-| css | c |
-| shadow_root | sr |
+| 原写法 | 简化写法 |
+|:-------------:|:------:|
+| `text` | `tx` |
+| `text()` | `tx()` |
+| `tag` | `t` |
+| `xpath` | `x` |
+| `css` | `c` |
+| `shadow_root` | `sr` |
-# Tips
+# ✔️ Tips
- 从一个`DriverElement`元素获取到的`SessionElement`版本,依然能够使用相对定位方法定位祖先或兄弟元素。
- `SessionElement`和`SessionPage`的`ele()`和`eles()`方法也有`timeout`参数,但它是不生效的,仅用于保持与 d 模式元素书写一致,便于无差别的调用。
diff --git a/docs/MixPage使用方法/获取元素信息.md b/docs/MixPage使用方法/获取元素信息.md
index 193a3df..12baffb 100644
--- a/docs/MixPage使用方法/获取元素信息.md
+++ b/docs/MixPage使用方法/获取元素信息.md
@@ -5,7 +5,7 @@
`ShadowRootElement`由于是 shadow dom 元素,属性比较其余两种少,下文单独介绍。
-# 示例
+# ✔️ 示例
```python
from DrissionPage import MixPage
@@ -29,7 +29,7 @@ a 车载应用 https://gitee.com/explore/vehicle
"""
```
-# 两种模式共有属性
+# ✔️ 两种模式共有属性
假设`ele`为以下`div`元素的对象:
@@ -40,7 +40,7 @@ a 车载应用 https://gitee.com/explore/vehicle
```
-## html
+## 📍 `html`
此属性返回元素的`outerHTML`文本。
@@ -54,7 +54,7 @@ html = ele.html
"""
```
-## inner_html
+## 📍 `inner_html`
此属性返回元素的`innerHTML`文本。
@@ -67,7 +67,7 @@ Hello World!
"""
```
-## tag
+## 📍 `tag`
此属性返回元素的标签名。
@@ -76,7 +76,7 @@ tag = ele.tag
# 返回:div
```
-## text
+## 📍 `text`
此属性返回元素内所有文本组合成的字符串。
该字符串已格式化,即已转码,已去除多余换行符,符合人读取习惯,便于直接使用。无须重复写处理代码。
@@ -89,7 +89,7 @@ Hello World!
"""
```
-## raw_text
+## 📍 `raw_text`
此属性返回元素内原始文本。
@@ -103,15 +103,15 @@ Hello World!
"""
```
-## texts()
+## 📍 `texts()`
此方法返回元素内所有直接子节点的文本,包括元素和文本节点。 它有一个参数`text_node_only`,为`True`时则只获取只返回文本节点。这个方法适用于获取文本节点和元素节点混排的情况。
-参数:
+**参数:**
-- text_node_only:是否只返回文本节点
+- `text_node_only`:是否只返回文本节点
-返回:文本列表
+**返回:** 文本列表
```python
texts = ele.texts()
@@ -122,14 +122,14 @@ print(e.texts())
# 输出:['Hello World!']
```
-## comments
+## 📍 `comments`
```python
comments = ele.comments
# 返回:[]
```
-## attrs
+## 📍 `attrs`
此属性以字典形式返回元素所有属性及值。
@@ -138,23 +138,23 @@ attrs = ele.attrs
# 返回:{'id': 'div1'}
```
-## attr()
+## 📍 `attr()`
此方法返回元素某个`attribute`属性值。它接收一个字符串参数`attr`,返回该属性值文本,无该属性时返回`None`。
此属性返回的`src`、`href`属性为已补充完整的路径。`text`属性为已格式化文本,`innerText`属性为未格式化文本。
-参数:
+**参数:**
-- attr:属性名称
+- `attr`:属性名称
-返回:属性值文本
+**返回:** 属性值文本
```python
ele_id = ele.attr('id')
# 返回:div1
```
-## link
+## 📍 `link`
此方法返回元素的 href 属性或 src 属性,没有这两个属性则返回`None`。
@@ -169,7 +169,7 @@ link = a_ele.link
# 返回:http://www.baidu.com
```
-## page
+## 📍 `page`
此属性返回元素所在的页面对象。
@@ -180,7 +180,7 @@ link = a_ele.link
page = ele.page
```
-## inner_ele
+## 📍 `inner_ele`
此属性返回被当前元素包装的对应模式原本的元素对象。
d 模式包装的是一个 selenium 的`WebElement`对象,s 模式包装的是一个 lxml 的`HtmlElement`对象。
@@ -193,7 +193,7 @@ web_ele = ele.inner_ele
web_ele.find_element(By.ID, 'ele_id').click()
```
-## xpath
+## 📍 `xpath`
此属性返回当前元素在页面中 xpath 的绝对路径。
@@ -202,7 +202,7 @@ xpath = ele.xpath
# 返回:/html/body/div
```
-## css_path
+## 📍 `css_path`
此属性返回当前元素在页面中 css selector 的绝对路径。
@@ -211,21 +211,21 @@ css = ele.css_path
# 返回::nth-child(1)>:nth-child(1)>:nth-child(1)
```
-## is_valid()
+## 📍 `is_valid()`
此方法返回当前元素是否可用。`SessionElement`始终返回`True`,`DriverElement`视乎元素是否还在 DOM 内返回布尔值。
-参数:无
+**参数:** 无
-返回:`bool`类型
+**返回:**`bool`类型
```python
is_valid = ele.is_valid()
```
-# DriverElement 独有属性
+# ✔️ DriverElement 独有属性
-## size
+## 📍 `size`
此属性以字典形式返回元素的大小。
@@ -234,7 +234,7 @@ size = ele.size
# 返回:{'height': 50, 'width': 50}
```
-## location
+## 📍 `location`
此属性以字典形式返回元素坐标。
@@ -243,7 +243,7 @@ loc = ele.location
# 返回:{'x': 50, 'y': 50}
```
-## pseudo_before
+## 📍 `pseudo_before`
此属性以文本形式返回当前元素的`::before`伪元素内容。
@@ -251,7 +251,7 @@ loc = ele.location
before_txt = ele.pseudo_before
```
-## pseudo_after
+## 📍 `pseudo_after`
此属性以文本形式返回当前元素的`::after`伪元素内容。
@@ -259,16 +259,16 @@ before_txt = ele.pseudo_before
after_txt = ele.pseudo_after
```
-## style()
+## 📍 `style()`
该方法返回元素 css 样式属性值,可获取伪元素的属性。它有两个参数,`style`参数输入样式属性名称,`pseudo_ele`参数输入伪元素名称,省略则获取普通元素的 css 样式属性。
-参数:
+**参数:**
-- style:样式名称
-- pseudo_ele: 伪元素名称(如有)
+- `style`:样式名称
+- `pseudo_ele`:伪元素名称(如有)
-返回:样式属性值
+**返回:** 样式属性值
```python
# 获取 css 属性的 color 值
@@ -278,92 +278,92 @@ prop = ele.style('color')
prop = ele.style('content', 'after')
```
-## prop()
+## 📍 `prop()`
此方法返回`property`属性值。它接收一个字符串参数,返回该参数的属性值。
-参数:
+**参数:**
-- prop:属性名称
+- `prop`:属性名称
-返回:属性值
+**返回:** 属性值
```python
prop = ele.prop('value')
```
-## select
+## 📍 `select`
此属性返回 `select` 元素用于处理下拉列表的 Select 类(“[元素操作](元素操作.md)”章节说明),非下拉列表元素返回`False`。
-## is_selected()
+## 📍 `is_selected()`
此方法以布尔值返回元素是否选中。
-参数:无
+**参数:** 无
-返回:布尔值
+**返回:** `bool`
```python
selected = ele.is_selected()
```
-## is_enabled()
+## 📍 `is_enabled()`
此方法以布尔值返回元素是否可用。
-参数:无
+**参数:** 无
-返回:布尔值
+**返回:**`bool`
```python
enable = ele.is_enabled()
```
-## is_displayed()
+## 📍 `is_displayed()`
此方法以布尔值返回元素是否可见。
-参数:无
+**参数:** 无
-返回:布尔值
+**返回:**`bool`
```python
displayed = ele.is_displayed()
```
-# `ShadowRootElement`属性与方法
+# ✔️ `ShadowRootElement`属性与方法
本库把 shadow dom 的`root`看作一个元素处理,可以获取属性,也可以执行其下级的查找,但其属性比较少。有如下这些:
-## tag
+## 📍 `tag`
此属性返回元素标签名,即`'shadow-root'`。
-## html
+## 📍 `html`
此属性返回`shadow_root`的 html 文本,由`` 标签包裹。
-## inner_html
+## 📍 `inner_html`
此属性返回`shadow_root`内部的 html 文本。
-## page
+## 📍 `page`
此属性返回元素所在页面对象。
-## inner_ele
+## 📍 `inner_ele`
此属性返回对象中保存的`shadow-root`元素。
-## parent_ele
+## 📍 `parent_ele`
这是`ShadowRootElement`独有的属性,返回它所依附的普通元素对象。
-## is_enabled()
+## 📍 `is_enabled()`
与`DriverElement`一致。
-## is_valid()
+## 📍 `is_valid()`
与`DriverElement`一致。
diff --git a/docs/MixPage使用方法/获取网页信息.md b/docs/MixPage使用方法/获取网页信息.md
index 2498d03..1613dd7 100644
--- a/docs/MixPage使用方法/获取网页信息.md
+++ b/docs/MixPage使用方法/获取网页信息.md
@@ -1,42 +1,42 @@
本节介绍获取页面对象各种信息的属性和方法。
-# 两种模式共有属性
+# ✔️ 两种模式共有属性
-## url
+## 📍 `url`
此属性返回当前访问的 url。
-## mode
+## 📍 `mode`
此属性返回当前页面对象的模式,`'s'`或`'d'`。
-## drission
+## 📍 `drission`
此属性返回当前页面对象使用的`Drission`对象。
-## driver
+## 📍 `driver`
此属性返回当前页面对象使用的`WebDriver`对象。访问时会自动切换到 d 模式。
-## session
+## 📍 `session`
此属性返回当前页面对象使用的`Session`对象。访问时不会切换模式。
-## cookies
+## 📍 `cookies`
此属性以`dict`方式返回当前页面所使用的 cookies。
d 模式只返回当前标签页的 cookies,s 模式则只返回当前访问的 url 的`cookies`。
-## get_cookies()
+## 📍 `get_cookies()`
此方法获取 cookies 并以 cookie 组成的`list`形式返回。
-参数:
+**参数:**
-- as_dict:是否以字典方式返回,为`False`返回`cookie`组成的`list`
-- all_domains:是否返回所有域的`cookies`,只有 s 模式下生效
+- `as_dict`:是否以字典方式返回,为`False`返回`cookie`组成的`list`
+- `all_domains`:是否返回所有域的`cookies`,只有 s 模式下生效
-返回:`cookies`信息
+**返回:**`cookies`信息
```python
from DrissionPage import MixPage
@@ -58,15 +58,15 @@ for i in p.get_cookies(as_dict=False, all_domains=True):
......
```
-## html
+## 📍 `html`
此属性返回当前页面 html 文本。
-## title
+## 📍 `title`
此属性返回当前页面`title`文本。
-## timeout
+## 📍 `timeout`
s 模式下,此属性代表网络请求超时时间。
d 模式下,此属性为元素查找、点击、处理提示框等操作的超时时间。
@@ -80,7 +80,7 @@ page = MixPage(timeout=5)
page.timeout = 20
```
-## retry_times
+## 📍 `retry_times`
此参数为网络连接失败时的重试次数。默认为 3,可对其赋值。
@@ -89,7 +89,7 @@ page.timeout = 20
page.retry_times = 5
```
-## retry_interval
+## 📍 `retry_interval`
此参数为网络连接失败时的重试等待间隔秒数。默认为 2,可对其赋值。
@@ -98,15 +98,15 @@ page.retry_times = 5
page.retry_interval = 1.5
```
-## url_available
+## 📍 `url_available`
此属性以布尔值返回当前链接是否可用。
s 模式下根据`Response`对象的`status_code`判断。
d 模式根据`check_page()`方法返回值判断。
-# s 模式独有属性
+# ✔️ s 模式独有属性
-## response
+## 📍 `response`
此属性为 s 模式请求网站后生成的`Response`对象,本库没实现的功能可直接获取此属性调用 requests 库的原生功能。
@@ -116,15 +116,15 @@ r = page.response
print(r.status_code)
```
-## json
+## 📍 `json`
此属性把请求内容解析成 json。
比如请求接口时,返回内容是 json 格式,那就可以用这个属性获取。
事实上,用 html 属性获取也是可以的,不过 html 属性没有对文本进行解析。
-# d 模式独有属性
+# ✔️ d 模式独有属性
-## timeouts
+## 📍 `timeouts`
此属性以字典方式返回三种超时时间,selenium 4 以上版本可用。
`'implicit'`用于元素查找、点击重试、输入文本重试、处理弹出框重试等;
@@ -141,41 +141,41 @@ print(page.timeouts)
{'implicit': 10, 'pageLoad': 30.0, 'script': 30.0}
```
-## tabs_count
+## 📍 `tabs_count`
此属性返回当前浏览器标签页数量。
-## tab_handles
+## 📍 `tab_handles`
此属性以列表形式返回当前浏览器所有标签页的 handle。
!> **注意:**
以下情况会导致获取到的顺序与视觉效果不一致:1、自动化过程中手动点击标签页;2、浏览器被接管时已打开一个以上标签页。
-## current_tab_index
+## 📍 `current_tab_index`
此属性返回当前标签页的序号。
!> **注意:**
以下情况会导致获取到的排序号与视觉效果不一致:1、自动化过程中手动点击标签页;2、浏览器被接管时已打开一个以上标签页。
-## current_tab_handle
+## 📍 `current_tab_handle`
此属性返回当前标签页的 handle。
-## active_ele
+## 📍 `active_ele`
此属性返回当前页面上焦点所在元素。类型为`DriverElement`。
-## wait_obj
+## 📍 `wait_obj`
此属性返回当前页面对象用于等待的对象。
-## chrome_downloading()
+## 📍 `chrome_downloading()`
此方法返回浏览器下载中的文件列表。
-参数:
+**参数:**
-- path: 下载文件夹路径,默认从配置信息读取
+- `path:` 下载文件夹路径,默认从配置信息读取
-返回:下载中的文件列表
+**返回:** 下载中的文件列表
diff --git a/docs/MixPage使用方法/访问网页.md b/docs/MixPage使用方法/访问网页.md
index 80edb2c..6b5192e 100644
--- a/docs/MixPage使用方法/访问网页.md
+++ b/docs/MixPage使用方法/访问网页.md
@@ -1,23 +1,23 @@
操作页面前通常要先跳转到目标 url(接管现有浏览器除外),本库访问网页主要支持`get()`和`post()`两种方式,还支持自动重试。
-# get()
+# ✔️ `get()`
该方法在 d 模式和 s 模式下都可用,用于跳转到一个网址。
当连接失败时,程序默认重试 3 次,每次间隔 2 秒,也可以通过参数设置重试次数和间隔。
在 s 模式下,可传入连接参数,语法与 requests 的`get()`方法一致。
方法返回是否连接成功的布尔值,s 模式下根据`Response`对象的`status_code`参数决定,d 模式下根据浏览器的状态,还可以通过重写`check_page()`方法实现自定义检查方式。
-参数:
+**参数:**
-- url:目标 url
-- show_errmsg:是否显示和抛出异常,默认不抛出,连接错误会返回`None`
-- retry:重试次数,与页面对象的设置一致,默认 3 次
-- interval:重试间隔(秒),与页面对象的设置一致,默认 2 秒
-- **kwargs:连接参数,s 模式专用,与 requests 的使用方法一致
+- `url`:目标 url
+- `show_errmsg`:是否显示和抛出异常,默认不抛出,连接错误会返回`None`
+- `retry`:重试次数,与页面对象的设置一致,默认 3 次
+- `interval`:重试间隔(秒),与页面对象的设置一致,默认 2 秒
+- `**kwargs`:连接参数,s 模式专用,与 requests 的使用方法一致
-返回:`bool`类型,表示是否连接成功,d 模式下如返回`None`表示不确定
+**返回:**`bool`类型,表示是否连接成功,d 模式下如返回`None`表示不确定
-## d 模式
+## 📍 d 模式
```python
from DrissionPage import MixPage
@@ -26,7 +26,7 @@ page = MixPage('d')
page.get('https://www.baidu.com')
```
-## s 模式
+## 📍 s 模式
s 模式的`**kwargs`参数与 requests 中该参数使用方法一致,但有一个特点,如果该参数中设置了某一项(如`headers`),该项中的每个项会覆盖从配置中读取的同名项,而不会整个覆盖。
就是说,如果想继续使用配置中的`headers`信息,而只想修改其中一项,只需要传入该项的值即可。这样可以简化代码逻辑。
@@ -48,19 +48,19 @@ proxies = {'http': '127.0.0.1:1080', 'https': '127.0.0.1:1080'}
page.get(url, headers=headers, cookies=cookies, proxies=proxies)
```
-# post()
+# ✔️ `post()`
此方法是用 post 方式请求页面。大致用法与`get()`一致,但增加一个`data`参数。
此方法只有 s 模式拥有,调用时,页面对象会自动切换到 s 模式。
-参数:
+**参数:**
-- url:目标 url
-- data:提交的数据,可以是`dict`或`str`类型
-- show_errmsg:是否显示和抛出异常,默认不抛出,连接错误会返回 None
-- retry:重试次数,与页面对象的设置一致,默认 3 次
-- interval:重试间隔(秒),与页面对象的设置一致,默认 2 秒
-- **kwargs:连接参数,s 模式专用
+- `url`:目标 url
+- `data`:提交的数据,可以是`dict`或`str`类型
+- `show_errmsg`:是否显示和抛出异常,默认不抛出,连接错误会返回 None
+- `retry`:重试次数,与页面对象的设置一致,默认 3 次
+- `interval`:重试间隔(秒),与页面对象的设置一致,默认 2 秒
+- `**kwargs`:连接参数,s 模式专用
?> **Tips:**
虽然参数里没有`json`参数,但也和 requests 一样可以对`json`参数传值。
@@ -91,7 +91,7 @@ page.post(url, json='xxx')
page.post(url, json={'xxx': 'xxx'})
```
-# 其它请求方式
+# ✔️ 其它请求方式
本库只针对常用的 get 和 post 方式作了优化,但也可以通过提取页面对象内的`Session`对象以原生 requests 代码方式执行其它请求方式。当然,它们工作在 s 模式。
diff --git a/docs/MixPage使用方法/页面操作.md b/docs/MixPage使用方法/页面操作.md
index a927a77..c4da87f 100644
--- a/docs/MixPage使用方法/页面操作.md
+++ b/docs/MixPage使用方法/页面操作.md
@@ -1,28 +1,24 @@
本节介绍页面对象可以使用的方法,有些方法是两种模式共有的,有些只有某种模式可以使用。当调用独有方法时,会自动切换到该模式。如调用`post()`方法时,会先切换到 s 模式,并同步登录信息。
-# 两种模式共有的方法
+# ✔️ 两种模式共有的方法
-## get()
+## 📍 `get()`
-此方法用于跳转到一个 url,详细用法见“[使用方法 -> 访问网页](使用方法/访问网页.md)”章节。
+此方法用于跳转到一个 url,详细用法见“访问网页”章节。
-## ele()、eles()、s_ele()、s_eles()
-
-这些方法用于在页面中查找元素,详细用法见“[使用方法 -> 查找页面元素](使用方法/查找页面元素)”章节。
-
-## change_mode()
+## 📍 `change_mode()`
此方法用于转换`MixPage`对象的模式。
切换后默认在目标模式重新跳转到原模式所在 url。
!> **注意:**
s 模式转 d 模式时,若浏览器当前网址域名和 s 模式不一样,必定会跳转。
-参数:
+**参数:**
-- mode:目标模式字符串,`'s'`或`'d'`,默认转换到另一种
-- go:转换后是否跳转到原模式所在 url
+- `mode`:目标模式字符串,`'s'`或`'d'`,默认转换到另一种
+- `go`:转换后是否跳转到原模式所在 url
-返回:`None`
+**返回:**`None`
```python
from DrissionPage import MixPage
@@ -60,106 +56,106 @@ print('登录后title:', page.title)
登录后title: 个人资料 - 码云 Gitee.com
```
-## set_cookies()
+## 📍 `set_cookies()`
此方法用于设置`cookies`。
可以接收`CookieJar`、`list`、`tuple`、`str`、`dict`格式的`cookies`。
-参数:
+**参数:**
-- cookies:`cookies`信息
-- refresh:设置`cookies`后是否刷新页面
+- `cookies`:`cookies`信息
+- `refresh`:设置`cookies`后是否刷新页面
-返回:`None`
+**返回:**`None`
```python
cookies = {'name': 'abc'}
page.set_cookies(cookies)
```
-## cookies_to_session()
+## 📍 `cookies_to_session()`
此方法用于从`WebDriver`对象复制`cookies`到`Session`对象。
-参数:
+**参数:**
-- copy_user_agent:是否同时复制 user agent 信息
+- `copy_user_agent`:是否同时复制 user agent 信息
-返回:`None`
+**返回:**`None`
-## cookies_to_driver()
+## 📍 `cookies_to_driver()`
此方法用于从`Session`对象复制`cookies`到`WebDriver`对象。
-参数:
+**参数:**
-- url:指定 url,默认用当前 url
+- `url`:指定 url,默认用当前 url
-返回:`None`
+**返回:**`None`
-## download()
+## 📍 `download()`
-此方法用于下载文件,详细用法见“[使用方法 -> 下载文件](下载文件.md)”章节。
+此方法用于下载文件,详细用法见“下载文件”章节。
-## close_driver()
+## 📍 `close_driver()`
此方法用于关闭`WebDriver`对象和浏览器。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## close_session()
+## 📍 `close_session()`
此方法用于关闭`Session`对象。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-# s 模式独有方法
+# ✔️ s 模式独有方法
-## post()
+## 📍 `post()`
-此方法用于以 post 方式访问 url,具体用法见“[使用方法 -> 访问网页](访问网页.md)”章节。
+此方法用于以 post 方式访问 url,具体用法见“访问网页”章节。
-# d 模式独有方法
+# ✔️ d 模式独有方法
-## hide_browser()
+## 📍 `hide_browser()`
此方法用于隐藏浏览器进程窗口,非最小化,任务栏上也可隐藏。
但若操作过程中有新增标签页,浏览器会重新出现。 只支持 Windows 系统,且只有设置了`local_port`或`debugger_address`时生效。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## show_browser()
+## 📍 `show_browser()`
此方法用于显示被隐藏的浏览器进程。
只支持 Windows 系统,且只有设置了`local_port`或`debugger_address`时生效。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## wait_ele()
+## 📍 `wait_ele()`
此方法用于等待元素到达某种状态。
调用此方法返回一个`ElementWaiter`对象,调用该对象方法实现各种方式的等待。
-参数:
+**参数:**
-- loc_or_ele:要等待的元素,可以是元素或定位符
-- timeout:等待超时时间,默认使用页面超时时间
+- `loc_or_ele`:要等待的元素,可以是元素或定位符
+- `timeout`:等待超时时间,默认使用页面超时时间
-方法:
+**方法:**
-| 方法 | 参数说明 | 功能 |
-|:---------:|:----:|:------------:|
-| display() | 无 | 等待元素从 DOM 显示 |
-| hidden() | 无 | 等待元素从 DOM 隐藏 |
-| delete() | 无 | 等待元素从 DOM 删除 |
+| 方法 | 参数说明 | 功能 |
+|:-----------:|:----:|:------------:|
+| `display()` | 无 | 等待元素从 DOM 显示 |
+| `hidden()` | 无 | 等待元素从 DOM 隐藏 |
+| `delete()` | 无 | 等待元素从 DOM 删除 |
这些方法返回布尔值,代表是否等待成功。
@@ -175,148 +171,148 @@ ele = page.ele('#div1')
paeg.wait_ele(ele).hidden()
```
-## run_script()
+## 📍 `run_script()`
此方法用于执行 js 脚本。
-参数:
+**参数:**
-- script:js 脚本文本
-- *args:传入的参数
+- `script`:js 脚本文本
+- `*args`:传入的参数
-返回:脚本执行结果
+**返回:** 脚本执行结果
```python
# 执行 js 脚本显示弹出框显示 Hello world!
page.run_script('alert(arguments[0]+arguments[1])', 'Hello', ' world!')
```
-## run_async_script()
+## 📍 `run_async_script()`
此方法用于以异步方式执行 js 脚本。
-参数:
+**参数:**
-- script:js 脚本文本
-- *args:传入的参数
+- `script`:js 脚本文本
+- `*args`:传入的参数
-返回:脚本执行结果
+**返回:** 脚本执行结果
-## run_cdp()
+## 📍 `run_cdp()`
此方法用于执行 Chrome DevTools Protocol 语句。cdp
用法详见[Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/)。
-参数:
+**参数:**
-- cmd:协议项目方法
+- `cmd`:协议项目方法
-- **cmd_args:项目参数
+- `**cmd_args`:项目参数
-返回:该语句返回的值
+**返回:** 该语句返回的值
```python
# 停止页面加载
page.run_cdp('Page.stopLoading')
```
-## set_timeouts()
+## 📍 `set_timeouts()`
此方法用于设置三种超时时间,selenium 4 以上版本生效。
-参数:
+**参数:**
-- implicit:查找元素超时时间
-- pageLoad:页面加载超时时间
-- script:脚本运行超时时间
+- `implicit`:查找元素超时时间
+- `pageLoad`:页面加载超时时间
+- `script`:脚本运行超时时间
-返回:`None`
+**返回:**`None`
-## set_ua_to_tab()
+## 📍 `set_ua_to_tab()`
此方法用于为当前 tab 设置 user agent,只在当前 tab 有效。
-参数:
+**参数:**
-- ua:user agent字符串
+- `ua`:user agent字符串
-返回:None
+**返回:**`None`
-## get_session_storage()
+## 📍 `get_session_storage()`
此方法用于获取 sessionStorage 信息,可获取全部或单个项。
-参数:
+**参数:**
-- item:要获取的项,不设置则返回全部
+- `item`:要获取的项,不设置则返回全部
-返回:sessionStorage 一个或所有项内容
+**返回:** sessionStorage 一个或所有项内容
-## get_local_storage()
+## 📍 `get_local_storage()`
此方法用于获取 localStorage 信息,可获取全部或单个项。
-参数:
+**参数:**
-- item:要获取的项,不设置则返回全部
+- `item`:要获取的项,不设置则返回全部
-返回:localStorage 一个或所有项内容
+**返回:** localStorage 一个或所有项内容
-## set_session_storage()
+## 📍 `set_session_storage()`
此方法用于设置或删除某项 sessionStorage 信息。
-参数:
+**参数:**
-- item:要设置的项
+- `item`:要设置的项
-- value:项的值,设置为False时,删除该项
+- `value`:项的值,设置为False时,删除该项
-返回:`None`
+**返回:**`None`
-## set_local_storage()
+## 📍 `set_local_storage()`
此方法用于设置或删除某项 localStorage 信息。
-参数:
+**参数:**
-- item:要设置的项
+- `item`:要设置的项
-- value:项的值,设置为False时,删除该项
+- `value`:项的值,设置为False时,删除该项
-返回:`None`
+**返回:**`None`
-## clean_cache()
+## 📍 clean_cache()
此方法用于清除缓存,可选要清除的项。
-参数:
+**参数:**
-- session_storage:是否清除 sessionstorage
+- `session_storage`:是否清除 sessionstorage
-- local_storage:是否清除 localStorage
+- `local_storage`:是否清除 localStorage
-- cache:是否清除 cache
+- `cache`:是否清除 cache
-- cookies:是否清除 cookies
+- `cookies`:是否清除 cookies
-返回:`None`
+**返回:**`None`
-## to_frame
+## 📍 `to_frame`
此属性用于将页面焦点移到某个`frame`或`iframe`。
调用此属性返回一个`ToFrame`对象,调用该对象的方法实现焦点转移。
这些方法返回值为当前页面对象,可实现下一步的链式操作。
-| 方法 | 参数说明 | 功能 |
-|:---------------:|:-------:|:----------------:|
-| main() | 无 | 切换到顶层框架 |
-| parent(level) | 第几层上级框架 | 切换到上级框架,可指定多层 |
-| by_id(id) | id 属性 | 切换到`id`为该参数的框架 |
-| by_name(name) | name 属性 | 切换到`name`为该参数的框架 |
-| by_index(index) | 序号 | 切换到页面第几个框架,0 开始 |
-| by_loc(loc) | 定位符 | 切换到定位符所指框架 |
-| by_ele(ele) | 框架元素 | 传入框架元素,切换到该框架 |
+| 方法 | 参数说明 | 功能 |
+|:-----------------:|:-------:|:----------------:|
+| `main()` | 无 | 切换到顶层框架 |
+| `parent(level)` | 第几层上级框架 | 切换到上级框架,可指定多层 |
+| `by_id(id)` | id 属性 | 切换到`id`为该参数的框架 |
+| `by_name(name)` | name 属性 | 切换到`name`为该参数的框架 |
+| `by_index(index)` | 序号 | 切换到页面第几个框架,0 开始 |
+| `by_loc(loc)` | 定位符 | 切换到定位符所指框架 |
+| `by_ele(ele)` | 框架元素 | 传入框架元素,切换到该框架 |
```python
# 切换到主框架
@@ -362,18 +358,17 @@ iframe = page.ele('tag:iframe')
page.to_frame(iframe)
```
-!> **注意:**
-新版本删除了`to_frame('main')`和`to_frame('parent')`的用法。
请改用`page.to_frame.main()`和`page.to_frame.parent()`的写法。
+!> **注意:**
新版本删除了`to_frame('main')`和`to_frame('parent')`的用法。
请改用`page.to_frame.main()`和`page.to_frame.parent()`的写法。
-## to_tab()
+## 📍 `to_tab()`
此方法把焦点定位到某个标签页。
-参数:
+**参数:**
-- num_or_handle:标签页序号或 handle 字符串,序号第一个为 0,最后为 -1
+- `num_or_handle`:标签页序号或 handle 字符串,序号第一个为 0,最后为 -1
-返回:None
+**返回:**`None`
!> **注意:**
以下情况会导致获取到的排序号与视觉效果不一致:1、自动化过程中手动点击标签页;2、浏览器被接管时已打开一个以上标签页。
@@ -385,31 +380,31 @@ page.to_tab(0)
page.to_tab('xxxxxxxxxxxxxxxxxxxx')
```
-## create_tab()
+## 📍 `create_tab()`
此方法用于新建并定位到一个标签页,该标签页在最后面。可指定跳转到一个 url。
-参数:
+**参数:**
-- url:新标签页跳转到的 url
+- `url`:新标签页跳转到的 url
-返回:`None`
+**返回:**`None`
```python
page.create_tab('http://www.baidu.com')
```
-## close_tabs()
+## 📍 `close_tabs()`
此方法用于关闭指定的标签页,标签页可以是序号或 handle 值,可关闭多个。默认关闭当前的。
!> **注意:**
以下情况会导致获取到的排序号与视觉效果不一致,不能按序号关闭:1、自动化过程中手动点击标签页;2、浏览器被接管时已打开一个以上标签页。
-参数:
+**参数:**
-- num_or_handles:要保留的标签页序号或 handle,可传入 list 或 tuple,为None时关闭当前页
+- `num_or_handles`:要保留的标签页序号或 handle,可传入 list 或 tuple,为None时关闭当前页
-返回:`None`
+**返回:**`None`
```python
# 关闭当前标签页
@@ -419,17 +414,17 @@ page.close_tabs()
page.close_tabs((0, 2))
```
-## close_other_tabs()
+## 📍 `close_other_tabs()`
此方法用于关闭指定标签页以外的标签页,标签页可以是序号或 handle 值,可保留多个。默认保留当前的。
!> **注意:**
以下情况会导致获取到的排序号与视觉效果不一致,不能按序号关闭:1、自动化过程中手动点击标签页;2、浏览器被接管时已打开一个以上标签页。
-参数:
+**参数:**
-- num_or_handles:要保留的标签页序号或 handle,可传入`list`或`tuple`,为`None`时关闭当前页
+- `num_or_handles`:要保留的标签页序号或 handle,可传入`list`或`tuple`,为`None`时关闭当前页
-返回:`None`
+**返回:**`None`
```python
# 关闭除当前标签页外的所有标签页
@@ -443,23 +438,23 @@ reserve_list = ('aaaaa', 'bbbbb')
page.close_other_tabs(reserve_list)
```
-## scroll
+## 📍 `scroll`
此属性用于以某种方式滚动页面。
调用此属性返回一个`Scroll`对象,调用该对象方法实现各种方式的滚动。
-| 方法 | 参数说明 | 功能 |
-|:-----------------:|:------:|:----------------:|
-| to_top() | 无 | 滚动到顶端,水平位置不变 |
-| to_bottom() | 无 | 滚动到底端,水平位置不变 |
-| to_half() | 无 | 滚动到垂直中间位置,水平位置不变 |
-| to_rightmost() | 无 | 滚动到最右边,垂直位置不变 |
-| to_leftmost() | 无 | 滚动到最左边,垂直位置不变 |
-| to_location(x, y) | 滚动条坐标值 | 滚动到指定位置 |
-| up(pixel) | 滚动的像素 | 向上滚动若干像素,水平位置不变 |
-| down(pixel) | 滚动的像素 | 向下滚动若干像素,水平位置不变 |
-| right(pixel) | 滚动的像素 | 向左滚动若干像素,垂直位置不变 |
-| left(pixel) | 滚动的像素 | 向右滚动若干像素,垂直位置不变 |
+| 方法 | 参数说明 | 功能 |
+|:-------------------:|:------:|:----------------:|
+| `to_top()` | 无 | 滚动到顶端,水平位置不变 |
+| `to_bottom()` | 无 | 滚动到底端,水平位置不变 |
+| `to_half()` | 无 | 滚动到垂直中间位置,水平位置不变 |
+| `to_rightmost()` | 无 | 滚动到最右边,垂直位置不变 |
+| `to_leftmost()` | 无 | 滚动到最左边,垂直位置不变 |
+| `to_location(x, y)` | 滚动条坐标值 | 滚动到指定位置 |
+| `up(pixel)` | 滚动的像素 | 向上滚动若干像素,水平位置不变 |
+| `down(pixel)` | 滚动的像素 | 向下滚动若干像素,水平位置不变 |
+| `right(pixel)` | 滚动的像素 | 向左滚动若干像素,垂直位置不变 |
+| `left(pixel)` | 滚动的像素 | 向右滚动若干像素,垂直位置不变 |
```python
# 页面滚动到底部
@@ -475,15 +470,15 @@ page.scroll.down(200)
page.scroll.to_location(100, 300)
```
-## scroll_to_see()
+## 📍 `scroll_to_see()`
此方法用于滚动页面直到元素可见。
-参数:
+**参数:**
-- loc_or_ele:元素的定位信息,可以是元素、定位符
+- `loc_or_ele`:元素的定位信息,可以是元素、定位符
-返回:`None`
+**返回:**`None`
```python
# 滚动到某个已获取到的元素
@@ -497,68 +492,68 @@ page.scroll_to_see('tag:div')
page.scroll_to_see((By.XPATH, '//div'))
```
-## refresh()
+## 📍 `refresh()`
此方法用于刷新当前页面。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## stop_loading()
+## 📍 `stop_loading()`
此方法用于强制当前页面加载。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## back()
+## 📍 `back()`
此方法用于在浏览历史中后退一步。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## forward()
+## 📍 `forward()`
此方法用于在浏览历史中前进一步。
-参数:无
+**参数:** 无
-返回:`None`
+**返回:**`None`
-## screenshot()
+## 📍 `screenshot()`
此方法用于生成页面可见范围截图。图片为 png 格式。
此方法能够自动处理文件重命名的情况,给新文件后面增加序号。
也可以返回图片的二进制文本。
-参数:
+**参数:**
-- path:图片保存路径
-- filename:图片文件名,可不写后缀,不传入时以页面 title 命名
-- as_bytes:是否已字节形式返回图片,为True时上面两个参数失效
+- `path`:图片保存路径
+- `filename`:图片文件名,可不写后缀,不传入时以页面 title 命名
+- `as_bytes`:是否已字节形式返回图片,为True时上面两个参数失效
-返回:图片完整路径或字节文本
+**返回:** 图片完整路径或字节文本
```python
path = page.screenshot(r'D:\tmp', 'img1') # 保存到路径,文件名为img1.png
bytes = page.screenshot(as_bytes=True) # 返回截图二进制文本
```
-## set_window_size()
+## 📍 `set_window_size()`
此方法用于设置浏览器窗口大小。
默认最大化,任一参数为 0 最小化。
-参数:
+**参数:**
-- height:浏览器窗口高度
-- width:浏览器窗口宽度
+- `height`:浏览器窗口高度
+- `width`:浏览器窗口宽度
-返回:None
+**返回:**`None`
```python
# 窗口最大化
@@ -571,19 +566,19 @@ page.set_window_size(0)
page.set_window_size(800, 600)
```
-## process_alert()
+## 📍 `process_alert()`
此方法 用于处理提示框。
它能够设置等待时间,等待提示框出现才进行处理,若超时没等到提示框,返回`None`。
它可只获取提示框文本而不处理提示框。
-参数:
+**参数:**
-- ok:`True`表示确认,`False`表示取消,其它值不会按按钮但依然返回文本值
-- send:处理 prompt 提示框时可输入文本
-- timeout:等待提示框出现的超时时间
+- `ok`:`True`表示确认,`False`表示取消,其它值不会按按钮但依然返回文本值
+- `send`:处理 prompt 提示框时可输入文本
+- `timeout`:等待提示框出现的超时时间
-返回:提示框内容文本,未等到提示框则返回`None`
+**返回:** 提示框内容文本,未等到提示框则返回`None`
```python
# 确认提示框并获取提示框文本
@@ -599,7 +594,7 @@ paeg.process_alert(True, 'some text')
txt = page.process_alert(None)
```
-## check_page()
+## 📍 `check_page()`
此方法用于检查页面是否符合预期,它默认返回`None`,须由子类实现其功能。
用于 POM 模式时,可派生各种页面子类,从而实现检查页面的功能。
diff --git a/docs/README.md b/docs/README.md
index 8f5571b..fbdb2c0 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -96,4 +96,4 @@ DrissionPage,即 driver 和 session 组合而成的 page。
如果本项目对您有所帮助,不妨请作者我喝杯咖啡 :)
-
+
diff --git a/docs/Tips大集合.md b/docs/Tips大集合.md
deleted file mode 100644
index a70baef..0000000
--- a/docs/Tips大集合.md
+++ /dev/null
@@ -1,26 +0,0 @@
-## 全局
-
-- 切换模式时会自动复制`cookies`到目标模式,并在目标模式下重新访问当前网址,可在参数中禁止自动访问。
-- 访问网址时如遇到异常,会自动重试 3 次,也可在对象属性或连接参数里设置重试次数和间隔时间。d 模式这个功能要重载了`check_page()`方法才有效。
-- 获取到的文本会自动替换` `为空格。
-- 可以在元素下直接使用`>`以 css selector 方式获取当前元素直接子元素。如`ele1.ele('css:>div')`。原生不支持这种写法。
-- 用 xpath 获取元素的子元素时,可省略前面的`.`。如`ele1.ele('div')`和`ele1.ele('.//div')`是一致的。
-- 保存空的配置对象时,如没有指定路径,会保存到默认 ini 文件。
-- `download()`方法会自动创建`goal_path`参数的文件夹,因此可直接传入不存在的文件夹路径。
-- `set_cookies()`可以接收`RequestsCookieJar`、`list`、`tuple`、`str`、`dict`,只要格式对扔进去它会自动调整。其中`list`和`tuple`的内容可为`Cookie`、`dict`、`str`。
-
-## s 模式
-
-- 在创建`MixPage`对象时传入的`Session`配置是全局有效的,一般无须每次连接传入。
-- ini 文件里设置了默认 s 模式的`headers`,一般情况可直接使用,也可手动设置。
-- s 模式访问网页时会自动纠正编码,具体为先从`headers`获取,再从页面`meta`标签获取,都找不到就执行`r.apparent_encoding`。因此无须手动设置。
-- 如果没有传入`referer`和`host`值,s 模式在连接时会自动根据当前域名自动填写`Host`和`Referer`属性。
-
-## d 模式
-
-- d 模式查找元素默认设置等待超时 10 秒,10 秒内找到立即返回元素,超时返回`None`。也可指定超时时间。
-- `cilck()`方法用 selenium 点击失败时会用 js 方式重试,也可在参数里指定直接用 js 或不用 js 重试。
-- `click()`方法可设置`timeout`参数,在时间内会不断重试点击目标,`click(by_js=False)`可用于等待覆盖在元素上的遮罩层消失。
-- 可以用 xpath 直接获取元素属性或文本节点内容,如`ele1.ele('xpath://div/@class')`或`ele1.ele('xpath://div/text()[2]')`。原生不支持这种用法。
-- 在`MixPage`对象设置`timeout`后,该页面下所有元素的查找都会遵循该设置,该值默认为 10。也可以每次查找元素时单独设置,单独设置不影响页面对象的`timeout`属性。
-- 若设置了`local_port`或`debugger_address`,创建 driver 时程序会自动检测该端口,如为空,则自动在该端口启动一个浏览器进程并接入。程序完毕该浏览器不自动关闭,以便后续使用。
\ No newline at end of file
diff --git a/docs/WebPage使用方法/3.10动作链.md b/docs/WebPage使用方法/3.10动作链.md
index 8d801c2..c85c5bc 100644
--- a/docs/WebPage使用方法/3.10动作链.md
+++ b/docs/WebPage使用方法/3.10动作链.md
@@ -99,30 +99,118 @@ ac.up(50) # 鼠标向上移动 50 像素
**返回:**`ActionChains`对象自己
-# ✔ 点击鼠标
+# ✔ 鼠标按键
## 📍 `click()`
+此方法用于单击鼠标左键,单击前可先移动到元素上。
+
+**参数:**
+
+- `on_ele`:`ChromiumElement`元素
+
+**返回:**`ActionChains`对象自己
+
## 📍 `r_click()`
+此方法用于单击鼠标右键,单击前可先移动到元素上。
+
+**参数:**
+
+- `on_ele`:`ChromiumElement`元素
+
+**返回:**`ActionChains`对象自己
+
## 📍 `hold()`
+此方法用于按住鼠标左键不放,按住前可先移动到元素上。
+
+**参数:**
+
+- `on_ele`:`ChromiumElement`元素
+
+**返回:**`ActionChains`对象自己
+
## 📍 `release()`
+此方法用于释放鼠标左键,释放前可先移动到元素上。
+
+**参数:**
+
+- `on_ele`:`ChromiumElement`元素
+
+**返回:**`ActionChains`对象自己
+
# ✔ 滚动滚轮
## 📍 `scroll()`
+此方法用于滚动鼠标滚轮,滚动前可先移动到元素上。
+
+**参数:**
+
+- `delta_x`:滚轮变化值 x
+- `delta_y`:滚轮变化值 y
+- `on_ele`:`ChromiumElement`元素
+
+**返回:**`ActionChains`对象自己
+
# ✔ 键盘按键
## 📍 `key_down()`
+此方法用于按下键盘按键。
+
+**参数:**
+
+- `key`:按键键值,特殊字符见 Keys
+
+**返回:**`ActionChains`对象自己
+
+```python
+from DrissionPage.keys import Keys
+
+ac.key_down(Keys.CTRL) # 按下 ctrl 键
+```
+
## 📍 `key_up()`
+此方法用于提起键盘按键。
+
+**参数:**
+
+- `key`:按键键值,特殊字符见 Keys
+
+**返回:**`ActionChains`对象自己
+
# ✔ 等待
## 📍 `wait()`
+此方法用于在动作链中插入停顿。
+
+**参数:**
+
+- `second`:秒数
+
+**返回:**`ActionChains`对象自己
+
+```python
+ac.wait(3) # 停顿 3 秒
+```
+
# ✔ 链式操作
+以上操作皆能实现链式操作。且最后无需`perform()`。
+
+```python
+from DrissionPage import ChromiumPage, ActionChains
+
+page = ChromiumPage()
+ac = ActionCHains(page)
+
+# 链式操作
+ac.move_to('tag:h1').right(30).click().key_down('a').key_up('a')
+```
+
diff --git a/docs/WebPage使用方法/3.3查找元素.md b/docs/WebPage使用方法/3.3查找元素.md
index 962ed61..2b1a44d 100644
--- a/docs/WebPage使用方法/3.3查找元素.md
+++ b/docs/WebPage使用方法/3.3查找元素.md
@@ -105,13 +105,13 @@ d 模式下返回`ChromiumElement`对象,s 模式下返回`SessionElement`对
在元素下查找子元素时,还可以用 xpath 获取元素属性,直接返回属性文本。
页面对象和元素对象的`ele()`方法参数名称稍有不同,但用法一样。
-参数:
+**参数:**
-- loc_or_str(元素对象):元素的定位信息,可以是 loc 元组,或查询字符串
-- loc_or_ele(页面对象):元素的定位信息,可以是元素对象,loc 元组,或查询字符串
-- timeout:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效
+- `loc_or_str`(元素对象):元素的定位信息,可以是 loc 元组,或查询字符串
+- `loc_or_ele`(页面对象):元素的定位信息,可以是元素对象,loc 元组,或查询字符串
+- `timeout`:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效
-返回:s 模式下返回`SessionElement`,d 模式下返回`ChromiumElement`;或用 xpath 获取到的属性值
+**返回:** s 模式下返回`SessionElement`,d 模式下返回`ChromiumElement`;或用 xpath 获取到的属性值
```python
from DrissionPage import WebPage
@@ -134,12 +134,12 @@ ele_class = ele1.ele('xpath://div/@class')
此方法与`ele()`相似,但返回的是匹配到的所有元素组成的列表,用 xpath 获取元素属性时,返回属性文本组成的列表。
-参数:
+**参数:**
-- loc_or_str:元素的定位信息,可以是 loc 元组,或查询字符串
-- timeout:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效
+- `loc_or_str`:元素的定位信息,可以是 loc 元组,或查询字符串
+- `timeout`:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效
-返回:s 模式下返回`SessionElement`组成的列表,d 模式下返回`ChromiumElement`组成的列表;或用 xpath 获取到的属性值组成的列表
+**返回:** s 模式下返回`SessionElement`组成的列表,d 模式下返回`ChromiumElement`组成的列表;或用 xpath 获取到的属性值组成的列表
```python
# 获取 ele 元素内的所有 p 元素
@@ -167,12 +167,12 @@ s 模式下,所有元素本身就是静态元素,d 模式下,用`s_ele()`
s 模式下这个方法和`ele()`是一样的。
-参数:
+**参数:**
-- loc_or_str(元素对象):元素的定位信息,可以是 loc 元组,或查询字符串。为`None`时直接返回当前元素的`SessionElemnet`版本
-- loc_or_ele(页面对象):元素的定位信息,可以是 loc 元组,或查询字符串。为`None`时直接返回当前页面的 `SessionElemnet`版本
+- `loc_or_str`(元素对象):元素的定位信息,可以是 loc 元组,或查询字符串。为`None`时直接返回当前元素的`SessionElemnet`版本
+- `loc_or_ele`(页面对象):元素的定位信息,可以是 loc 元组,或查询字符串。为`None`时直接返回当前页面的 `SessionElemnet`版本
-返回:`SessionElement`,或用 xpath 获取到的属性值
+**返回:**`SessionElement`,或用 xpath 获取到的属性值
!>**注意:**
页面对象和元素对象的`s_ele()`方法不能搜索到在 frame 里的元素,页面对象的静态版本也不能搜索 frame 里的元素。要使用 frame 里元素的静态版本,可先获取该元素,再转换。而使用`ChromiumFrame`对象,则可以直接用`s_ele()`查找元素,这在后面章节再讲述。
@@ -205,11 +205,11 @@ ele4 = s_ele.ele('search text')
此方法与`s_ele()`相似,但返回的是匹配到的所有元素组成的列表,或属性值组成的列表。
-参数:
+**参数:**
-- loc_or_str:元素的定位信息,可以是 loc 元组,或查询字符串(必填)
+- `loc_or_str`:元素的定位信息,可以是 loc 元组,或查询字符串(必填)
-返回:`SessionElement`组成的列表,或用 xpath 获取到的属性值组成的列表
+**返回:**`SessionElement`组成的列表,或用 xpath 获取到的属性值组成的列表
```python
from DrissionPage import WebPage
@@ -248,17 +248,17 @@ ele1.click()
**匹配模式** 指字符串是否完全匹配,有以下两种:
-## 📍 精确匹配符`=`
+## 📍 精确匹配符 `=`
表示精确匹配,匹配完全符合的文本或属性。
-## 📍 模糊匹配符`:`
+## 📍 模糊匹配符 `:`
表示模糊匹配,匹配含有某个字符串的文本或属性。
**关键字** 是出现在定位语句最左边,用于指明该语句以哪种方式去查找元素,有以下这些:
-## 📍 id 匹配符`#`
+## 📍 id 匹配符 `#`
表示`id`属性,只在语句最前面且单独使用时生效,可配合`=`或`:`。
@@ -270,7 +270,7 @@ ele1 = page.ele('#ele_id')
ele2 = ele1.ele('#:ele_id')
```
-## 📍 class 匹配符`.`
+## 📍 class 匹配符 `.`
表示`class`属性,只在语句最前面且单独使用时生效,可配合`=`或`:`。
@@ -310,7 +310,7 @@ ele2 = ele1.ele('@email=abc@def.com')
ele2 = ele1.ele('css:div[abc\@def="v"]')
```
-## 📍 多属性匹配符`@@`
+## 📍 多属性匹配符 `@@`
表示某个属性,多属性匹配时使用,个数不限。还能匹配要忽略的元素,匹配文本时也和`@`不一样。
`@@`后跟 - 时,表示 not。如:
@@ -338,7 +338,7 @@ ele2 = ele1.ele('@@-class')
ele2 = ele1.ele('@@-name:ele_name')
```
-## 📍 文本匹配符`text`
+## 📍 文本匹配符 `text`
要匹配的文本,查询字符串如开头没有任何关键字,也表示根据传入的文本作模糊查找。
如果元素内有多个直接的文本节点,精确查找时可匹配所有文本节点拼成的字符串,模糊查找时可匹配每个文本节点。
@@ -360,12 +360,9 @@ ele2 = ele1.ele('some text')
ele2 = page.ele('text:text:')
```
-## 📍 文本匹配符`text()`
+## 📍 文本匹配符 `text()`
作为查找属性时使用的文本关键字,必须与`@`或`@@`配合使用。
-与`@`配合和与`@@`配合使用时,`text()`的意义是有差别的。
-
-`@text()`表示在元素的直接子文本节点中匹配,且多个节点不能合并匹配。 `@@text()`表示在元素内部所有文本中匹配,且会把元素内部所有文本拼成一个总字符串再进行匹配,因此可以模糊匹配元素里面任意文本。
```python
# 查找文本为 some text 的元素
@@ -388,7 +385,11 @@ ele = page.ele('text:some text')
ele = page.ele('@@text():some text')
```
-## 📍 类型匹配符`tag`
+须要注意的是,`'text=xxxx'`与`'@text()=xxxx'`使用上是有细微差别的。
+
+`text=`表示在元素的直接子文本节点中匹配,`@text()=`会忽略一些文本标签,在整个元素的内容里匹配。
+
+## 📍 类型匹配符 `tag`
表示元素的标签,只在语句最前面且单独使用时生效,可与`@`或`@@`配合使用。`tag:`与`tag=`效果一致。
@@ -412,10 +413,9 @@ ele2 = ele1.ele('tag:div@text():text')
ele2 = ele1.ele('tag:div@@text():text')
```
-?> **Tips:**
-注意, `tag:div@text():text` 和 `tag:div@@text():text` 是有区别的,前者只在`div`的直接文本节点搜索,后者搜索`div`的整个内部。
+?> **Tips:**
注意, `tag:div@text():text` 和 `tag:div@@text():text` 是有区别的,前者只在`div`的直接文本节点搜索,后者搜索`div`的整个内部。
-## 📍 css selector 匹配符`css`
+## 📍 css selector 匹配符 `css`
表示用 css selector 方式查找元素。`css:`与`css=`效果一致。
@@ -427,7 +427,7 @@ ele2 = ele1.ele('css:.div')
ele2 = ele1.ele('css:>div')
```
-## 📍 xpath 匹配符`xpath`
+## 📍 xpath 匹配符 `xpath`
表示用 xpath 方式查找元素。`xpath:`与`xpath=`效果一致。
该方法支持完整的 xpath 语法,能使用 xpath 直接获取元素属性,selenium 不支持这种用法。
@@ -498,13 +498,13 @@ ele2 = ele1.ele('some text', timeout=1)
- `loc_or_ele`:要等待的元素,可以是元素或定位符
- `timeout`:等待超时时间,默认使用页面超时时间
-方法:
+**方法:**
-| 方法 | 参数 | 功能 |
-| --------- | --- | ------------ |
-| display() | 无 | 等待元素从 DOM 显示 |
-| hidden() | 无 | 等待元素从 DOM 隐藏 |
-| delete() | 无 | 等待元素从 DOM 删除 |
+| 方法 | 参数 | 功能 |
+| ----------- | --- | ------------ |
+| `display()` | 无 | 等待元素从 DOM 显示 |
+| `hidden()` | 无 | 等待元素从 DOM 隐藏 |
+| `delete()` | 无 | 等待元素从 DOM 删除 |
**返回:** 这些方法返回布尔值,代表是否等待成功。
@@ -529,11 +529,11 @@ ele1.wait_ele(ele2).hidden()
`parent()`方法获取当前元素某一级父元素,可指定筛选条件或层数。
-参数:
+**参数:**
-- level_or_loc:第几级父元素,或定位符
+- `level_or_loc`:第几级父元素,或定位符
-返回:
+**返回:** 某层父级元素
```python
# 获取 ele1 的第二层父元素
@@ -547,13 +547,13 @@ ele2 = ele1.parent('#id1')
`next()`方法返回当前元素后面的某一个同级元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- index:查询结果中的第几个
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `timeout`:查找元素的超时时间
-返回:本元素后面某个兄弟元素或节点文本
+**返回:** 本元素后面某个兄弟元素或节点文本
```python
# 获取 ele1 后面第一个兄弟元素
@@ -573,12 +573,12 @@ txt = ele1.next('xpath:text()', 1)
`nexts()`方法返回当前元素后面全部符合条件的同级元素或节点组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素前面符合条件的兄弟元素或节点文本组成的列表
+**返回:** 本元素前面符合条件的兄弟元素或节点文本组成的列表
```python
# 获取 ele1 后面所有兄弟元素
@@ -595,13 +595,13 @@ txts = ele1.nexts('xpath:text()')
`prev()`方法返回当前元素前面的某一个同级元素,可指定筛选条件和第几个。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- index:查询结果中的第几个
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `timeout`:查找元素的超时时间
-返回:本元素前面某个兄弟元素或节点文本
+**返回:** 本元素前面某个兄弟元素或节点文本
```python
# 获取 ele1 前面第一个兄弟元素
@@ -621,12 +621,12 @@ txt = ele1.prev(1, 'xpath:text()')
`prevs()`方法返回当前元素前面全部符合条件的同级元素或节点组成的列表,可用查询语法筛选。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素前面符合条件的兄弟元素或节点文本组成的列表
+**返回:** 本元素前面符合条件的兄弟元素或节点文本组成的列表
```python
# 获取 ele1 前面所有兄弟元素
@@ -640,13 +640,13 @@ divs = ele1.prevs('tag:div')
`after()`方法返回当前元素后面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- index:查询结果中的第几个
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `timeout`:查找元素的超时时间
-返回:本元素后面某个元素或节点
+**返回:** 本元素后面某个元素或节点
```python
# 获取 ele1 后面第 3 个元素
@@ -663,12 +663,12 @@ txt = ele1.after('xpath:text()', 1)
`afters()`方法返回当前元素后面符合条件的全部元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素后面符合条件的元素或节点组成的列表
+**返回:** 本元素后面符合条件的元素或节点组成的列表
```python
# 获取 ele1 后所有元素
@@ -682,13 +682,13 @@ divs = ele1.afters('tag:div')
`before()`方法返回当前元素前面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- index:查询结果中的第几个
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `index`:查询结果中的第几个
+- `timeout`:查找元素的超时时间
-返回:本元素前面某个元素或节点
+**返回:** 本元素前面某个元素或节点
```python
# 获取 ele1 前面第 3 个元素
@@ -705,12 +705,12 @@ txt = ele1.before('xpath:text()', 1)
`befores()`方法返回当前元素前面全部符合条件的元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
-参数:
+**参数:**
-- filter_loc:用于筛选元素的查询语法
-- timeout:查找元素的超时时间
+- `filter_loc`:用于筛选元素的查询语法
+- `timeout`:查找元素的超时时间
-返回:本元素前面符合条件的元素或节点组成的列表
+**返回:** 本元素前面符合条件的元素或节点组成的列表
```python
# 获取 ele1 前面所有元素
@@ -814,14 +814,14 @@ ele2 = ele1('x://div[@class="ele_class"]')
简化写法对应列表
-| 原写法 | 简化写法 |
-|:-----------:|:----:|
-| text | tx |
-| text() | tx() |
-| tag | t |
-| xpath | x |
-| css | c |
-| shadow_root | sr |
+| 原写法 | 简化写法 |
+|:-------------:|:------:|
+| `text` | `tx` |
+| `text()` | `tx()` |
+| `tag` | `t` |
+| `xpath` | `x` |
+| `css` | `c` |
+| `shadow_root` | `sr` |
# ✔️ Tips
diff --git a/docs/_navbar.md b/docs/_navbar.md
index b15f502..24717e7 100644
--- a/docs/_navbar.md
+++ b/docs/_navbar.md
@@ -1,5 +1,2 @@
* [DataRecorder](https://gitee.com/g1879/DataRecorder)
-* [ListPage](https://gitee.com/g1879/ListPage)
-* [DownloadKit](https://gitee.com/g1879/DownloadKit)
* [FlowViewer](http://g1879.gitee.io/flowviewer)
-* [Demos](https://gitee.com/g1879/DrissionPage-demos)
diff --git a/docs/_sidebar.md b/docs/_sidebar.md
index aafb44e..b0b9a10 100644
--- a/docs/_sidebar.md
+++ b/docs/_sidebar.md
@@ -10,6 +10,7 @@
* [🌿 模式切换](入门指南\特性演示\模式切换.md)
* [🌿 获取并打印元素属性](入门指南\特性演示\获取并打印元素属性.md)
* [🌿 下载文件](入门指南\特性演示\下载文件.md)
+ * [💖 2.4 贴心设计](入门指南\贴心设计.md)
* [🛠 3 WebPage 使用方法](#)
@@ -33,29 +34,35 @@
* [🔨 4.5 元素操作](MixPage使用方法\元素操作.md)
* [🔨 4.6 获取网页信息](MixPage使用方法\获取网页信息.md)
* [🔨 4.7 页面操作](MixPage使用方法\页面操作.md)
- * [🔨 4.8 启动配置](#)
- * [🔧 概述](MixPage使用方法\启动配置\概述.md)
- * [🔧 Chrome 启动配置](MixPage使用方法\启动配置\Chrome启动配置.md)
- * [🔧 Session 启动配置](MixPage使用方法\启动配置\Session启动配置.md)
- * [🔧 使用配置文件](MixPage使用方法\启动配置\使用配置文件.md)
- * [🔨 4.9 下载文件](MixPage使用方法\下载文件.md)
- * [🔨 4.10 监听浏览器网络数据](MixPage使用方法\监听浏览器网络数据.md)
- * [🔨 4.11 cookies 的使用](MixPage使用方法\cookies的使用.md)
- * [🔨 4.12 Drission 对象](MixPage使用方法\Drission对象.md)
- * [🔨 4.13 对接 selenium 及 requests 代码](MixPage使用方法\对接selenium及requests代码.md)
- * [🔨 4.14 使用其它系统或浏览器](MixPage使用方法\使用其它系统或浏览器.md)
- * [🔨 4.15 DriverPage 和 SessionPage](MixPage使用方法\DriverPage和SessionPage.md)
- * [🔨 4.16 打包程序](MixPage使用方法\打包程序.md)
+ * [🔨 4.8 下载文件](MixPage使用方法\下载文件.md)
+ * [🔨 4.9 监听浏览器网络数据](MixPage使用方法\监听浏览器网络数据.md)
+ * [🔨 4.10 cookies 的使用](MixPage使用方法\cookies的使用.md)
+ * [🔨 4.11 Drission 对象](MixPage使用方法\Drission对象.md)
+ * [🔨 4.12 对接 selenium 及 requests 代码](MixPage使用方法\对接selenium及requests代码.md)
+ * [🔨 4.13 使用其它系统或浏览器](MixPage使用方法\使用其它系统或浏览器.md)
+ * [🔨 4.14 DriverPage 和 SessionPage](MixPage使用方法\DriverPage和SessionPage.md)
+ * [🔨 4.15 打包程序](MixPage使用方法\打包程序.md)
-* [💖 5 实用示例](#)
+* [🛠 5 启动配置](#)
- * [🧡 自动登录码云](实用示例\自动登录码云.md)
- * [🧡 获取各国疫情排名](实用示例\获取各国疫情排名.md)
- * [🧡 下载星巴克产品图片](实用示例\下载星巴克产品图片.md)
- * [🧡 同时操作多个浏览器](实用示例\同时操作多个浏览器.md)
+ * [🔨 5.1 概述](启动配置\概述.md)
+ * [🔨 5.2 浏览器启动配置](启动配置\浏览器启动配置.md)
+ * [🔨 5.3 Session 启动配置](启动配置\Session启动配置.md)
+ * [🔨 5.4 使用配置文件](启动配置\使用配置文件.md)
-* [⚡️ 6 Tips大集合](Tips大集合.md)
+* [🧰 6 进阶使用](#)
+
+ * [⚙️ 6.1 打包程序](进阶使用\打包程序.md)
+ * [⚙️ 6.2 监听浏览器网络](进阶使用\监听浏览器网络.md)
+ * [⚙️ 6.3 下载文件](进阶使用\下载文件.md)
-* [🎯️ 7 版本历史](版本历史.md)
+* [⚡️ 7 实用示例](#)
+
+ * [🌠 自动登录码云](实用示例\自动登录码云.md)
+ * [🌠 获取各国疫情排名](实用示例\获取各国疫情排名.md)
+ * [🌠 下载星巴克产品图片](实用示例\下载星巴克产品图片.md)
+ * [🌠 同时操作多个浏览器](实用示例\同时操作多个浏览器.md)
+
+* [🔖 9 版本历史](版本历史.md)
* [💐 鸣谢](鸣谢.md)
diff --git a/docs/imgs/code.jpg b/docs/imgs/code.jpg
new file mode 100644
index 0000000..f86aca7
Binary files /dev/null and b/docs/imgs/code.jpg differ
diff --git a/docs/imgs/mixpage.jpg b/docs/imgs/mixpage.jpg
new file mode 100644
index 0000000..3930da2
Binary files /dev/null and b/docs/imgs/mixpage.jpg differ
diff --git a/docs/imgs/webpage.jpg b/docs/imgs/webpage.jpg
new file mode 100644
index 0000000..3f571f0
Binary files /dev/null and b/docs/imgs/webpage.jpg differ
diff --git a/docs/入门指南/基本概念.md b/docs/入门指南/基本概念.md
index 6ceb440..e71fd5b 100644
--- a/docs/入门指南/基本概念.md
+++ b/docs/入门指南/基本概念.md
@@ -176,15 +176,17 @@ page = MixPage()
## 📍 `WebPage`结构图
-待更新。
+`WebPage`继承自`ChromiumPage`和`SessionPage`,前者负责控制浏览器,后者负责数据包收发。
+
+
## 📍 `MixPage`结构图
-如图所示,`Drission`对象负责链接的创建、共享登录状态等工作,类似 selenium 中 driver 的概念。
+`Drission`对象负责链接的创建、共享登录状态等工作,类似 selenium 中 driver 的概念。
`MixPage`对象负责对获取到的页面进行解析、操作。
`DriverElement`和`SessionElement`则是从页面对象中获取到的元素对象。负责对元素进行解析和操作。
-
+
# ✔️ 配置管理
diff --git a/docs/入门指南/贴心设计.md b/docs/入门指南/贴心设计.md
new file mode 100644
index 0000000..5f27d33
--- /dev/null
+++ b/docs/入门指南/贴心设计.md
@@ -0,0 +1,99 @@
+这里介绍一些本库内置了人性化设计。
+
+# ✔️ 无处不在的等待
+
+网络环境不稳定,很多时候程序须要稍微等待一下才能继续运行。等待太少,会导致程序出错,等待太多,又会浪费时间。为了解决这些问题,本库在大量须要等待的部分内置了超时功能,并且可以随时灵活设置,大幅降低程序复杂性。
+
+- 查找元素内置等待。可以为每次查找元素单独设定等待时间。有些页面会不定期出现提示信息,如果一律等待会太浪费时间,可以独立设置一个很短的超时时间,避免浪费。
+
+- 等待下拉列表选项。很多下拉列表使用 js 加载,本库选择下拉列表时,会自动等待列表项出现。
+
+- 等待弹窗。有时预期的 alert 未必立刻出现,本库处理 弹窗消息时也可以设置等待。
+
+- 等待元素状态改变。使用`wait_ele()`方法可等待元素出现、消失、删除等状态。
+
+- 点击功能也内置等待,如遇元素被遮挡可不断重试点击。
+
+- 设置页面加载时限及加载策略。有时不需要完整加载页面资源,可根据实际须要设置加载策略。
+
+# ✔️ 自动重试连接
+
+在访问网站时,由于网络不稳定可能导致连接异常。本库设置了连接自动重试功能,当网页连接异常,会默认重试 3 次。当然也可以手动设置次数和间隔。
+
+```python
+page.get('xxxxxx', retry=5, interval=3) # 出错是重试 5 次,每次间隔 3 秒
+```
+
+# ✔️ 极简的定位语法
+
+本库制定了一套简洁高效的查找元素语法,支持链式操作,支持相对定位。与 selenium 繁琐的语法相比简直不要太方便。
+
+而且每次查找内置等待,可以独立设置每次查找超时时间。
+
+同是设置了超时等待的查找,对比一下:
+
+```python
+# 使用 selenium:
+element = WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.XPATH, '//*[contains(text(), "some text")]')))
+
+# 使用 DrissionPage:
+element = page('some text', timeout=10)
+```
+
+# ✔️ 无需切入切出,逻辑清晰
+
+使用过 selenium 的人都知道,selenium 同一时间只能操作一个标签页或`