Xpath:
即为xml路径语言(XML path language)。
Xml不是用来取代HTML,而是对HTML的补充,用来与HTML协同工作的。 Xml是元标记 语言。
元标记:
表示可以从标记中就可以看出描述的内容本身什么。
Xpath使用路径表达式来选取XML文件中的节点或者节点集。
路径:
绝对路径 和 相对路径
xpath定位元素的原理遍历的原理。
使用绝对路径来定位元素 定位到第一个输入框并输入内容
driver.find_element_by_xpath("html/body/form/span/input").send_keys("使用绝对路径来定位第一个输入框")
使用绝对路径来找元素的缺点:
一旦目录结构发生了改变,路径也就随之失效,必须重新定位。
/
表示从根节点选取,也就是从当前节点的最顶层(HTML中默认情况下当前当前节点的最顶层是html标签。如果从某个元素开始,则当前节点就表示此元素)
//
表示从匹配选取的当前节点 向下 选取文档中的节点,不考虑他所在的位置。
使用相对路径来查找元素
// 表示从匹配选取的当前节点 向下 选取文档中的节点,不考虑他所在的位置。
driver.find_element_by_xpath("//input").send_keys("使用相对路径来查找元素")
.
(点) 表示选取当前节点
. (点)表示选取当前节点 自己
driver.find_element_by_xpath("//input/.").send_keys(". (点)表示选取当前节点 自己")
(两个点) 表示选取当前节点的父节点
表示选取当前节点的父节点
print (driver.find_element_by_xpath("//input/..").get_attribute("id"))
索引定位
例如:
//input[2] 表示匹配任意一个节点下的第二个input标签 索引是从1开始。
不是匹配到所有的input标签中的第二个。
索引定位 //input[2] 表示匹配任意一个节点下的第二个input标签
driver.find_element_by_xpath("//input[2]").send_keys("//input[2] 表示匹配任意一个节点下的第二个input标签")
属性定位
使用 @ 来选取属性,格式: //input[@属性名=”属性值”]
//input[@id="IamID"] 表示匹配到任意一个节点下的 id属性值为IamID的input标签
属性定位 使用 @ 来选取属性, 格式: //标签名[@属性名=”属性值”]
driver.find_element_by_xpath('//input[@id="IamID"]').send_keys("属性定位,使用 @ 来选取属性")
使用 * 来代替标签名 通配符
//*[@id="IamID"] 表示匹配到任意一个节点下的 id属性值为IamID的任意一个标签
# 使用 * 来替代标签名
driver.find_element_by_xpath('//*[@id="IamID"]').send_keys("使用 * 来替代标签名")
格式:
//*[contains(@属性名, “部分属性值”)]
例如:
//*[contains(@id, "IamID")] 表示匹配到任意一个节点下的 id属性值包含IamID的任意一个元素
contains() 格式: //*[contains(@属性名,“部分属性值”)]
例如:
//*[contains(@id, "IamID")] 表示匹配到任意一个节点下的 id属性值包含IamID的任意一个元素
driver.find_element_by_xpath('//*[contains(@id, "Iam")]').send_keys("contains()")
**格式:**
//*[starts-with(@属性名, “属性的开始部分的值”)]
starts-with() 格式: //*[starts-with(@属性名, “属性的开始部分的值”)]
driver.find_element_by_xpath('//*[starts-with(@id, "Iam")]').send_keys("starts-with()")
格式:
//*[ends-with(@属性名, “属性的结束部分的值”)]
ends-with() 是xpath 2.0的语法,但是目前浏览器还不支持。
使用全部文本来定位 //*[text()="早发白帝城 "]
print (driver.find_element_by_xpath('//*[text()="早发白帝城 "]').text)
使用部分文本内容来定位元素 格式: //*[contains(text(), “部分文本内容”)]
print (driver.find_element_by_xpath('//*[contains(text(), "发")]').get_attribute("id"))
Xpath轴定位的应用场景:当某个元素的各个属性及其组合都不足以定位时,可以利用其它兄弟节点或者父节点等各种可以定位的元素进行辅助定位。
使用语法: 轴名称::标签名
parent:: 表示选取当前节点的父节点
print (driver.find_element_by_xpath('//*[@id="title"]/parent::span').tag_name)
child:: 表示选取当前节点的子元素
print (driver.find_element_by_xpath('//*[@id="title"]/child::br').tag_name)
ancestor:: 表示选取当前节点的 直系先辈
print (driver.find_element_by_xpath('//*[@id="form"]/child::span/child::a[3]/ancestor::body').text)
descendant:: 表示选取当前节点的所有的直系 后代元素
driver.find_element_by_xpath('//*[@id="form"]/descendant::input[2]').send_keys("descendant:: 表示选取当前节点的所有的直系 后代元素")
preceding:: 表示选取当前节点的开始标签 之前的 所有的元素 如果要使用索引,则索引是从当前节点开始往前数
print (driver.find_element_by_xpath('//*[@id="form"]/descendant::input[2]/preceding::a[1]').text)
preceding-sibling:: 表示选取当前节点 的开始标签 之前 的所有的 同级 节点(要定位的节点的结束标签要在 当前节点 的开始标签 之前)
print (driver.find_element_by_xpath('//*[@id="jiayucun"]/preceding-sibling::a[2]').text)
following:: 表示选取当前节点 的结束标签 之后 的所有节点(即要定位的元素的开始标签要在当前元素的 结束标签之后)
print(driver.find_element_by_xpath('//*[@id="jiayucun"]/following::div[1]').text)
following-sibling:: 表示选取当前节点 的结束标签 之后 的所有 同级 节点
print (driver.find_element_by_xpath('//*[@id="jiayucun"]/following-sibling::span').text)
and //*[@id=“IamID” and @name=“first”] 表示要定位的元素id属性的值为IamID并且name属性的值为first 的任意一个元素
driver.find_element_by_xpath('//*[@id="IamID" and @name="first" and @class="poem"]').send_keys("逻辑运算符and")
or
driver.find_element_by_xpath('//*[@id="IamID" or @name="first"]').send_keys('or')
not()
print (driver.find_element_by_xpath('//*[not(@id="IamID" and @name="first")]').tag_name)