51Testing软件测试论坛

标题: Selenium - 元素定位之相对&绝对路径 [打印本页]

作者: 天天酷派哦    时间: 2018-4-10 14:16
标题: 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>

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

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

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

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



  18. [python] view plain copy
  19. driver = webdriver.Firefox()  
  20. driver.get("http://www.chesudi.com")  
  21. span_element=driver.find_element_by_tag('span')  
  22. element = driver.find_element_by_xpath(span_element,.//input[@class="btn"]  
复制代码


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

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






欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2