前言
这些是过去学习和工作中积累的个人总结,不过可能会存在一些主观臆断,如果有说错的地方,请指出来哦!
回答
首先,我们需要了解Selenium是如何定位元素的。
Selenium提供8种定位方式,分别是id定位、name定位、className定位、tagName定位、linkText定位、partial link text定位、css selector定位以及xpath定位。
- id
- 说明:通过元素的id属性来定位元素,具有唯一性,定位后基本不会重复
- 前提:元素有id属性
- id定位方法:webDriver.findElement(By.id(“id”))
- name
- 说明:通过name属性来指定元素名称,相对少见,但容易重名
- 前提:元素有name属性
- name定位方法:webDriver.findElement(By.name(“name”));
- className
- 说明:指定元素的类名,通过class属性来定位;不推荐,重复的概率非常高
- 前提:元素有class属性
- class_name定位方法:webDriver.findElement(By.className(“className”));
- tagName
- 说明:HTML本质就是由不同的tag(标签)组成,而每个tag都是指同一类,所以一定会返回多个结果,一般不建议使用,可用于查找多个重复的内容的时候使用。
- tag_name定位方法:webDriver.findElement(By.tagName(“tagName”));
- linkText
- 说明:linkText定位与前面4个定位有所不同,它专门用来定位超链接文本(文本值)
- 前提:定位的元素是链接标签(a标签)
- linkText定位方法:webDriver.findElement(By.linkText(“linkText”));
- partialLinkText
- 说明:partialLinkText定位是对link_text定位的补充,partialLinkText为模糊匹配;linkText为精确匹配。
- 前提:定位的元素是链接标签(a标签);通过传入a标签局部文本或全部文本来定位元素,要求输入的文本能够唯一找到这个元素
- partialLinkText定位方法:webDriver.findElement(By.partialLinkText(“partialLinkText”));
- xpath
- 说明:有自己的独特语法,基于文件系统树状结构形态定位的
- xpath定位方法:webDriver.findElement(By.xpath(“xpath”));
- 相对路径:类似于一种查询的调用
- //*[@id=“kw”]
- 绝对路径:一般不用绝对路径,很难维护
- /html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input
- 相对路径:类似于一种查询的调用
- cssSelector
- 说明:定位界相对万金油的定位方法,有自己的独特语法,不过定位语法很麻烦
- cssSelector定位方法:webDriver.findElement(By.cssSelector(“cssSelector”))
对于这8种定位方式在日常使用中该怎么使用呢?
一般而言优先考虑id定位,name定位,className定位,tagName定位。其中id定位是最优先考虑的,因为它通常是唯一的。name、className和tagName定位也很常用,但它们可能存在元素重复的情况。当元素为超链接时,优先使用linkText定位或partialLinkText定位。如果元素是动态、不唯一、重复的,则会优先考虑使用cssSelector定位或xpath定位。
即
- 优先使用与开发约定的元素进行定位
- 有id,优先id。无id,则优先考虑name,className,tagName
- 超链接元素优先考虑linkText或者是partialLinkText
- 如果没有id,name,className,tagName时,或id,name,className,tagName属性是动态/不唯一的时候,使用xpath和cssSelector定位。
- 可使用xpath和cssSelector定位的时候,优先使用cssSelector。因为cssSelector定位的速度和效率比xpath高。
总结一句话就是:没有最好的定位方式,只有最精简的,怎么简单怎么来,满足自己的业务要求即可。
回到最开始的问题,Selenium如何处理动态元素呢?既然是动态元素,那么id,name,className,tagName就不太适用。需要优先考虑使用xpath或者cssSelector来定位元素。