mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-11-29 18:47:34 +08:00
修改文档
This commit is contained in:
parent
e603a9d38c
commit
969c25845e
19
README.md
19
README.md
@ -16,14 +16,14 @@ DrissionPage,即 driver 和 session 组合而成的 page。
|
|||||||
|
|
||||||
## 📕 背景
|
## 📕 背景
|
||||||
|
|
||||||
requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
|
用 requests 做数据采集面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
|
||||||
使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
|
使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
|
||||||
除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
|
除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
|
||||||
一切从简,尽量提供简单直接的使用方法,对新手更友好。
|
一切从简,尽量提供简单直接的使用方法,对新手更友好。
|
||||||
|
|
||||||
# 💡 特性和亮点
|
# 💡 特性和亮点
|
||||||
|
|
||||||
作者有多年自动化和爬虫经验,踩过无数坑,总结出的经验全写到这个库里了。内置了 N 多实用功能,对常用功能作了整合和优化。
|
作者踩过无数坑,总结出的经验全写到这个库里了。内置了 N 多实用功能,对常用功能作了整合和优化。
|
||||||
|
|
||||||
## 🎉 特性
|
## 🎉 特性
|
||||||
|
|
||||||
@ -91,6 +91,7 @@ page.to_tab(0)
|
|||||||
```python
|
```python
|
||||||
# 使用 selenium:
|
# 使用 selenium:
|
||||||
from selenium.webdriver.support.select import Select
|
from selenium.webdriver.support.select import Select
|
||||||
|
|
||||||
select_element = Select(element)
|
select_element = Select(element)
|
||||||
select_element.select_by_visible_text('text')
|
select_element.select_by_visible_text('text')
|
||||||
|
|
||||||
@ -133,7 +134,8 @@ set_headless()
|
|||||||
|
|
||||||
```python
|
```python
|
||||||
# 使用 selenium:
|
# 使用 selenium:
|
||||||
text = webdriver.execute_script('return window.getComputedStyle(arguments[0], "::after").getPropertyValue("content");', element)
|
text = webdriver.execute_script('return window.getComputedStyle(arguments[0], "::after").getPropertyValue("content");',
|
||||||
|
element)
|
||||||
|
|
||||||
# 使用 DrissionPage:
|
# 使用 DrissionPage:
|
||||||
text = element.pseudo_after
|
text = element.pseudo_after
|
||||||
@ -142,6 +144,7 @@ text = element.pseudo_after
|
|||||||
🌿 shadow-root 操作
|
🌿 shadow-root 操作
|
||||||
|
|
||||||
selenium 新增了`ShadowRoot`,但功能实在是太少。
|
selenium 新增了`ShadowRoot`,但功能实在是太少。
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# 使用 selenium:
|
# 使用 selenium:
|
||||||
shadow_element = webdriver.execute_script('return arguments[0].shadowRoot', element)
|
shadow_element = webdriver.execute_script('return arguments[0].shadowRoot', element)
|
||||||
@ -188,8 +191,10 @@ url = 'https://baike.baidu.com/item/python'
|
|||||||
|
|
||||||
# 使用 requests:
|
# 使用 requests:
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
|
|
||||||
response = requests.get(url, headers = headers)
|
headers = {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
|
||||||
|
response = requests.get(url, headers=headers)
|
||||||
html = etree.HTML(response.text)
|
html = etree.HTML(response.text)
|
||||||
element = html.xpath('//h1')[0]
|
element = html.xpath('//h1')[0]
|
||||||
title = element.text
|
title = element.text
|
||||||
@ -274,7 +279,9 @@ Git 命令学习
|
|||||||
[点击查看版本历史](http://g1879.gitee.io/drissionpage/#/%E7%89%88%E6%9C%AC%E5%8E%86%E5%8F%B2)
|
[点击查看版本历史](http://g1879.gitee.io/drissionpage/#/%E7%89%88%E6%9C%AC%E5%8E%86%E5%8F%B2)
|
||||||
|
|
||||||
# 🖐🏻 免责声明
|
# 🖐🏻 免责声明
|
||||||
请勿将 DrissionPage 应用到任何可能会违反法律规定和道德约束的工作中,请友善使用 DrissionPage,遵守蜘蛛协议,不要将 DrissionPage 用于任何非法用途。如您选择使用 DrissionPage 即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。
|
|
||||||
|
请勿将 DrissionPage 应用到任何可能会违反法律规定和道德约束的工作中,请友善使用 DrissionPage,遵守蜘蛛协议,不要将 DrissionPage 用于任何非法用途。如您选择使用 DrissionPage
|
||||||
|
即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。
|
||||||
|
|
||||||
# ☕ 请我喝咖啡
|
# ☕ 请我喝咖啡
|
||||||
|
|
||||||
|
@ -16,14 +16,14 @@ DrissionPage,即 driver 和 session 组合而成的 page。
|
|||||||
|
|
||||||
## 📕 背景
|
## 📕 背景
|
||||||
|
|
||||||
requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
|
用 requests 做数据采集面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
|
||||||
使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
|
使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
|
||||||
除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
|
除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
|
||||||
一切从简,尽量提供简单直接的使用方法,对新手更友好。
|
一切从简,尽量提供简单直接的使用方法,对新手更友好。
|
||||||
|
|
||||||
# 🍀 特性和亮点
|
# 🍀 特性和亮点
|
||||||
|
|
||||||
作者有多年自动化和爬虫经验,踩过无数坑,总结出的经验全写到这个库里了。内置了 N 多实用功能,对常用功能作了整合和优化。
|
作者踩过无数坑,总结出的经验全写到这个库里了。内置了 N 多实用功能,对常用功能作了整合和优化。
|
||||||
|
|
||||||
## 🎉 特性
|
## 🎉 特性
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
本节介绍如何从页面对象或元素对象中获取需要的元素对象。
|
本节介绍如何从页面对象或元素对象中获取需要的元素对象。
|
||||||
|
|
||||||
无论是爬虫还是页面自动化,定位元素都是重中之重的的技能,浏览器开发者工具虽然可以直接复制绝对 xpath 或 css 路径,但这样做一来代码繁琐,可读性低,二来难以应付动态变化的页面。
|
无论是数据采集还是页面自动化,定位元素都是重中之重的的技能,浏览器开发者工具虽然可以直接复制绝对 xpath 或 css 路径,但这样做一来代码繁琐,可读性低,二来难以应付动态变化的页面。
|
||||||
本库提供一套简洁易用的语法,用于快速定位元素,并且内置等待功能、支持链式查找,减少了代码的复杂性。
|
本库提供一套简洁易用的语法,用于快速定位元素,并且内置等待功能、支持链式查找,减少了代码的复杂性。
|
||||||
|
|
||||||
定位元素大致分为三种方法:
|
定位元素大致分为三种方法:
|
||||||
@ -61,8 +61,6 @@ parent = p1.parent()
|
|||||||
div2 = p1.after(1, 'tag:div')
|
div2 = p1.after(1, 'tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 实际示例
|
## 实际示例
|
||||||
|
|
||||||
复制此代码可直接运行查看结果。
|
复制此代码可直接运行查看结果。
|
||||||
@ -114,12 +112,11 @@ ele1 = page.ele('search text')
|
|||||||
# 在元素内查找后代元素
|
# 在元素内查找后代元素
|
||||||
ele2 = ele1.ele('search text')
|
ele2 = ele1.ele('search text')
|
||||||
|
|
||||||
|
|
||||||
# 使用 xpath 获取后代中第一个 div 元素的 class 属性
|
# 使用 xpath 获取后代中第一个 div 元素的 class 属性
|
||||||
class = ele1.ele('xpath://div/@class')
|
class = ele1.ele('xpath://div/@class')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## eles()
|
## eles()
|
||||||
|
|
||||||
此方法与`ele()`相似,但返回的是匹配到的所有元素组成的列表,用 xpath 获取元素属性时,返回属性文本组成的列表。
|
此方法与`ele()`相似,但返回的是匹配到的所有元素组成的列表,用 xpath 获取元素属性时,返回属性文本组成的列表。
|
||||||
@ -138,8 +135,6 @@ p_eles = ele.eles('tag:p')
|
|||||||
print(p_eles[0])
|
print(p_eles[0])
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## s_ele()
|
## s_ele()
|
||||||
|
|
||||||
此方法用于在一个元素下查找后代元素,以`SessionElement`形式返回结果(xpath 获取属性值时依然是返回`str`),也可以直接将一个元素或页面转换为`SessionElement`版本。
|
此方法用于在一个元素下查找后代元素,以`SessionElement`形式返回结果(xpath 获取属性值时依然是返回`str`),也可以直接将一个元素或页面转换为`SessionElement`版本。
|
||||||
@ -167,8 +162,6 @@ ele2 = ele1.s_ele('search text')
|
|||||||
ele = page.s_ele('search text')
|
ele = page.s_ele('search text')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## s_eles()
|
## s_eles()
|
||||||
|
|
||||||
此方法与`s_ele()`相似,但返回的是匹配到的所有元素组成的列表,或属性值组成的列表。
|
此方法与`s_ele()`相似,但返回的是匹配到的所有元素组成的列表,或属性值组成的列表。
|
||||||
@ -179,8 +172,6 @@ ele = page.s_ele('search text')
|
|||||||
|
|
||||||
返回:`SessionElement`组成的列表,或用 xpath 获取到的属性值组成的列表
|
返回:`SessionElement`组成的列表,或用 xpath 获取到的属性值组成的列表
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## active_ele
|
## active_ele
|
||||||
|
|
||||||
该属性返回当前页面焦点所在元素。d 模式独有。
|
该属性返回当前页面焦点所在元素。d 模式独有。
|
||||||
@ -189,12 +180,11 @@ ele = page.s_ele('search text')
|
|||||||
ele = page.active_ele
|
ele = page.active_ele
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## shadow_root
|
## shadow_root
|
||||||
|
|
||||||
`DriverElement`元素除了以上方法和属性外,还有`shadow_root`属性,用于获取其内部的 shadow_root 元素。
|
`DriverElement`元素除了以上方法和属性外,还有`shadow_root`属性,用于获取其内部的 shadow_root 元素。
|
||||||
该属性返回的是一个`ShadowRootElement`,类似于`DriverElement`,功能比`DriverElement`少。但也有`ele()`和`eles()`方法,可直接搜索其下的元素,返回 `DriverElement`元素。返回的`DriverElement`和普通的没有区别。
|
该属性返回的是一个`ShadowRootElement`,类似于`DriverElement`,功能比`DriverElement`少。但也有`ele()`和`eles()`方法,可直接搜索其下的元素,返回 `DriverElement`
|
||||||
|
元素。返回的`DriverElement`和普通的没有区别。
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# 获取一个元素下是 shadow root
|
# 获取一个元素下是 shadow root
|
||||||
@ -207,7 +197,8 @@ ele1.click()
|
|||||||
|
|
||||||
# 查找语法
|
# 查找语法
|
||||||
|
|
||||||
我们使用一套简洁高效的语法去定位元素,大大简化了定位元素的代码量,增强了功能,也兼容 css selector、xpath、selenium 原生的 loc 元组(s 模式也能用)。d 模式和 s 模式定位元素的语法是完全一样的,便于模式切换时平滑过渡。
|
我们使用一套简洁高效的语法去定位元素,大大简化了定位元素的代码量,增强了功能,也兼容 css selector、xpath、selenium 原生的 loc 元组(s 模式也能用)。d 模式和 s
|
||||||
|
模式定位元素的语法是完全一样的,便于模式切换时平滑过渡。
|
||||||
|
|
||||||
**匹配模式** 指字符串是否完全匹配,有以下两种:
|
**匹配模式** 指字符串是否完全匹配,有以下两种:
|
||||||
|
|
||||||
@ -215,14 +206,10 @@ ele1.click()
|
|||||||
|
|
||||||
表示精确匹配,匹配完全符合的文本或属性。
|
表示精确匹配,匹配完全符合的文本或属性。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `:`
|
## `:`
|
||||||
|
|
||||||
表示模糊匹配,匹配含有某个字符串的文本或属性。
|
表示模糊匹配,匹配含有某个字符串的文本或属性。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**关键字** 是出现在定位语句最左边,用于指明该语句以哪种方式去查找元素,有以下这些:
|
**关键字** 是出现在定位语句最左边,用于指明该语句以哪种方式去查找元素,有以下这些:
|
||||||
|
|
||||||
## `#`
|
## `#`
|
||||||
@ -237,8 +224,6 @@ ele1 = page.ele('#ele_id')
|
|||||||
ele2 = ele1.ele('#:ele_id')
|
ele2 = ele1.ele('#:ele_id')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `.`
|
## `.`
|
||||||
|
|
||||||
表示`class`属性,只在语句最前面且单独使用时生效,可配合`=`或`:`。
|
表示`class`属性,只在语句最前面且单独使用时生效,可配合`=`或`:`。
|
||||||
@ -251,8 +236,6 @@ ele2 = ele1.ele('.ele_class')
|
|||||||
ele2 = ele1.ele('.:ele_class')
|
ele2 = ele1.ele('.:ele_class')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `@`
|
## `@`
|
||||||
|
|
||||||
表示某个属性,只匹配一个属性。
|
表示某个属性,只匹配一个属性。
|
||||||
@ -275,8 +258,6 @@ ele2 = ele1.ele('@')
|
|||||||
ele2 = ele1.ele('@email=abc@def.com')
|
ele2 = ele1.ele('@email=abc@def.com')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `@@`
|
## `@@`
|
||||||
|
|
||||||
表示某个属性,多属性匹配时使用,个数不限。还能匹配要忽略的元素,匹配文本时也和`@`不一样。
|
表示某个属性,多属性匹配时使用,个数不限。还能匹配要忽略的元素,匹配文本时也和`@`不一样。
|
||||||
@ -303,8 +284,6 @@ ele2 = ele1.ele('@@-class')
|
|||||||
ele2 = ele1.ele('@@-name:ele_name')
|
ele2 = ele1.ele('@@-name:ele_name')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `text`
|
## `text`
|
||||||
|
|
||||||
要匹配的文本,查询字符串如开头没有任何关键字,也表示根据传入的文本作模糊查找。
|
要匹配的文本,查询字符串如开头没有任何关键字,也表示根据传入的文本作模糊查找。
|
||||||
@ -327,8 +306,6 @@ ele2 = ele1.ele('some text')
|
|||||||
ele2 = page.ele('text:text:')
|
ele2 = page.ele('text:text:')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `text()`
|
## `text()`
|
||||||
|
|
||||||
作为查找属性时使用的文本关键字,必须与`@`或`@@`配合使用。
|
作为查找属性时使用的文本关键字,必须与`@`或`@@`配合使用。
|
||||||
@ -357,8 +334,6 @@ ele = page.ele('text:some text')
|
|||||||
ele = page.ele('@@text():some text')
|
ele = page.ele('@@text():some text')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `tag`
|
## `tag`
|
||||||
|
|
||||||
表示元素的标签,只在语句最前面且单独使用时生效,可与`@`或`@@`配合使用。`tag:`与`tag=`效果一致。
|
表示元素的标签,只在语句最前面且单独使用时生效,可与`@`或`@@`配合使用。`tag:`与`tag=`效果一致。
|
||||||
@ -376,7 +351,7 @@ ele2 = ele1.ele('tag:div@text()=text')
|
|||||||
# 定位 class 属性为 cls 且文本为 text 的 div 元素
|
# 定位 class 属性为 cls 且文本为 text 的 div 元素
|
||||||
ele2 = ele1.ele('tag:div@@class=cls@@text()=text')
|
ele2 = ele1.ele('tag:div@@class=cls@@text()=text')
|
||||||
|
|
||||||
# 查找直接文本节点包含 text 字符串的 div 元素
|
# 查找直接文本节点包含 text 字符串的 div 元素
|
||||||
ele2 = ele1.ele('tag:div@text():text')
|
ele2 = ele1.ele('tag:div@text():text')
|
||||||
|
|
||||||
# 查找内部文本节点包含 text 字符串的 div 元素
|
# 查找内部文本节点包含 text 字符串的 div 元素
|
||||||
@ -386,8 +361,6 @@ ele2 = ele1.ele('tag:div@@text():text')
|
|||||||
?> **Tips:** <br>
|
?> **Tips:** <br>
|
||||||
注意, `tag:div@text():text` 和 `tag:div@@text():text` 是有区别的,前者只在`div`的直接文本节点搜索,后者搜索`div`的整个内部。
|
注意, `tag:div@text():text` 和 `tag:div@@text():text` 是有区别的,前者只在`div`的直接文本节点搜索,后者搜索`div`的整个内部。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `css`
|
## `css`
|
||||||
|
|
||||||
表示用 css selector 方式查找元素。`css:`与`css=`效果一致。
|
表示用 css selector 方式查找元素。`css:`与`css=`效果一致。
|
||||||
@ -400,8 +373,6 @@ ele2 = ele1.ele('css:.div')
|
|||||||
ele2 = ele1.ele('css:>div')
|
ele2 = ele1.ele('css:>div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## `xpath`
|
## `xpath`
|
||||||
|
|
||||||
表示用 xpath 方式查找元素。`xpath:`与`xpath=`效果一致。
|
表示用 xpath 方式查找元素。`xpath:`与`xpath=`效果一致。
|
||||||
@ -419,9 +390,8 @@ txt = ele1.ele('xpath://div/@class')
|
|||||||
```
|
```
|
||||||
|
|
||||||
?> **Tips:** <br>
|
?> **Tips:** <br>
|
||||||
查找元素的后代时,selenium 原生代码要求 xpath 前面必须加`.`,否则会变成在全个页面中查找。笔者觉得这个设计是画蛇添足,既然已经通过元素查找了,自然应该只查找这个元素内部的元素。所以,用 xpath 在元素下查找时,最前面`//`或`/`前面的`.`可以省略。
|
查找元素的后代时,selenium 原生代码要求 xpath 前面必须加`.`,否则会变成在全个页面中查找。笔者觉得这个设计是画蛇添足,既然已经通过元素查找了,自然应该只查找这个元素内部的元素。所以,用 xpath
|
||||||
|
在元素下查找时,最前面`//`或`/`前面的`.`可以省略。
|
||||||
|
|
||||||
|
|
||||||
## selenium 的 loc 元组
|
## selenium 的 loc 元组
|
||||||
|
|
||||||
@ -480,8 +450,6 @@ ele2 = ele1.parent(2)
|
|||||||
ele2 = ele1.parent('#id1')
|
ele2 = ele1.parent('#id1')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## next()
|
## next()
|
||||||
|
|
||||||
此方法返回当前元素后面的某一个兄弟元素,可指定筛选条件和第几个。
|
此方法返回当前元素后面的某一个兄弟元素,可指定筛选条件和第几个。
|
||||||
@ -508,8 +476,6 @@ ele2 = ele1.next(3, 'tag:div')
|
|||||||
txt = ele1.next(1, 'xpath:text()')
|
txt = ele1.next(1, 'xpath:text()')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## nexts()
|
## nexts()
|
||||||
|
|
||||||
此方法返回后面全部符合条件的兄弟元素或节点组成的列表,可用查询语法筛选。
|
此方法返回后面全部符合条件的兄弟元素或节点组成的列表,可用查询语法筛选。
|
||||||
@ -532,8 +498,6 @@ divs = ele1.nexts('tag:div')
|
|||||||
txts = ele1.nexts('xpath:text()')
|
txts = ele1.nexts('xpath:text()')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## prev()
|
## prev()
|
||||||
|
|
||||||
此方法返回当前元素前面的某一个兄弟元素,可指定筛选条件和第几个。
|
此方法返回当前元素前面的某一个兄弟元素,可指定筛选条件和第几个。
|
||||||
@ -560,8 +524,6 @@ ele2 = ele1.prev(3, 'tag:div')
|
|||||||
txt = ele1.prev(1, 'xpath:text()')
|
txt = ele1.prev(1, 'xpath:text()')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## prevs()
|
## prevs()
|
||||||
|
|
||||||
此方法返回前面全部符合条件的兄弟元素或节点组成的列表,可用查询语法筛选。
|
此方法返回前面全部符合条件的兄弟元素或节点组成的列表,可用查询语法筛选。
|
||||||
@ -581,8 +543,6 @@ eles = ele1.prevs()
|
|||||||
divs = ele1.prevs('tag:div')
|
divs = ele1.prevs('tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## after()
|
## after()
|
||||||
|
|
||||||
此方法返回当前元素后面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
|
此方法返回当前元素后面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
|
||||||
@ -606,8 +566,6 @@ ele2 = ele1.after(3, 'tag:div')
|
|||||||
txt = ele1.after(1, 'xpath:text()')
|
txt = ele1.after(1, 'xpath:text()')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## afters()
|
## afters()
|
||||||
|
|
||||||
此方法返回后面符合条件的全部元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
|
此方法返回后面符合条件的全部元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
|
||||||
@ -627,8 +585,6 @@ eles = ele1.prevs()
|
|||||||
divs = ele1.prevs('tag:div')
|
divs = ele1.prevs('tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## before()
|
## before()
|
||||||
|
|
||||||
此方法返回当前元素前面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
|
此方法返回当前元素前面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
|
||||||
@ -652,8 +608,6 @@ ele2 = ele1.before(3, 'tag:div')
|
|||||||
txt = ele1.before(1, 'xpath:text()')
|
txt = ele1.before(1, 'xpath:text()')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## befores()
|
## befores()
|
||||||
|
|
||||||
此方法返回前面全部符合条件的元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
|
此方法返回前面全部符合条件的元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。
|
||||||
@ -698,8 +652,6 @@ ele2 = ele1.left(3)
|
|||||||
ele2 = ele1.left(3, 'tag:div')
|
ele2 = ele1.left(3, 'tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## lefts()
|
## lefts()
|
||||||
|
|
||||||
此方法返回左边全部符合条件的元素组成的列表,可用查询语法筛选。
|
此方法返回左边全部符合条件的元素组成的列表,可用查询语法筛选。
|
||||||
@ -718,8 +670,6 @@ eles = ele1.lefts()
|
|||||||
divs = ele1.lefts('tag:div')
|
divs = ele1.lefts('tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## right()
|
## right()
|
||||||
|
|
||||||
此方法返回当前元素左边的某一个元素,可指定筛选条件和第几个。
|
此方法返回当前元素左边的某一个元素,可指定筛选条件和第几个。
|
||||||
@ -739,8 +689,6 @@ ele2 = ele1.right(3)
|
|||||||
ele2 = ele1.right(3, 'tag:div')
|
ele2 = ele1.right(3, 'tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## rights()
|
## rights()
|
||||||
|
|
||||||
此方法返回右边全部符合条件的元素组成的列表,可用查询语法筛选。
|
此方法返回右边全部符合条件的元素组成的列表,可用查询语法筛选。
|
||||||
@ -759,8 +707,6 @@ eles = ele1.rights()
|
|||||||
divs = ele1.rights('tag:div')
|
divs = ele1.rights('tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## below()
|
## below()
|
||||||
|
|
||||||
此方法返回当前元素下边的某一个元素,可指定筛选条件和第几个。
|
此方法返回当前元素下边的某一个元素,可指定筛选条件和第几个。
|
||||||
@ -780,8 +726,6 @@ ele2 = ele1.below(3)
|
|||||||
ele2 = ele1.below(3, 'tag:div')
|
ele2 = ele1.below(3, 'tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## belows()
|
## belows()
|
||||||
|
|
||||||
此方法返回下边全部符合条件的元素组成的列表,可用查询语法筛选。
|
此方法返回下边全部符合条件的元素组成的列表,可用查询语法筛选。
|
||||||
@ -800,8 +744,6 @@ eles = ele1.belows()
|
|||||||
divs = ele1.belows('tag:div')
|
divs = ele1.belows('tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## above()
|
## above()
|
||||||
|
|
||||||
此方法返回当前元素上边的某一个元素,可指定筛选条件和第几个。
|
此方法返回当前元素上边的某一个元素,可指定筛选条件和第几个。
|
||||||
@ -821,8 +763,6 @@ ele2 = ele1.above(3)
|
|||||||
ele2 = ele1.above(3, 'tag:div')
|
ele2 = ele1.above(3, 'tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## aboves()
|
## aboves()
|
||||||
|
|
||||||
此方法返回上边全部符合条件的元素组成的列表,可用查询语法筛选。
|
此方法返回上边全部符合条件的元素组成的列表,可用查询语法筛选。
|
||||||
@ -841,8 +781,6 @@ eles = ele1.aboves()
|
|||||||
divs = ele1.aboves('tag:div')
|
divs = ele1.aboves('tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## near()
|
## near()
|
||||||
|
|
||||||
此方法返回最接近当前元素的某一个元素,可指定筛选条件和第几个。
|
此方法返回最接近当前元素的某一个元素,可指定筛选条件和第几个。
|
||||||
@ -862,8 +800,6 @@ ele2 = ele1.near(3)
|
|||||||
ele2 = ele1.near(3, 'tag:div')
|
ele2 = ele1.near(3, 'tag:div')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## nears()
|
## nears()
|
||||||
|
|
||||||
此方法返回该元素附近全部符合条件的元素组成的列表,可用查询语法筛选。
|
此方法返回该元素附近全部符合条件的元素组成的列表,可用查询语法筛选。
|
||||||
@ -888,7 +824,8 @@ divs = ele1.nears('tag:div')
|
|||||||
对`ShadowRootElement`对象进行相对定位时,把它看作其父对象内部的第一个对象,其余定位逻辑与普通对象一致。
|
对`ShadowRootElement`对象进行相对定位时,把它看作其父对象内部的第一个对象,其余定位逻辑与普通对象一致。
|
||||||
|
|
||||||
!> **注意:** <br>
|
!> **注意:** <br>
|
||||||
如果`ShadowRootElement`元素的下级元素中有其它`ShadowRootElement`元素,那这些下级`ShadowRootElement`元素内部是无法直接通过定位语句查找到的,只能先定位到其父元素,再用`shadow-root`属性获取。
|
如果`ShadowRootElement`元素的下级元素中有其它`ShadowRootElement`元素,那这些下级`ShadowRootElement`
|
||||||
|
元素内部是无法直接通过定位语句查找到的,只能先定位到其父元素,再用`shadow-root`属性获取。
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# 获取一个 shadow-root 元素
|
# 获取一个 shadow-root 元素
|
||||||
|
@ -226,6 +226,16 @@ page.run_script('alert(arguments[0]+arguments[1])', 'Hello', ' world!')
|
|||||||
|
|
||||||
返回:`None`
|
返回:`None`
|
||||||
|
|
||||||
|
## set_ua_to_tab()
|
||||||
|
|
||||||
|
此方法用于为当前 tab 设置 user agent,只在当前 tab 有效。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
|
||||||
|
- ua:user agent字符串
|
||||||
|
|
||||||
|
返回:None
|
||||||
|
|
||||||
## to_frame
|
## to_frame
|
||||||
|
|
||||||
此属性用于将页面焦点移到某个`frame`或`iframe`。
|
此属性用于将页面焦点移到某个`frame`或`iframe`。
|
||||||
|
Loading…
Reference in New Issue
Block a user