建议selenium webdriver中元素定位器的层次结构

时间:2014-12-08 09:31:11

标签: java eclipse selenium-webdriver

虽然我知道如何在Selenium Webdriver中搜索页面上的不同元素以进行测试,例如通过xpath,id,css等,我是在考虑使用哪种层次结构以及为什么?例如。我们应该在恢复搜索id之前使用xpath定位器吗?

了解这一点将使我能够以正确的方式构建我的测试,以便它们尽可能快地运行。

4 个答案:

答案 0 :(得分:7)

根据我对硒的经验,我认为以下是最好的等级:

  1. 编号

  2. 名称

  3. 链接文字

  4. 部分Linktext

  5. 标记名称

  6. 班级名称

  7. 的CSS

  8. 的xpath

  9. 1 - 按ID ,每个元素始终是唯一的,因此我们可以轻松访问并快速访问Web驱动程序。我们应该首选Id作为查找元素的第一优先级。

    2 - 如果按ID 不正常,那么我们应该查看"姓名"。但是很多时候会发生多个名称,如果同名属性多次出现,则需要注意这个。

    3 - "通过linktext" &安培; "如果站点中的所有链接都有唯一的链接文本,部分链接文字" 也是查找元素的好方法。

    4 - 如果您的网站或网页包含下拉列表组合元素,则可以使用属性" 按标记名" 查找元素。

    5 - 通过"类名" 是查找元素的罕见方式,因为大多数网站使用相同的类名来为多个项应用css。但是你肯定可以将它用于唯一的类名。

    6 - 如果您需要速度来定位复杂元素,请使用属性" Css选择器" 来查找元素。

    7 - 主要使用" Xpath" 属性来导航xml文档。您仍然可以将它用于网页或网站。

    注意:基本上选择元素定位器取决于您的页面包含哪些类型的页面包含太多的下拉列表,复选框,文本框等等。但是我给出的步骤是一般性的,您可以遵循任何网站查找元素并顺利执行程序。

    希望以上对你有所帮助。

    其他参考link

答案 1 :(得分:2)

实际上它是主观的。

在大多数网络应用中,必须将ID和名称作为首选。

<强> ID

我见过使用EXT-JS的网络应用程序,可以在运行时动态分配ID。在这里,使用ID不会。

<强> CSS

在Safari上出现使用FF和IE的CSS失败的情况。

了解AUT然后选择最好的是非常必要的。对于标准Web应用程序,层次结构可以是

1)ID

2)姓名

3)TagName

4)ClassName

5)CSS

6)XPath

7)LinkTtext / PartialLinkTest

答案 2 :(得分:0)

更有效的XPath可能是

By.xpath("//div[@class='1']//div[@class='4']")

在此,假设Class 2的Div在class 2子元素中是唯一的。 另外,您应避免使用。在元素的开头使遍历更快

答案 3 :(得分:-2)

假设这是层次结构:

<div class="1">............  (suppose it's div 1 open)
  <div class="2">........    (div 2 open)
     <div class="3">.......  (div 3 open)
     </div>.....             (div 3 closed)  
     <div class="4">......   (div 4 open)  
     </div>.....             (div 4 closed)
   </div>.........           (div 2 closed)
</div>.........              (div 1 closed)

现在,我们想要访问div 4

注意:div 3和div 4属于同一级别,这两个是div 2的子级,其父级为div 1

我们想要访问第4类

我们使用xpath做它但是div 4的类不是唯一的而且类1是,所以你可以这样遍历它:

By.xpath(".//div[@class='1']/div/div[2]")

解释:div [2]意味着它将访问类1,它具有类3的div,其子类有两个div类class 3和class 4但我想访问第二个div有4级,所以div [2]。

<强> cssSelector

有时我们无法访问路径,因此我们可以使用css选择器访问它,假设我们有一个这样的场景

<div class="1">
    <rect class="2">
         <text class="3">
         </text>
    </rect>
</div>

访问文本类

我们将By.cssSelector用作:

By.cssSelector("text[class='3']");