天天酷派哦 发表于 2018-4-10 14:16:29

Selenium - 元素定位之相对&绝对路径

上一篇简要介绍了一下selenium元素定位的各种方法,这里简单讲一下元素定位的绝对路径和相对路径的概念。

绝对路径,这里以xpath举例:

/html/body/div/form[@name=“f”]/span[@class=“bg s_btn_wr”]/input[@id="su"]

这就是一个绝对路径,从网页的root节点html开始,按照xpath的路径一层一层向下寻找。如果当中有任意
一个节点没有找到对应的元素,那么就会返回none。比如form之前还有一层div,那么按照绝对路径是找
不到input这个元素的,因为在第一个div之后并没有form元素的存在。
相对路径:

在selenium的元素定位中,真正常用的是相对路径,因为绝对路径太过冗长而且死板。而相对路径就灵活
地多,既可以扫描整个文档返回符合路径定义的元素,也可以在某个特定元素下去搜索。

// :只依据给出的路径匹配节点而不考虑当前节点在哪里

还是以上面那个input元素为例,我可以写成//input[@id="su"], 也可以写成//span/input[@id='su'], 亦或//
span[@class="bg s_btn_wr"]/input. 都可以定位到input这个元素。这些xpath语句翻译出来就是,找到所
有id为su的input元素,找到所有上层元素是span且id为su的input元素,找到所有上层元素span的class为bg
s_btn_wr的input元素。 selenium会去搜索整个文档,只要符合你给出的这一段路径都会返回。

再举个例子 //span[@class="bg s_btn_wr"], 如下的这些span元素都能够找到

<html>/<span class="bg s_btn_wr">...</span>

<html>/<div>...</div>/<span class="bg s_btn_wr">...</span>

<html>/<div></div>/<span></span>/<span class="bg s_btn_wr">...</span>

接下来介绍另一个相对路径的表达

.// :依据给出的路径匹配当前元素下节点

这个表达式只会搜索当前节点下符合路径的元素,而不是整个文档。

view plain copy
<html>
<div>
<input class='btn',name="button1">
</div>
<div>
    <span>
         <input   class='btn',name="button2">
    </span>
</div>
</html>
以上面这段html为例:
view plain copy
driver = webdriver.Firefox()
driver.get("http://www.chesudi.com")
element = driver.find_element_by_xpath(.//input[@class="btn"])
这里因为没有指定当前的元素所以还从root节点开始查找整个文档, 所以button1和button2都是符合条件的。



view plain copy
driver = webdriver.Firefox()
driver.get("http://www.chesudi.com")
span_element=driver.find_element_by_tag('span')
element = driver.find_element_by_xpath(span_element,.//input[@class="btn"]

这里我们先找到了span元素,然后在他的子元素中去寻找class=btn的input元素,那么只有button2会被找到。

在实践中发现,并不总能遇到通过一些唯一属性组合定位到元素的情况。特别是现在很多网页的内容是靠
动态加载进来的,而不是hard code在代码中,那么想通过唯一的属性组合定位元素就很困难。因为只有一
些元素会有ID,name等属性,那些动态加载进来的内容由于运用了模板,其class,css等属性都是相同的。
这个时候就可以先定位到可以定位的元素,然后利用相对路径在它的子元素中再去筛选符合条件的元素。
这样范围变小了,定位也会相对容易,代码也更简洁易懂。

页: [1]
查看完整版本: Selenium - 元素定位之相对&绝对路径