Selenium面试题:如何处理动态元素

前言

这些是过去学习和工作中积累的个人总结,不过可能会存在一些主观臆断,如果有说错的地方,请指出来哦!

回答

首先,我们需要了解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来定位元素。