diff --git a/docs/README.md b/docs/README.md index c9aa159..47048e0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,7 @@ requests 爬虫面对要登录的网站时,要分析数据包、JS 源码, # 特性和亮点 -作者有多年自动化和爬虫经验,踩过无数坑,总结出的经验全写到这个库里了。内置了N多实用功能,对常用功能作了整合和优化。 +作者有多年自动化和爬虫经验,踩过无数坑,总结出的经验全写到这个库里了。内置了 N 多实用功能,对常用功能作了整合和优化。 ## 特性 @@ -34,7 +34,7 @@ requests 爬虫面对要登录的网站时,要分析数据包、JS 源码, ## 亮点功能 - 每次运行程序可以反复使用已经打开的浏览器。如手动设置网页到某个状态,再用程序接管,或手动处理登录,再用程序爬内容。无须每次运行从头启动浏览器,超级方便。 -- 使用 ini 文件保存常用配置,自动调用,也提供便捷的设置api,远离繁杂的配置项。 +- 使用 ini 文件保存常用配置,自动调用,也提供便捷的设置 api,远离繁杂的配置项。 - 极致简明的定位语法,支持直接按文本定位元素,支持直接获取前后兄弟元素和父元素等。 - 强大的下载工具,操作浏览器时也能享受快捷可靠的下载功能。 - 下载工具支持多种方式处理文件名冲突、自动创建目标路径、断链重试等。 diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 7caa9a1..3ef41ca 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,36 +1,37 @@ -* [简介](简介.md) +* ⭐️[简介](简介.md) -* 入门指南 - * [基本概念](入门指南\基本概念.md) - * [快速上手](入门指南\快速上手.md) - * 特性演示 - * [与 requests 对比](入门指南\特性演示\与requests代码对比.md) - * [与 selenium 对比](入门指南\特性演示\与selenium代码对比.md) - * [模式切换](入门指南\特性演示\模式切换.md) - * [获取并打印元素属性](入门指南\特性演示\获取并打印元素属性.md) - * [下载文件](入门指南\特性演示\下载文件.md) +* 🧭入门指南 + * 💡[基本概念](入门指南\基本概念.md) + * 🖐🏻[快速上手](入门指南\快速上手.md) + * 🎭特性演示 + * 🐙[与 requests 对比](入门指南\特性演示\与requests代码对比.md) + * 🐟[与 selenium 对比](入门指南\特性演示\与selenium代码对比.md) + * 🦈[模式切换](入门指南\特性演示\模式切换.md) + * 🐳[获取并打印元素属性](入门指南\特性演示\获取并打印元素属性.md) + * 🐳[下载文件](入门指南\特性演示\下载文件.md) -* 使用方法 - * [创建页面对象](使用方法\创建页面对象.md) - * [访问网页](使用方法\访问网页.md) - * [查找页面元素](使用方法\查找页面元素.md) - * [获取元素信息](使用方法\获取元素信息.md) - * [元素操作](使用方法\元素操作.md) - * [获取网页信息](使用方法\获取网页信息.md) - * [页面操作](使用方法\页面操作.md) - * 启动配置 - * [概述](使用方法\启动配置\概述.md) - * [Chrome 启动配置]('使用方法\启动配置\Chrome启动配置.md') - * [Session 启动配置](使用方法\启动配置\Session启动配置.md) - * [使用配置文件](使用方法\启动配置\使用配置文件.md) - * [下载文件](使用方法\下载文件.md) - * [cookies 的使用](使用方法\cookies的使用.md) - * [Drission 对象](使用方法\Drission对象.md) - * [对接 selenium 及 requests 代码](使用方法\对接selenium及requests代码.md) - * [使用其它浏览器](使用方法\使用其它浏览器.md) - * [DriverPage 和 SessionPage](使用方法\DriverPage和SessionPage.md) - * [打包程序](使用方法\打包程序.md) +* 🔠使用方法 + * 🐵[创建页面对象](使用方法\创建页面对象.md) + * 🦊[访问网页](使用方法\访问网页.md) + * 🐶[查找页面元素](使用方法\查找页面元素.md) + * 🦝[获取元素信息](使用方法\获取元素信息.md) + * 🐱[元素操作](使用方法\元素操作.md) + * 🐮[获取网页信息](使用方法\获取网页信息.md) + * 🐷[页面操作](使用方法\页面操作.md) + * 🐻启动配置 + * 🐉[概述](使用方法\启动配置\概述.md) + * 🦖[Chrome 启动配置]('使用方法\启动配置\Chrome启动配置.md') + * 🦕[Session 启动配置](使用方法\启动配置\Session启动配置.md) + * 🐊[使用配置文件](使用方法\启动配置\使用配置文件.md) + * 🐼[下载文件](使用方法\下载文件.md) + * 🐨[cookies 的使用](使用方法\cookies的使用.md) + * 🐰[Drission 对象](使用方法\Drission对象.md) + * 🐹[对接 selenium 及 requests 代码](使用方法\对接selenium及requests代码.md) + * 🦇[使用其它浏览器](使用方法\使用其它浏览器.md) + * 🦒[DriverPage 和 SessionPage](使用方法\DriverPage和SessionPage.md) + * 🐭[打包程序](使用方法\打包程序.md) + +* ✨️[Tips大集合](Tips大集合.md) +* 🎯️[版本历史](版本历史.md) +* 💐[鸣谢](鸣谢.md) -* [Tips大集合](Tips大集合.md) -* [版本历史](版本历史.md) -* [鸣谢](鸣谢.md) \ No newline at end of file diff --git a/docs/使用方法/查找页面元素.md b/docs/使用方法/查找页面元素.md index cc65575..0b3584d 100644 --- a/docs/使用方法/查找页面元素.md +++ b/docs/使用方法/查找页面元素.md @@ -9,7 +9,7 @@ - 根据 DOM 结构相对定位 - 根据页面布局位置相对定位 -d 模式的元素还有专门用于处理 shadow dom 的 `shadow_root` 属性。获取到的元素可继续用这些方法获取后代元素,使用方法和普通元素一致。 +d 模式的元素还有专门用于处理 shadow dom 的`shadow_root`属性。获取到的元素可继续用这些方法获取后代元素,使用方法和普通元素一致。 # 示例 @@ -97,7 +97,7 @@ IOT/物联网/边缘计算 ## ele() -此方法用于查找并返回第一个匹配的元素,d 模式下返回 DriverElement,s 模式下返回 SessionElement,用 xpath 获取元素属性时,直接返回属性文本。查找不到结果则返回 None。 +此方法用于查找并返回第一个匹配的元素,d 模式下返回`DriverElement`,s 模式下返回`SessionElement`,用 xpath 获取元素属性时,直接返回属性文本。查找不到结果则返回`None`。 参数: @@ -105,7 +105,7 @@ IOT/物联网/边缘计算 - loc_or_ele(页面对象拥有):元素的定位信息,可以是元素对象,loc 元组,或查询字符串 - timeout:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效 -返回:s 模式下返回 SessionElement,d 模式下返回 DriverElement,或用 xpath 获取到的属性值 +返回:s 模式下返回`SessionElement`,d 模式下返回`DriverElement`,或用 xpath 获取到的属性值 ```python # 在页面内查找元素 @@ -122,14 +122,14 @@ class = ele1.ele('xpath://div/@class') ## eles() -此方法与 ele() 相似,但返回的是匹配到的所有元素组成的列表,用 xpath 获取元素属性时,返回属性文本组成的列表。 +此方法与`ele()`相似,但返回的是匹配到的所有元素组成的列表,用 xpath 获取元素属性时,返回属性文本组成的列表。 参数: -- loc_or_str:元素的定位信息,可以是loc元组,或查询字符串 +- loc_or_str:元素的定位信息,可以是 loc 元组,或查询字符串 - timeout:查找元素超时时间,默认与元素所在页面等待时间一致,s 模式下无效 -返回:s 模式下返回 SessionElement 组成的列表,d 模式下返回 DriverElement 组成的列表,或用 xpath 获取到的属性值组成的列表 +返回:s 模式下返回`SessionElement`组成的列表,d 模式下返回`DriverElement`组成的列表,或用 xpath 获取到的属性值组成的列表 ```python # 获取 ele 元素内的所有 p 元素 @@ -142,18 +142,18 @@ print(p_eles[0]) ## s_ele() -此方法用于在一个元素下查找后代元素,以 SessionElement 形式返回结果(xpath 获取属性值时依然是返回 str),也可以直接将一个元素或页面转换为 SessionElement 版本。 +此方法用于在一个元素下查找后代元素,以`SessionElement`形式返回结果(xpath 获取属性值时依然是返回`str`),也可以直接将一个元素或页面转换为`SessionElement`版本。 -这是为了 d 模式处理速度的提升,当爬取复杂页面信息而且不须要和元素进行交互时,生成整个页面或者主要容器元素的 SessionElement ,再在其中获取信息,可以将速度提升几个数量级。 +这是为了 d 模式处理速度的提升,当爬取复杂页面信息而且不须要和元素进行交互时,生成整个页面或者主要容器元素的`SessionElement`,再在其中获取信息,可以将速度提升几个数量级。 -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 获取到的属性值 ```python # 获取元素或页面的的 SessionElement 版本 @@ -167,15 +167,19 @@ ele2 = ele1.s_ele('search text') ele = page.s_ele('search text') ``` + + ## s_eles() -此方法与 s_ele() 相似,但返回的是匹配到的所有元素组成的列表,或属性值组成的列表。 +此方法与`s_ele()`相似,但返回的是匹配到的所有元素组成的列表,或属性值组成的列表。 参数: - loc_or_str:元素的定位信息,可以是 loc 元组,或查询字符串(必填) -返回:SessionElement 组成的列表,或用 xpath 获取到的属性值组成的列表 +返回:`SessionElement`组成的列表,或用 xpath 获取到的属性值组成的列表 + + ## active_ele @@ -185,11 +189,12 @@ ele = page.s_ele('search text') ele = page.active_ele ``` + + ## shadow_root -DriverElement 元素除了以上方法和属性外,还有 shadow_root 属性,用于获取其内部的 shadow_root 元素。 -该属性返回的是一个 ShadowRootElement,类似于 DriverElement,功能比 DriverElement 少。但也有 ele() 和 eles() 方法,可直接搜索其下的元素,返回 DriverElement 元素。 -该 DriverElement 和普通的没有区别。 +`DriverElement`元素除了以上方法和属性外,还有`shadow_root`属性,用于获取其内部的 shadow_root 元素。 +该属性返回的是一个`ShadowRootElement`,类似于`DriverElement`,功能比`DriverElement`少。但也有`ele()`和`eles()`方法,可直接搜索其下的元素,返回 `DriverElement`元素。返回的`DriverElement`和普通的没有区别。 ```python # 获取一个元素下是 shadow root @@ -202,22 +207,27 @@ ele1.click() # 查找语法 -我们使用一套简洁高效的语法去定位元素,大大简化了定位元素的代码量,增强了功能,也兼容 css selector、xpath、selenium 原生的 loc 元组(s 模式也能用)。d 模式和 s -模式定位元素的语法是完全一样的,便于模式切换时平滑过渡。 +我们使用一套简洁高效的语法去定位元素,大大简化了定位元素的代码量,增强了功能,也兼容 css selector、xpath、selenium 原生的 loc 元组(s 模式也能用)。d 模式和 s 模式定位元素的语法是完全一样的,便于模式切换时平滑过渡。 -**关键字** 是出现在定位语句最左边,用于指明该语句以哪种方式去查找元素,有以下这些: +**匹配模式** 指字符串是否完全匹配,有以下两种: ## = 表示精确匹配,匹配完全符合的文本或属性。 + + ## : 表示模糊匹配,匹配含有某个字符串的文本或属性。 + + +**关键字** 是出现在定位语句最左边,用于指明该语句以哪种方式去查找元素,有以下这些: + ## \# -表示 id 属性,只在语句最前面且单独使用时生效,可配合 = 或 :。 +表示`id`属性,只在语句最前面且单独使用时生效,可配合`=`或`:`。 ```python # 在页面中查找 id 属性为 ele_id 的元素 @@ -227,9 +237,11 @@ ele1 = page.ele('#ele_id') ele2 = ele1.ele('#:ele_id') ``` + + ## . -表示 class 属性,只在语句最前面且单独使用时生效,可配合 = 或 :。 +表示`class`属性,只在语句最前面且单独使用时生效,可配合`=`或`:`。 ```python # 查找 class 属性为 ele_class 的元素 @@ -239,10 +251,12 @@ ele2 = ele1.ele('.ele_class') ele2 = ele1.ele('.:ele_class') ``` + + ## @ 表示某个属性,只匹配一个属性。 -@ 关键字只有一个简单功能,就是匹配 @ 后面的内容,不再对后面的字符串进行解析。因此即使后面的字符串也存在 @ 或 @@,也作为要匹配的内容对待。 +`@`关键字只有一个简单功能,就是匹配`@`后面的内容,不再对后面的字符串进行解析。因此即使后面的字符串也存在`@`或`@@`,也作为要匹配的内容对待。 ```python # 查找 name 属性为 ele_name 的元素 @@ -261,20 +275,22 @@ ele2 = ele1.ele('@') ele2 = ele1.ele('@email=abc@def.com') ``` + + ## @@ -表示某个属性,多属性匹配时使用,个数不限。还能匹配要忽略的元素,匹配文本时也和 @ 不一样。 -@@ 后跟 - 时,表示 not。如: +表示某个属性,多属性匹配时使用,个数不限。还能匹配要忽略的元素,匹配文本时也和`@`不一样。 +`@@`后跟 - 时,表示 not。如: -- `@@-name`表示匹配没有 name 属性的元素 +- `@@-name`表示匹配没有`name`属性的元素 -- `@@-name=ele_name`表示匹配 name 属性不为 ele_name 的元素 +- `@@-name=ele_name`表示匹配`name`属性不为`ele_name`的元素 -如有以下情况,不能使用此方式,须改用 xpath的方式: +如有以下情况,不能使用此方式,须改用 xpath 的方式: -- 匹配文本或属性中出现 @@ +- 匹配文本或属性中出现`@@` -- 属性名本身以 - 开头 +- 属性名本身以`-`开头 ```python # 查找 name 属性为 name 且 class 属性包含 cls 文本的元素 @@ -287,9 +303,11 @@ ele2 = ele1.ele('@@-class') ele2 = ele1.ele('@@-name:ele_name') ``` + + ## text -要匹配的文本,查询字符串如开头没有任何关键字,也表示根据 text 作模糊查找。 +要匹配的文本,查询字符串如开头没有任何关键字,也表示根据传入的文本作模糊查找。 如果元素内有多个直接的文本节点,精确查找时可匹配所有文本节点拼成的字符串,模糊查找时可匹配每个文本节点。 ```python @@ -309,12 +327,14 @@ Tips:若要查找的文本包含`text:` ,可下面这样写,即第一个`t ele2 = page.ele('text:text:') ``` + + ## text() -作为查找属性时使用的文本关键字,必须与 @ 或 @@ 配合使用。 -与 @ 配合和与 @@ 配合使用时,text() 的意义是有差别的。 +作为查找属性时使用的文本关键字,必须与`@`或`@@`配合使用。 +与`@`配合和与`@@`配合使用时,`text()`的意义是有差别的。 -@text() 表示在元素的直接子文本节点中匹配,且多个节点不能合并匹配。 @@text() 表示在元素内部所有文本中匹配,且会把元素内部所有文本拼成一个总字符串再进行匹配,因此可以模糊匹配元素里面任意文本。 +`@text()`表示在元素的直接子文本节点中匹配,且多个节点不能合并匹配。 `@@text()`表示在元素内部所有文本中匹配,且会把元素内部所有文本拼成一个总字符串再进行匹配,因此可以模糊匹配元素里面任意文本。 ```python # 查找文本为 some text 的元素 @@ -337,9 +357,11 @@ ele = page.ele('text:some text') ele = page.ele('@@text():some text') ``` + + ## tag -表示元素的标签,只在语句最前面且单独使用时生效,可与 @ 或 @@ 配合使用。tag: 与 tag= 效果一致。 +表示元素的标签,只在语句最前面且单独使用时生效,可与`@`或`@@`配合使用。`tag:`与`tag=`效果一致。 ```python # 定位 div 元素 @@ -361,11 +383,13 @@ 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 selector 方式查找元素。css: 与 css= 效果一致。 +表示用 css selector 方式查找元素。`css:`与`css=`效果一致。 ```python # 查找 div 元素 @@ -375,9 +399,11 @@ ele2 = ele1.ele('css:.div') ele2 = ele1.ele('css:>div') ``` + + ## xpath -表示用 xpath 方式查找元素。xpath: 与 xpath= 效果一致。 +表示用 xpath 方式查找元素。`xpath:`与`xpath=`效果一致。 该方法支持完整的 xpath 语法,能使用 xpath 直接获取元素属性,selenium 不支持这种用法。 ```python @@ -392,8 +418,9 @@ txt = ele1.ele('xpath://div/@class') ``` **Tips:** -查找元素的后代时,selenium 原生代码要求 xpath 前面必须加 . ,否则会变成在全个页面中查找。笔者觉得这个设计是画蛇添足,既然已经通过元素查找了,自然应该只查找这个元素内部的元素。所以,用xpath 在元素下查找时,最前面 -// 或 / 前面的 . 可以省略。 +查找元素的后代时,selenium 原生代码要求 xpath 前面必须加`.`,否则会变成在全个页面中查找。笔者觉得这个设计是画蛇添足,既然已经通过元素查找了,自然应该只查找这个元素内部的元素。所以,用 xpath 在元素下查找时,最前面`//`或`/`前面的`.`可以省略。 + + ## selenium 的 loc 元组 @@ -411,7 +438,7 @@ ele = page.ele(loc2) # 等待 -d 模式下所有查找元素操作都自带等待,默认为跟随元素所在页面 timeout 属性(默认 10 秒),也可以在每次查找时单独设置,单独设置的等待时间不会改变页面原来设置。 +d 模式下所有查找元素操作都自带等待,默认为跟随元素所在页面`timeout`属性(默认 10 秒),也可以在每次查找时单独设置,单独设置的等待时间不会改变页面原来设置。 ```python # 页面初始化时设置查找元素超时时间为 15 秒 @@ -452,6 +479,8 @@ ele2 = ele1.parent(2) ele2 = ele1.parent('#id1') ``` + + ## next() 此方法返回当前元素后面的某一个兄弟元素,可指定筛选条件和第几个。 @@ -478,6 +507,8 @@ ele2 = ele1.next(3, 'tag:div') txt = ele1.next(1, 'xpath:text()') ``` + + ## nexts() 此方法返回后面全部符合条件的兄弟元素或节点组成的列表,可用查询语法筛选。 @@ -500,6 +531,8 @@ divs = ele1.nexts('tag:div') txts = ele1.nexts('xpath:text()') ``` + + ## prev() 此方法返回当前元素前面的某一个兄弟元素,可指定筛选条件和第几个。 @@ -526,6 +559,8 @@ ele2 = ele1.prev(3, 'tag:div') txt = ele1.prev(1, 'xpath:text()') ``` + + ## prevs() 此方法返回前面全部符合条件的兄弟元素或节点组成的列表,可用查询语法筛选。 @@ -545,6 +580,8 @@ eles = ele1.prevs() divs = ele1.prevs('tag:div') ``` + + ## after() 此方法返回当前元素后面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。 @@ -568,6 +605,8 @@ ele2 = ele1.after(3, 'tag:div') txt = ele1.after(1, 'xpath:text()') ``` + + ## afters() 此方法返回后面符合条件的全部元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。 @@ -587,6 +626,8 @@ eles = ele1.prevs() divs = ele1.prevs('tag:div') ``` + + ## before() 此方法返回当前元素前面的某一个元素,可指定筛选条件和第几个。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。 @@ -610,6 +651,8 @@ ele2 = ele1.before(3, 'tag:div') txt = ele1.before(1, 'xpath:text()') ``` + + ## befores() 此方法返回前面全部符合条件的元素或节点组成的列表,可用查询语法筛选。这个方法查找范围不局限在兄弟元素间,而是整个 DOM 文档。 @@ -654,6 +697,8 @@ ele2 = ele1.left(3) ele2 = ele1.left(3, 'tag:div') ``` + + ## lefts() 此方法返回左边全部符合条件的元素组成的列表,可用查询语法筛选。 @@ -672,6 +717,8 @@ eles = ele1.lefts() divs = ele1.lefts('tag:div') ``` + + ## right() 此方法返回当前元素左边的某一个元素,可指定筛选条件和第几个。 @@ -691,6 +738,8 @@ ele2 = ele1.right(3) ele2 = ele1.right(3, 'tag:div') ``` + + ## rights() 此方法返回右边全部符合条件的元素组成的列表,可用查询语法筛选。 @@ -709,6 +758,8 @@ eles = ele1.rights() divs = ele1.rights('tag:div') ``` + + ## below() 此方法返回当前元素下边的某一个元素,可指定筛选条件和第几个。 @@ -728,6 +779,8 @@ ele2 = ele1.below(3) ele2 = ele1.below(3, 'tag:div') ``` + + ## belows() 此方法返回下边全部符合条件的元素组成的列表,可用查询语法筛选。 @@ -746,6 +799,8 @@ eles = ele1.belows() divs = ele1.belows('tag:div') ``` + + ## above() 此方法返回当前元素上边的某一个元素,可指定筛选条件和第几个。 @@ -765,6 +820,8 @@ ele2 = ele1.above(3) ele2 = ele1.above(3, 'tag:div') ``` + + ## aboves() 此方法返回上边全部符合条件的元素组成的列表,可用查询语法筛选。 @@ -783,6 +840,8 @@ eles = ele1.aboves() divs = ele1.aboves('tag:div') ``` + + ## near() 此方法返回最接近当前元素的某一个元素,可指定筛选条件和第几个。 @@ -802,6 +861,8 @@ ele2 = ele1.near(3) ele2 = ele1.near(3, 'tag:div') ``` + + ## nears() 此方法返回该元素附近全部符合条件的元素组成的列表,可用查询语法筛选。 @@ -825,7 +886,7 @@ divs = ele1.nears('tag:div') 为进一步精简代码,对语法进行了精简 - 定位语法都有其简化形式。 -- 页面和元素对象都实现了 \_\_call\_\_() 方法,可直接调用。 +- 页面和元素对象都实现了`__call__()`方法,可直接调用。 - 所有查找方法都支持链式操作 示例: @@ -857,7 +918,7 @@ ele2 = ele1('x://div[@class="ele_class"]') # Tips -- 从一个 DriverElement 元素获取到的 SessionElement 版本,依然能够使用相对定位方法定位祖先或兄弟元素。 -- SessionElement 和 SessionPage 的 ele() 和 eles() 方法也有 timeout 参数,但它是不生效的,仅用于保持与 d 模式元素书写一致,便于无差别的调用。 +- 从一个`DriverElement`元素获取到的`SessionElement`版本,依然能够使用相对定位方法定位祖先或兄弟元素。 +- `SessionElement`和`SessionPage`的`ele()`和`eles()`方法也有`timeout`参数,但它是不生效的,仅用于保持与 d 模式元素书写一致,便于无差别的调用。 - 定位语句内容与关键字重复时,请使用 xpath 或 css selector 代替。