selenium页面对象定位方法详解(三)

我们继续来讲下页面对象的定位方法,本文主要讲xpath的定位方法。
那么讲xpath之前,我先来说下,为什么要讲xpath定位方法呢,因为很多时候我们要定位的页面对象会没有id、name、class等属性,甚至
也无法通过link text的方法定位,所以我们就需要用到xpath,xpath对于所有的对象定位都是适用的!

1、 find_element_by_xpath()
我们可以看下xpath源码中的唯一args参数,
:Args:
- xpath - The xpath locator of the element to find.
复制代码

其实我们要传入的无非就是在dom树的层级,无非就是在html中的路径。

在xpath定位过程中一般有两种方式定位,第一种是绝对路径,第二种是相对路径,我们先看绝对路径。

1)绝对路径定位
在讲绝对路径定位之前,我们还是还是一样,先来看一个(输入框)控件
selenium页面对象定位方法详解(三)
我们通过页面代码能看出来,dom树的根节点是html,那么对于绝对路径来说就是从根节点开始查找,然后一层一层让下走,最终定位到你要定位的控件。
我们要定位的输入框控件的页面xpath路径是/html/body/div/div/div/form/table/tbody/tr/td/input

此时我们回车后可以看到要定位的输入框蓝色高亮了,对应的页面代码黄色高亮了,证明我们此时写的xpath是正确的,那么我们就可以放心去代码中写了。
selenium页面对象定位方法详解(三)
那么代码如何实现呢?
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(“http://www.bcbxhome.com”)
time.sleep(5)
driver.find_element_by_xpath("/html/body/div/div/div/form/table/tbody/tr/td/input").click()
但是如果我们所有页面对象的定位都写绝对路径的话,会太复杂,写起来会太费劲,所有我们得去写一些优雅的xpath,那么相对路径应运而成!!!

2)相对路径定位
在讲相对路径之前我们先说下相对路径的概念,相对路径无非就是从中间某个路径开始查找起,不从html根节点开始查找,比如说一个爷爷有多个儿子,每个儿子也有多个儿子,我们想查找这个
爷爷的某个孙子,用相对路径的概念就是先查找到这个爷爷的某个儿子然后再去找他的儿子,比如说这个爷爷有个儿子是村官,那么相对路径就是从村官的这个儿子查找起,然后找到他的儿子,而
不需要从这个爷爷查找起!!!
selenium页面对象定位方法详解(三)
我们再言归正传,我们可以看到上图,还是要定位这个输入框,但是我们不从html根节点开始查找了,我们会发现它的某个form上级有id并且id属性值是scbar_form,那么我们就可以先定位到
这个form,然后从form开始往下走找到我们要定位的输入框,需要注意的就是相对路径的写法是//开始的,那么它的路径就是
//form[@id=‘scbar_form’]/table/tbody/tr/td/input
复制代码

那么代码实现就很简单了:
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(“http://www.bcbxhome.com”)
time.sleep(5)
driver.find_element_by_xpath("//form[@id=‘scbar_form’]/table/tbody/tr/td/input").click()
复制代码

但是不一定得是id属性才行,比如form有autocomplete属性,那么我们也可以使用它
//form[@autocomplete=‘off’]/table/tbody/tr/td/input
复制代码
但是你@的这个属性必须是唯一的,不然有可能你的xpath定位到底就不是唯一的页面对象了,那么就会导致报错。

当然,其实我们可以看到这个输入框本来自身也有很多属性,其实我们也可以通过xpath直接去定位它
比如:
//input[@name=‘srchtxt’]
复制代码
当然你也可以不写标签名称,可以直接写对应的属性值
//*[@name=‘srchtxt’]
复制代码

当然如果说name属性可能再页面有重复,需要多个属性and才能确保它唯一,我们xpath也是支持的。
//input[@name=‘srchtxt’ and @value=‘请输入搜索内容’]
复制代码

如果我们知道某个属性的属性值包含什么内容的话,xpath也可以去写包含关系的:
//input[contains(@value,‘内容’)]
复制代码

xpath是我们空间定位非常核心的部分,所以这一块如果想要学习selenium还是要多学习呢!