常见控件定位方法
同学们大家好,欢迎来到今天的学习!在这节课中,我们将深入探讨Web自动化测试中常见的控件定位方法。
简介
在 Web 自动化测试中,定位是指在进行测试过程中定位网页上的元素位置,例如按钮、文本框、下拉菜单等,以便进行后续操作。定位是自动化测试中至关重要的步骤,它使测试工具能够准确找到并于页面上的元素进行交互,从而模拟用户的实际行为。通过有效的定位,测试脚本能够对页面元素执行各种操作,验证用户的行为并确保其功能的正确性。
首先我们来了解一下什么是定位,在 Web 自动化测试中,定位其实就是在测试过程中找出网页上各种元素的位置,比如按钮、文本框、下拉菜单等,这样我们就能对这些元素进行后续操作,定位是自动化测试中非常关键的步骤,它帮助测试工具准确找到并与页面上的元素进行交互,从而模拟用户的真实操作,想象一下,如果我们不能准确找到页面上的元素,测试脚本就没法正常工作,而通过有效的定位,脚本不仅能够执行对这些元素的点击、输入等操作,还能验证用户的行为是不是符合预期,确保功能的正确性。所以说,掌握好定位方法,是进行自动化测试的基础,也是确保测试顺利进行的关键。
为什么要学习定位
- 与页面元素交互:在自动化测试中,测试脚本需要与页面上的元素进行交互,如点击按钮、输入文本等。
- 验证应用程序行为:自动化测试的主要目的之一是验证应用程序的行为是否符合预期,定位方式的准确性直接影响测试脚本对页面元素的操作。
- 提高测试效率:Web 页面的结构可能会随时更改,例如元素的 ID、Class Name 等可能会变化。掌握不同的定位方式可以在元素属性变化时,灵活地修改测试脚本而不影响稳定性。
- 提高测试脚本的可维护性:如果只依赖一种定位方式,当页面结构发生变化时,测试脚本可能会失效。多掌握定位方式可以根据情况选择最合适的定位方式,提高脚本的可维护性。
那么我们为什么要学习定位呢?首先来说,定位是自动化测试中与页面元素交互的基础,比如点击按钮、输入文本、选择下拉框等操作都依赖于准确的定位,测试脚本需要通过定位找到并与这些元素进行交互,才能模拟真实用户的操作,接下来,定位还帮助我们验证应用程序的行为,自动化测试的一个主要目标就是验证应用是否按预期工作,而定位方式的准确性直接影响测试脚本是否能够正确操作页面元素,从而验证应用的行为是否符合预期,除此之外,随着Web页面的更新,元素的 ID、Class Name 等可能会发生变化,这时候,掌握多种定位方式就能帮助我们灵活调整脚本,避免因为元素属性的变化而影响测试的稳定性,最后,如果我们只依赖一种定位方式,当页面结构变化时,脚本可能会崩溃或者失效,而掌握多种定位方法,让我们能够根据具体情况选择最合适的方式,这样就能大大提高测试脚本的可维护性。
Selenium 八大定位方式
定位方式 | 描述 |
---|---|
class name | class 属性对应的值 |
css selector(重点) | css 表达式 |
id(重点) | id 属性对应的值 |
name(重点) | name 属性对应的值 |
link test | 查找其可见文本与搜索值匹配的锚元素 |
partial link test | 查找其可见文本包含搜索值的锚元素。如果多个元素匹配,则只会选择第一个元素 |
tag name | 标签名称 |
xpath(重点) | xpath 表达式 |
Selenium 提供了八种常用的定位方式,第一个是class name,class name 是通过元素的 class 属性值来定位,简单直接,但有时会有多个元素使用相同的 class,所以需要谨慎使用。接下来第二个是 css selector,它使用 CSS 表达式来定位元素,功能强大,支持更加灵活的选择器,所以我们会重点讲解这一种。第三个是id,id 是通过元素的 id 属性来定位,通常是页面中最独特的标识符,因此也是非常高效且常用的定位方式。第四个是name,name 是通过元素的 name 属性值来定位,它与 id 类似,尤其是在表单元素中非常常见。接下来的是第五个的link text和第六个的partial link text,link text 是通过锚元素的可见文本来查找,这种方法适用于链接文本已知的情况,partial link text 则是查找可见文本包含指定值的锚元素,如果有多个元素匹配,它只会选择第一个,这对于处理动态或变化的文本特别有用。第七个是tag name,tag name 是根据元素的标签名称来定位,虽然不常用,但在某些情况下对定位表单或列表元素很有效,最后也是和css同样常用的一个,xpath,xpath 通过 XPath 表达式来定位元素,它功能非常强大,支持复杂的查询条件,我们将重点讲解这部分内容。
创建定位器
要使用 Selenium 在网页上操作网页元素,需要找到它们在网页上的位置。Selenium 提供了上述提到的方式,通过这些方式可以在页面上定位元素。为了理解和创建定位器,我们将使用以下 HTML 代码片段。
<html>
<body>
<style>
.information {
background-color: white;
color: black;
padding: 10px;
}
</style>
<h2>Contact Selenium</h2>
<form action="/action_page.php">
<input type="radio" name="gender" value="m" />Male
<input type="radio" name="gender" value="f" />Female <br />
<br />
<label for="fname">First name:</label><br />
<input
class="information"
type="text"
id="fname"
name="fname"
value="Jane"
/><br /><br />
<label for="lname">Last name:</label><br />
<input
class="information"
type="text"
id="lname"
name="lname"
value="Doe"
/><br /><br />
<label for="newsletter">Newsletter:</label>
<input type="checkbox" name="newsletter" value="1" /><br /><br />
<input type="submit" value="Submit" />
</form>
<p>
To know more about Selenium, visit the official page
<a href="www.selenium.dev">Selenium Official Page</a>
</p>
</body>
</html>
在使用 Selenium 进行自动化测试时,我们需要找到网页元素的位置,然后通过定位器来操作它们。为了帮助大家理解如何创建定位器,我们来看一个简单的 HTML 示例。在这个页面中,我们有一个表单,包含了单选框、文本框、复选框和一个提交按钮等元素。我们将通过之前提到的定位方式来找出这些元素的位置。比如,我们可以通过 id 来定位文本框,像 id=f-name 和 id=l-name,这两个文本框就是通过它们的 id 属性来定位的。我们还可以使用 name 属性来定位,比如单选框和复选框的 name 属性分别是 gender 和 newsletter,通过这些属性值,我们可以精准定位到相应的元素。另外,像 a 标签这种链接,我们可以通过 link text 来定位,直接使用可见的文本Selenium Official Page。这个简单的 HTML 页面展示了如何使用不同的定位方式,接下来,我们将根据这些元素来实际操作,并展示如何使用 Selenium 编写脚本来与这些元素交互。
元素定位
# python 代码
driver.find_element(By.CLASS_NAME, "information")
// java 代码
driver.findElement(By.className("information"));
在自动化过程中,元素定位如上两段python和java代码所示,当我们使用不同的定位器定位元素是,那么对应的属性也该改变,例如我么要使用class name去定位,这里的 by 点 class name 即可
ID
通过使用网页上元素的 ID 属性来定位它。通常情况下,元素的 ID 属性在网页上应该是唯一的。使用 id
来识别“姓氏(Last Name)”字段。
driver.find_element(By.ID, "information")
# java
driver.findElement(By.id("information"));
在 Selenium 中,使用 ID 定位是非常常见和高效的一种方式,特别是当页面元素有唯一的 id 属性时,id 是定位的首选方式。我们来看一下如何用 Python 和 Java 来实现 ID 定位。在 Python 中,我们使用 find_element 方法,并通过 By.ID 来指定定位方式,后面紧跟着要定位的元素的 id 值,比如driver 点 findElement ,括号,里面写上By点ID,以及元素 ID 值,比如 l-name。那么这行代码就可以定位到id为 l-name 的元素了,在Java中,语法稍有不同,但其实逻辑相同,都是通过元素 id 属性来精准定位元素。
class name
# python
driver.find_element(By.CLASS_NAME, "information")
# java
driver.findElement(By.className("information"));
接着是class name,class name 定位方式用于通过元素的 class 属性来识别页面上的元素。对于 HTML 页面中的元素,如果它们具有相同的 class 属性值,我们可以使用这个属性来定位相应的元素。比如在我们的示例中,如果我们想定位所有具有 class=information 的元素,我们就可以使用 class name 来定位。在 Python 中,我们使用 findElement 方法,搭配 By.CLASS_NAME 来指定定位方式,后面跟上要查找的 class 名称,比如 driver点 FindElement,括号,By点CLASS NAME,以及元素 class 值,比如information。这行代码会定位到 class 为 “information” 的元素。通过这种方式,我们能够定位页面中所有匹配的元素,适用于多元素的情况。
css selector
使用 css selector 来进行元素定位(通过比对元素的 id,class,tagname 以及其他属性来完成定位)
# python
driver.find_element(By.CSS_SELECTOR, "#fname")
# java
driver.findElement(By.cssSelector("#fname"));
接下来要讲的定位方式是cs-s selector,cs-s selector 是一种非常强大的定位方式,它通过比对元素的 id、class、tagname 以及其他属性来完成定位。这种方式的优势在于它支持复杂的选择器,可以非常灵活地根据不同的属性组合来定位元素。比如,假设我们要定位一个 id 为 f-name 的元素,我们可以使用 # 符号来表示 id,所以在 Python 中,我们写成 driver点 FindElement 括号 By 点 CS-S SELECTOR 逗号 # f-name括号,这样就能够定位到 id=f-name 的元素,通过这种方式,我们不仅能定位 id 属性,还可以通过 class 名称、标签名称,甚至其他属性来定位页面上的元素,这使得 cs-s selector 成为非常灵活和强大的定位工具。
name
通过使用网页上元素的 NAME 属性来定位。通常情况下,元素的 NAME 属性在网页上应该是唯一的。通过使用 name
来识别“新闻简讯(Newsletter)”复选框。
# python
driver.find_element(By.NAME, "newsletter")
# java
driver.findElement(By.name("newsletter"));
接着是 name 定位方式是通过网页元素的 name 属性来定位元素,通常情况下,元素的 name 属性应该是唯一的,尤其是在表单元素中,比如文本框、复选框、单选按钮等。当我们要定位“新闻简讯(Newsletter)”复选框时,就可以通过它的 name 属性来实现定位。我们使用 find_element 方法,搭配 By点NAME 来指定定位方式,后面跟上要查找的 name 属性值,例如 driver.find_element 括号 By 点 NAME newsletter,这样就能定位到 name="newsletter" 的复选框元素;而在 Java 中,语法也是类似的,通过这种方式,我们能够定位到具有特定 name 属性的元素,适用于表单中的输入元素,尤其是当 id 不唯一或者不可用时,name 属性就显得特别有用。
link text
通过链接来定位:(链接文本定位器:链接文本是链接显示的文本内容)
# python
driver.find_element(By.LINK_TEXT, "Selenium Official Page")
# java
driver.findElement(By.linkText("Selenium Official Page"));
下面是link text,在 selenium 中,link text 定位方式通过链接的文本来定位元素。也就是说,当页面上有一个可点击的链接,我们可以通过链接的可见文本来定位这个链接元素。例如,如果页面上有一个文本为 “Selenium Official Page” 的链接,我们就可以使用 link text 定位方法来找到这个链接。在 Python 中,我们使用 find_element 方法,搭配 By点LINK_TEXT 来指定定位方式,后面跟上链接的文本内容,比如 driver 点 find_element 括号 By 点 LINK_TEXT 加文本Selenium Official Page,这行代码就会找到这个文本匹配的链接元素,而在 Java 中,语法相同,通过这种方式,我们能够精准地定位到页面上可点击的链接,前提是该链接的文本内容是唯一且可见的。
partial link test
通过部分链接文本来定位:(链接文本定位器:链接文本是链接显示的文本内容)
# python
driver.find_element(By.PARTIAL_LINK_TEXT, "Official Page")
# java
driver.findElement(By.partialLinkText("Official Page"));
在 Selenium 中,partial link text 定位方式允许我们通过部分链接文本来定位元素。这意味着如果链接的文本内容比较长,或者我们只记得部分文本,也可以通过部分文本来进行定位。比如,假设页面上有一个完整的链接文本为 “Selenium Official Page”,而我们只记得其中的一部分,比如 “Official Page”,我们也可以通过 partial link text 来定位这个链接。在 Python 中,我们使用 find_element 方法,搭配 By 点 PARTIAL_LINK_TEXT 来指定定位方式,后面跟上部分链接文本,例如 driver 点 find_element 口号 By 点 PARTIAL_LINK_TEXT, 加上部分文本内容 比如 Official Page ,这行代码会找到包含 “Official Page” 这个部分文本的链接元素;在 Java 中,语法也类似,那么通过这种方式,我们能够定位到页面中所有包含指定部分文本的链接元素,这对于动态变化的链接文本特别有用。
tag name
可以使用 HTML 标签本身作为定位器,在页面上识别网页元素。通过使用 tag name
, HTML 标签“a”来识别链接。
# python
driver.find_element(By.TAG_NAME, "a")
# java
driver.findElement(By.tagName("a"));
在 Selenium 中,tag name 定位方式是通过 HTML 标签本身来定位页面上的元素,这意味着我们可以直接使用元素的标签名称来识别它们。比如,当我们想要定位页面上的所有链接时,可以通过 a 标签来实现定位,因为在 HTML 中,所有的链接都是通过 尖括号a 标签来定义的。那么在 Python 中呢,我们就可以使用 find_element 方法,搭配 By 点 tag name 来指定定位方式,后面跟上要定位的标签名,比如 driver 点 find_element 方法 括号 By 点 tag name, a标签,这行代码会找到页面中第一个 a 标签元素,而在 Java 中,语法类似。通过这种方式,我们就能够定位页面上所有的 a 标签元素,适用于当我们需要处理某种特定标签时,尤其是在页面结构简单,标签唯一的情况下非常有效。
xpath
一个 HTML 文档可以被视为一个 XML 文档,可以通过使用 XPath 来定位感兴趣的元素,它是到达目标元素的路径。
# python
driver.find_element(By.XPATH, "//input[@value='f']")
# java
driver.findElement(By.xpath("//input[@value='f']"));
接着是我们可能在以后工作中最常用的定位方式 Xpath,在 Selenium 中,xpath 是一种非常强大和灵活的定位方式,因为它允许我们根据元素的路径来定位页面上的元素,XPath 可以视作到达目标元素的路径,它适用于非常复杂的 HTML 结构。一个 HTML 文档实际上是一个树形结构,我们可以通过 XPath 表达式来精确地查找目标元素。例如,如果我们使用 斜杠 html 斜杠 form 斜杠input方括号1,它将返回第一个 input 元素,通常是男性单选按钮。另一方面,杠杠 input 方括号 @name = f-name 是一个相对 XPath,它将返回 name 属性为 “f-name” 的文本框。在实际应用中,XPath 提供了很多强大的功能,允许我们通过属性、标签、文本内容等多种方式来定位元素。比如,如果我们要定位女性单选按钮,可以使用类似于 杠杠 input 方括号 @value='f' 的 XPath 表达式。在 Python 中,我们使用 find_element 方法,搭配 By 点 XPATH 来指定定位方式,后面跟上要查找的 XPath 表达式,像 driver 点 find_element 括号 By 点 XPATH, 杠杠input 方括号 @value='f'",这行代码会定位到 value="f" 的输入框元素;在 Java 中,语法是类似的。通过这种方式,我们可以灵活地定位页面上的任何元素,尤其在页面结构复杂或者元素没有明确的 id 或 class 时,XPath 是一个非常有用的工具。
总结
- id
- class name
- css selector
- name
- link text
- partial link text
- tag name
- xpath
在这一章节中,我们学习了 Selenium 中的八种常见定位方式,每种方式都有其独特的优势和适用场景。通过掌握这些定位方式,我们能够更灵活地与网页上的各种元素进行交互,从而提高自动化测试的效率和稳定性。无论是简单的 id 和 class 定位,还是复杂的 xpath 和 css selector 定位,理解和应用这些定位技巧都能让我们在面对不同的页面结构时游刃有余。在实际操作中,我们还需要根据元素的唯一性、稳定性以及页面的动态变化来选择最合适的定位方式。掌握了这些基本的定位方法后,我们将能够更高效地编写自动化测试脚本,确保测试的准确性和可维护性,那么大家课后要多加练习,早日熟练使用定位方式,为web自动化打下扎实基础。