今天跟大家分享下selenium中根据父子、兄弟、相邻节点定位的方法,很多人在实际应用中会遇到想定位的节点无法直接定位,需要通过附近节点来相对定位的问题,但从父节点定位子节点容易,从子节点定位父节点、定位一个节点的哥哥节点就一筹莫展了,别急,且看博主一步步讲解。
1. 由父节点定位子节点
最简单的肯定就是由父节点定位子节点了,我们有很多方法可以定位,下面上个例子:
对以下代码:
<
div
id
=
"A"
>
<
div
id
=
"B"
>
<
div
>
parent to child
</
div
>
</
div
>
</
div
>
</
body
>
</
html
>
想要根据 B节点 定位无id的子节点,代码示例如下:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
print driver.find_element_by_id('B').find_element_by_tag_name('div').text
print driver.find_element_by_xpath("//div[@id='B']/div").text
print driver.find_element_by_css_selector('div#B>div').text
print driver.find_element_by_css_selector('div#B div:nth-child(1)').text
print driver.find_element_by_css_selector('div#B div:nth-of-type(1)').text
print driver.find_element_by_xpath("//div[@id='B']/child::div").text
driver.quit()
parent to child
parent to child
parent to child
parent to child
parent to child
parent to child
第1到第3都是我们熟悉的方法,便不再多言。第4种方法用到了css选择器:
nth-child(n)
,该选择器返回第n个节点,该节点为div标签;第5种方法用到了另一个css选择器:
nth-of-type(n)
,该选择器返回第n个div标签,注意与上一个选择器的区别;第6种方法用到了
xpath轴 child
,这个是xpath默认的轴,可以忽略不写,其实质是跟方法2一样的。
当然,css中还有一些选择器是可以选择父子关系的如
last-child
、
nth-last-child
等,感兴趣可以自行百度,有机会博主会讲讲css selector。
2. 由子节点定位父节点
由子节点想要定位到父节点就有点难度了,对以下代码:
<
div
id
=
"A"
>
<
div
>
child to parent
<
div
id
=
"C"
>
</
div
>
</
div
>
</
div
>
</
div
>
</
div
>
</
body
>
</
html
>
我们想要由 C节点 定位其两层父节点的div,示例代码如下:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
print driver.find_element_by_xpath("//div[@id='C']/../..").text
print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text
driver.quit()
child to parent
child to parent
这里我们有两种办法,第1种是
..
的形式,就像我们知道的,
.
表示当前节点,
..
表示父节点;第2种办法跟上面一样,是xpath轴中的一个:
parent
,取当前节点的父节点。这里也是css selector的一个痛点,因为css的设计不允许有能够获取父节点的办法(至少目前没有)
3. 由弟弟节点定位哥哥节点
这是第3、第4种情况,我们这里要定位的是兄弟节点了。如以下源码:
<
div
>
brother 1
</
div
>
<
div
id
=
"D"
>
</
div
>
<
div
>
brother 2
</
div
>
</
div
>
</
body
>
</
html
>
怎么通过 D节点 定位其哥哥节点呢?看代码示例:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
print driver.find_element_by_xpath("//div[@id='D']/../div[1]").text
print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text
driver.quit()
brother 1
brother 1
这里博主也列举了两种方法,一种是通过该节点的父节点来获得哥哥节点,另外一种比较优雅,是通过
xpath轴:preceding-sibling
,其能够获取当前节点的所有同级哥哥节点,注意括号里的标号,
1
代表着离当前节点最近的一个哥哥节点,数字越大表示离当前节点越远
,当然,
xpath轴:preceding
也可以,但是使用起来比较复杂,它获取到的是该节点之前的所有非祖先节点(这里不太好解释,改天专门写篇博文讲解下所有的轴)
4. 由哥哥节点定位弟弟节点
源码与
3
一致,要想通过 D节点 定位其弟弟节点,看代码示例:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
print driver.find_element_by_xpath("//div[@id='D']/../div[3]").text
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text
print driver.find_element_by_xpath("//div[@id='D']/following::*").text
print driver.find_element_by_css_selector('div#D + div').text
print driver.find_element_by_css_selector('div#D ~ div').text
driver.quit()
brother 2
brother 2
brother 2
brother 2
brother 2
博主分享了五种方法定位其弟弟节点,上面三种是用xpath,第一种很好理解,第二种用到了
xpath轴:following-sibling
,跟
preceding-sibling
类似,它的作用是获取当前节点的所有同级弟弟节点,同样,
1
代表离当前节点最近的一个弟弟节点,数字越大表示离当前节点越远
;第三种用到了
xpath轴:following
,获取到该节点之后所有节点,除了祖先节点(跟
preceding
方向相反,但因为往下顺序容易读,不容易出错,所以也是可以用来获取弟弟节点的,但也不建议这么使用);第四、第五种,我们用到了css selector,
+
和
~
的区别是:
+
表示紧跟在当前节点之后的div节点,
~
表示当前节点之后的div节点,如果用find_elements,则可获取到一组div节点。
以上就是博主今天分享的内容,通过这些方法,你可以随意根据一个元素定位到其他任何一个位置的元素,这样,相对元素定位再不是难事了吧。有什么问题给我留言吧。
更多关于python selenium的文章,请关注我的CSDN专栏:
Python Selenium自动化测试详解
今天跟大家分享下selenium中根据父子、兄弟、相邻节点定位的方法,很多人在实际应用中会遇到想定位的节点无法直接定位,需要通过附近节点来相对定位的问题,但从父节点定位子节点容易,从子节点定位父节点、定位一个节点的哥哥节点就一筹莫展了,别急,且看博主一步步讲解。1. 由父节点定位子节点最简单的肯定就是由父节点定位子节点了,我们有很多方法可以定位,下面上个例子:对以下代码:<html><body>
1. 由
父
节点
定位
子
节点
最简单的肯定就是由
父
节点
定位
子
节点
了,我们有很多方法可以
定位
,下面上个例子:对以下代码:<html>
<body>
<div id="A">
<!--
父
节点
定位
子
节点
-->
<div id="B">
<div>parent to child&
id
定位
:find_element_by_id()
name
定位
:find_element_by_name()
class
定位
:find_element_by_class_name()
link
定位
:find_element_by_link_text()
partial link
定位
:find_element_by_partial_link_text()
tag
定位
:find_element_by_tag_name()
xpath
定位
:find_element
元素
的信息就是指
元素
的标签名以及
元素
的属性
元素
的层级结构就是指
元素
之间相互嵌套的层级结构
元素
定位
最终就是通过
元素
的信息或者
元素
的层级机构来进行
元素
定位
Selenium
八种
定位
元素
方法
id
定位
name
定位
class_name
定位
tag_name
定位
link_text
定位
partail_link_text
定位
xpath
定位
css
定位
id
定位
通过
元素
的id属性值来进行
元素
定位
,在HTML标准规范中i
1.//td[contains(text(),'2104191603')]/../td[1]
2.//td[contains(text(),'2104191603')]/preceding-sibling::td[1]
都是通过当前
节点
定位
同一级上一个
节点
。可以通过修改对应级别去
定位
想要的
节点
。
如果需要通过前面的
节点
去
定位
后面的
节点
:
//td[contains(text()..
xpath
是一种在xm文档中
定位
的语言,详细简介,请自行参照百度百科,本文主要总结一下
xpath
的使用方法,个人看法,如有不足和错误,敬请指出。
注意:
xpath
的
定位
同一级别的多个标签 索引从1开始 而不是0
1. 绝对
定位
:
此方法最为简单,具体格式为
xxx.find_element_by_
xpath
(“绝对路径”)
具体例子:
xxx.find_element_by_
xpath
(“/html/body/div[x]/form/input”) x 代表第x个 div标签,注意,索引从1开始而不是0
此方法缺点显而易见,当页面
元素
位置发生改变时,都需要修改,因此,并不推荐使用。
### 回答1:
Python
Selenium
是一个
自动化测试
工具,可以使用
XPath
定位
元素
。
XPath
是一种用于在 XML 文档中
定位
元素
的语言,也可以用于 HTML 文档中。在
Python
Selenium
中,可以使用 find_element_by_
xpath
() 方法来
定位
元素
。例如:
from
selenium
import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 通过
XPath
定位
搜索框
search_box = driver.find_element_by_
xpath
("//input[@id='kw']")
# 在搜索框中输入关键字
search_box.send_keys("
Python
Selenium
")
# 提交搜索
search_box.submit()
# 关闭浏览器
driver.quit()
在上面的例子中,我们使用了
XPath
定位
了百度搜索框,并在搜索框中输入了关键字,然后提交了搜索。
XPath
的语法比较复杂,需要学习一些基本的语法规则才能灵活运用。
### 回答2:
Python
Selenium
是
自动化测试
领域中非常流行的工具,其
定位
元素
的
方式
有多种,其中
Xpath
是其中最为强大和灵活的一种。下面我们将详细讲解
Python
Selenium
中
Xpath
定位
的相关知识。
1. 什么是
Xpath
?
Xpath
是一种XML路径语言,它是用来选择 XML 文档中的
元素
和属性的语言。在
Python
Selenium
中,
Xpath
可以
定位
web 页面中的
元素
。
2.
Xpath
的基本语法
在
Python
Selenium
中,使用
Xpath
定位
元素
,需要先获取到
Xpath
的路径,
Xpath
语法如下:
- 选择器:
- "/"表示选择根
节点
。
- "//"表示选择任意
节点
。
- "."表示选择当前
节点
。
- ".."表示选择当前
节点
的
父
节点
。
- "@"表示选择属性
节点
。
- 谓语:
- "[]"表示添加谓语条件。
- "and"表示连接两个或多个谓语。
- "or"表示选择两个或多个
元素
其中一个。
- "ancestor"表示选择当前
节点
的所有祖先
节点
。
- "ancestor-or-self"表示选择当前
节点
的所有祖先
节点
及自身。
- "attribute"表示选择当前
节点
的所有属性
节点
。
- "child"表示选择当前
节点
的所有子
节点
。
- "descendant"表示选择当前
节点
的所有后代
节点
。
- "descendant-or-self"表示选择当前
节点
的所有后代
节点
及自身。
- "following"表示选择当前
节点
之后的所有
节点
。
- "following-sibling"表示选择当前
节点
之后的所有同级
节点
。
- "parent"表示选择当前
节点
的
父
节点
。
- "preceding"表示选择当前
节点
之前的所有
节点
。
- "preceding-sibling"表示选择当前
节点
之前的所有同级
节点
。
- "self"表示选择当前
节点
自身。
3. 实际应用
Xpath
定位
元素
的实际运用,需要先查看页面源代码,如下面的代码片段:
```html
<div class="container">
<h1>这是一段文本</h1>
<li class="item"><a href="https://www.baidu.com">百度一下</a></li>
<li class="item"><a href="https://www.google.com">Google</a></li>
<li class="item"><a href="https://www.bing.com">必应搜索</a></li>
我们可以使用以下
Xpath
定位
节点
:
- 选择根
节点
:"/"
- 选择 ul
节点
:"/div/ul"
- 选择第一个 li
节点
:"/div/ul/li[1]"
- 选择 class 为 item 的所有 li
节点
:"/div/ul/li[@class='item']"
- 选择 href 属性值等于 "https://www.baidu.com" 的 a
节点
:"/div/ul/li/a[@href='https://www.baidu.com']"
如下就是使用
Python
Selenium
中
Xpath
定位
元素
的实例代码:
```
python
from
selenium
import webdriver
# 创建 driver 对象
driver = webdriver.Chrome()
# 打开目标网页
driver.get("https://www.baidu.com")
# 使用
Xpath
定位
搜索框,输入搜索内容
search_box = driver.find_element_by_
xpath
('//input[@name="wd"]')
search_box.send_keys("
Python
Selenium
Xpath
")
# 使用
Xpath
定位
搜索按钮,点击搜索
search_button = driver.find_element_by_
xpath
('//input[@type="submit"]')
search_button.click()
# 关闭 driver 对象
driver.quit()
以上实例中,我们使用
Xpath
定位
搜索框和搜索按钮,并将搜索内容输入后按下搜索按钮,最后关闭 driver 对象。
本文介绍了
Python
Selenium
中
Xpath
定位
的相关知识,包括
Xpath
的基本语法、
Xpath
定位
的应用和实例代码。学习
Xpath
定位
元素
,可以快速便捷地
定位
web 页面中的
元素
,达到
自动化测试
的目的。
### 回答3:
Python
selenium
是一个在
Python
语言中使用的
自动化测试
工具库,提供了丰富的API让开发人员可以通过
Python
代码来模拟用户与浏览器之间的交互,从而达到
自动化测试
的目的。在
Python
selenium
中,使用
Xpath
定位
元素
是非常常用的技巧之一,下面就简单介绍一下
Python
selenium
Xpath
定位
的相关知识:
一、
Xpath
概述
Xpath
(XML Path Language)即为XML路径语言,它是一种在XML文档中
定位
节点
的语言。在HTML中,XML Path Language同样适用,可以通过
Xpath
定位
HTML中的
元素
。
Xpath
最初是由W3C组织设计开发的,用于解析和浏览XML文档,后来经过多次升级和改进,已经成为了XML
定位
技术的标准之一,也广泛应用于网页
自动化测试
领域。
二、
Xpath
定位
语法
在
Python
selenium
中使用
Xpath
语法来
定位
元素
时,通常有两种选择:绝对路径和相对路径。根据具体的
定位
需求,选择不同的路径
方式
会有不同的注意点和代码实现。下面针对这两种
方式
来具体说明:
1、绝对路径
绝对路径从 HTML 文档根目录开始,一直
定位
到需要操作的
元素
。其路径表达式的格式如下:
/html/head/body/div[1]/span[2]
其中 / 表示从文档的根
节点
开始,html 表示文档的根
元素
,head 表示文档的 head
元素
,body 表示文档的 body
元素
,div[1] 表示 body
元素
下的第一个 div
元素
,span[2] 表示 div[1]
元素
下的第二个 span
元素
。
2、相对路径
相对路径是从已经找到的
元素
出发,在其子
元素
中查找需要操作的
元素
。其路径表达式的格式如下:
//div[@id='content']/table/tbody/tr[2]/td[1]/a
其中 // 表示无论在文档的什么地方开始查找,div[@id='content'] 表示在id为 content 的 div
元素
下面查找,table/tbody/tr[2]/td[1]/a 表示在这个 div
元素
下,找到第2个 tr
元素
,然后再找到这个 tr
元素
下的第1个 td
元素
,最后再找到这个 td
元素
下的第1个 a
元素
。
三、
Xpath
定位
实战
下面就通过一个具体的实例来进一步说明
Python
selenium
如何使用
Xpath
语法来
定位
元素
:
假设我们需要登录网站http://www.baidu.com,并在搜索框中输入“
Python
”,在搜索结果页面查找其中一条结果,并取出其中的标题和链接。这个操作可以通过
Xpath
定位
实现,代码如下:
```
python
from
selenium
import webdriver
import time
# 实例化浏览器对象
driver = webdriver.Firefox()
# 打开网站首页
driver.get("http://www.baidu.com")
# 查找搜索框,并在其中输入
Python
driver.find_element_by_
xpath
('//input[@id="kw"]').send_keys("
Python
")
# 查找搜索按钮,并模拟点击
driver.find_element_by_
xpath
('//input[@id="su"]').click()
time.sleep(2)
# 根据标签名和类名来
定位
搜索结果中的
元素
results = driver.find_elements_by_
xpath
('//h3[@class="t"]/a')
# 遍历所有搜索结果,并输出每一个结果的标题和链接
for result in results:
print(result.text)
print(result.get_attribute('href'))
# 关闭浏览器
driver.quit()
在这段代码中,首先实例化了一个Firefox浏览器对象,并打开了http://www.baidu.com这个网站。然后使用
Xpath
查找了搜索输入框和搜索按钮,并模拟了一下用户的输入和点击操作。之后,使用
Xpath
查找了搜索结果中的所有
元素
,并依次遍历这些
元素
,分别输出它们的标题和链接。最后,调用浏览器的quit()方法关闭了浏览器。
综上,
Python
selenium
Xpath
定位
是一种常用的
自动化测试
技巧,掌握它可以大大提高测试效率和质量。在实际应用中,需要根据具体的需求选择合适的
定位
路径和语法,谨慎使用并且多加实践。
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMathFunc))
with open('UnittestTextReport.txt', 'a') as f:
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(suite)
楼主大佬,请问,按照这个文件执行为什么没有在同级目录下生成UnittestTextReport.txt文件呢?