购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 Selenium元素定位器

Selenium框架支持8种类型的元素定位器,分别是ID定位器、Name定位器、ClassName定位器、TagName定位器、LinkText定位器、PartialLinkText定位器、CSS Selector定位器和XPath定位器。这些元素定位器都依赖于Web元素自身的结构、属性以及该元素在DOM树中的位置。假设现在我们有一个网页元素a,它的具体信息如图2-1所示。

图2-1 Web元素示例

利用Selenium框架中的8种元素定位器对上述Web元素进行定位,具体操作如图2-2所示。

图2-2 Selenium元素定位器使用示例

接下来,将详细解析如何使用不同类型的Selenium元素定位器来定位该网页元素。

1.ID定位器

代码实现如下:

     WebElement element = driver.findElement(By.id("download"));

ID定位器是效率最高的元素定位器,它依赖HTML网页元素的id属性来定位网页元素。由于id属性在HTML网页元素中具有唯一性,因此这种类型的定位器效率最高,也是最安全。

2.Name定位器

代码实现如下:

     WebElement element = driver.findElement(By.name("download"));

Name定位器根据网页元素的name属性来查找和定位元素。因为name属性并不像id属性那样具有唯一性,所以当网页中有多个name属性值为download的元素时,上述代码会返回第一个找到的元素。

3.ClassName定位器

代码实现如下:

     WebElement element = driver.findElement(By.className("download-link"));

ClassName定位器根据网页元素的class属性值来定位网页元素,与name属性一样,class属性值也不是唯一的。因此,当网页中有多个class属性值为download-link的元素时,上述代码会返回第一个找到的元素。

使用ClassName定位器时,需特别注意By.className方法中使用的class属性值不能包含空格,因为该方法期望传递的class属性值是单一属性值。如果传递的class属性值包含多个属性值,那么ClassName定位器将无法正确识别该元素。

4.TagName定位器

代码实现如下:

     WebElement element = driver.findElement(By.tagName("a"));

TagName定位器根据网页元素的标签名称来定位网页元素。

5.LinkText定位器

代码实现如下:

     WebElement element = driver.findElement(By.linkText("Download"));

LinkText定位器只能用于定位超链接元素,即<a>标签元素。

6.partialLinkText定位器

代码实现如下:

     WebElement element = driver.findElement(By.partialLinkText("Down"));

partialLinkText定位器通过链接文本的部分内容来定位超链接元素。当超链接的文本较长或包含动态部分时,partialLinkText定位器可以帮助定位到符合部分文本条件的链接元素。

7.CSS Selector定位器

代码实现如下:

     WebElement element = driver.findElement(By.cssSelector("a#download"));
     WebElement element = driver.findElement(By.cssSelector(".download-link"));
     WebElement element = driver.findElement(By.cssSelector("a[name='download'] "));

CSS Selector定位器基于CSS规则来查找和定位网页元素,因此理解和掌握CSS规则是灵活使用CSS Selector定位器的关键。

8.XPath定位器

代码实现如下:

     WebElement element = driver.findElement(By.cssSelector("//*[@id='download'] "));

XPath元素定位器主要根据XPath表达式来定位网页元素。XPath表达式主要有两种形式,分别是Absolute XPath和Relative XPath。

Absolute XPath需要详细给出从HTML根节点元素开始到目标定位元素的完整路径。例如:/html/body/div[1]/div/div[3]/table/tbody/tr/td[3]/ul/div/div/ul/li/a。Absolute XPath在面对网页结构变化时表现得不够灵活。任何网页结构上的变更都可能导致Absolute XPath表达式失效。

Relative XPath则以双斜杠(//)开始,表示可以从文档中的任何位置开始搜索,而不必从根节点开始。例如://*[@id="app"]/ul/li/div/div/h3/a。相对于Absolute XPath, Relative XPath表达式更加简短,也更加灵活。因为它不依赖元素的完整路径来进行定位,所以它对网页结构变化具有更好的适应性。

灵活、准确地应用各种元素定位器需要读者在平时多加练习。以下是一些利用Selenium定位器进行Web元素定位操作时的注意事项。

(1)在Selenium的8种元素定位器中,只有ID元素定位器可以明确地定位到唯一一个元素。其他元素定位器则有可能定位到多个元素,如果有多个元素满足要求,Selenium的findElement方法会返回第一个匹配到的元素。

(2)从性能上来看,定位器的效率排序为:ID定位器>属性定位器> CSS Selector定位器>XPath定位器。

(3)XPath表达式分为绝对路径表达式和相对路径表达式两种形式。绝对路径表达式从HTML根节点开始对元素进行查找和定位,以“/”作为表达式的开头,例如/html/body/…/a[@id="download"]。相对路径表达式从任意位置开始查找元素,以“//”作为开头,例如//a[@id="download"]。 3ht+Rclb774JWpFQ9IlaIW0iUbj8SJ+BZu0h6b4nD5LGf+E+86jR796ETByHZ996

点击中间区域
呼出菜单
上一章
目录
下一章
×