今天跟大家分享下selenium中根据父子、兄弟、相邻节点定位的方法,很多人在实际应用中会遇到想定位的节点无法直接定位,需要通过附近节点来相对定位的问题,但从父节点定位子节点容易,从子节点定位父节点、定位一个节点的哥哥节点就一筹莫展了,别急,且看博主一步步讲解。

1. 由父节点定位子节点

最简单的肯定就是由父节点定位子节点了,我们有很多方法可以定位,下面上个例子:

对以下代码:

< div id = "A" > <!--父节点定位子节点--> < div id = "B" > < div > parent to child </ div > </ div > </ div > </ body > </ html >

想要根据 B节点 定位无id的子节点,代码示例如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.串联寻找
print driver.find_element_by_id('B').find_element_by_tag_name('div').text
# 2.xpath父子关系寻找
print driver.find_element_by_xpath("//div[@id='B']/div").text
# 3.css selector父子关系寻找
print driver.find_element_by_css_selector('div#B>div').text
# 4.css selector nth-child
print driver.find_element_by_css_selector('div#B div:nth-child(1)').text
# 5.css selector nth-of-type
print driver.find_element_by_css_selector('div#B div:nth-of-type(1)').text
# 6.xpath轴 child
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,示例代码如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath: `.`代表当前节点; '..'代表父节点
print driver.find_element_by_xpath("//div[@id='C']/../..").text
# 2.xpath轴 parent
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节点 定位其哥哥节点呢?看代码示例:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其哥哥节点
print driver.find_element_by_xpath("//div[@id='D']/../div[1]").text
# 2.xpath轴 preceding-sibling
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节点 定位其弟弟节点,看代码示例:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/../div[3]").text
# 2.xpath轴 following-sibling
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text
# 3.xpath轴 following
print driver.find_element_by_xpath("//div[@id='D']/following::*").text
# 4.css selector +
print driver.find_element_by_css_selector('div#D + div').text
# 5.css selector ~
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. 由 节点 定位 节点 最简单的肯定就是由 节点 定位 节点 了,我们有很多方法可以 定位 ,下面上个例子:对以下代码:&lt;html&gt; &lt;body&gt; &lt;div id="A"&gt; &lt;!-- 节点 定位 节点 --&gt; &lt;div id="B"&gt; &lt;div&gt;parent to child&amp
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文件呢?