使用Selenium定位元素的不同方法 - Python

491 阅读6分钟

两个或更多的HTML页面组成了一个网络应用程序。网络元素指的是构成网页的所有组成单元/字段,如文本框、按钮等。

静态元素是数据对象模型(DOM)上的所有元素,它们在任何HTML页面上都会被浏览器呈现出来。动态元素是指在运行时被调用并动态添加到页面上的网页元素。

在Web应用程序的自动化测试中,最关键的阶段之一是定位Web元素(UI)。

Selenium中的一些元素选择器:

  • ID
  • 名称
  • 类名
  • 链接文本
  • 部分链接文本
  • 标签名称
  • XPath
  • 和CSS选择器

一个Web元素的ID、Name或Class Name是寻找它的最方便的方法。我们可以简单地在代码中输入相应的值,然后运行程序,看看是否有效。

为什么我们需要这许多选择器?

你可能会想,为什么我们需要拥有或学习不同的方法来定位网页中的一个元素。这很重要,因为每次我们需要从一个网页中获取数据时,我们都需要严格地查看该网页的HTML代码(DOM),以寻找独特或常见的选择器。此外,还有一些关于动态网站的问题,这些网站是动态加载的,AJAX网站等。

Selenium中的定位器类型

定位一个元素的不同方法

在HTML标签、属性和HTML文本的基础上,定位器被用来寻找网络元素。在Selenium WebDriver中,有八种不同类型的定位器:

  1. ID:每当在一个网站页面上寻找网络元素时,这个定位器会优先考虑。因为它的值对整个网页上的每个网页元素都是唯一的,所以使用这个定位器时,你不会收到重复的匹配。我们在HTML代码中利用id属性,只要它存在。
  2. 名称:这个位置在HTML代码中任何网页元素有名字属性的地方都会使用。
  3. className:只要HTML代码中有一个class属性,这个位置就会被使用,一般是为批量造型而定义的。
  4. tagName:这个位置只在一个网页元素有一个独特的HTML标签时使用。
  5. linkText:如果一个链接有一个独特的HTML文本与之相连,则使用这个定位器。
  6. 部分链接文本:我们利用这个定位器,当网页上有一个链接有一个很长的文本与之相连时,就使用链接的部分HTML文本。
  7. cssSelector:cssSelector是一个明显比XPath更快的定位器,而且使用范围更广。它比其他定位器更复杂,但它是最有效的,因为即使缺少特定的html元素,我们也可以用它来识别网页元素。
  8. XPath:这是一个使用标签、属性和文本来寻找网络元素的定位器。X路径可用于HTML和XML文本。绝对XPath和相对XPath是XPath的两种形式。
  9. 绝对 XPath - 如同从根元素到所需的子节点,这种XPath定位网络元素。绝对XPath不应该在实时自动化程序中使用。
  10. 相对 XPath - 这是一个修改过的XPath,使用标签、属性或文本来发现项目。

现在,我们已经讨论了使用Selenium在网页中定位一个元素的所有不同方法。现在我们讨论一下Python Selenium中最重要和最广泛使用的选择器,以便于选择和归属。

1.通过CSS ID在Selenium中定位元素

这是迄今为止发现一个元素的最直接的方法。CSS ID被保存在HTML DOM元素的id属性中,它被设计成对网页上的每个元素都是唯一的。因此,一个ID可以用来唯一地识别一个元素。

要访问这个功能,你必须使用webdriver类的find_element_by_id()方法。下面是如何使用它的方法。

from selenium import webdriver
driver = webdriver.Chrome('./chromedriver.exe')
driver.get("https://www.python.org")
search_bar = driver.find_element_by_id("id-search-field")

如果没有具有被搜索的ID的DOM元素,就会抛出一个 "没有这样的元素"的异常,这可以通过使用一个try-catch块来有效处理。

理论上,一个页面上的每个DOM元素都应该有自己的ID。然而,这并不是在现实生活中经常观察到的事情。有可能大多数项目都没有ID,或者你会遇到两个具有相同ID的元素。在这种情况下,必须使用一种单独的技术来唯一地识别一个DOM元素。

2.通过CSS类名在Selenium中找到元素

寻找页面上的组件的另一种方法是使用类名作为搜索词。类名被保存在HTML标签的类属性中。一个CSS类旨在适用于一组DOM组件。find_element_by_class_name()函数只返回具有匹配类的第一个元素。

如果没有具有提供的类名的元素,它会抛出一个NoSuchElementException。下面是一个如何在驱动中利用该方法的例子。

 from selenium import webdriver
driver = webdriver.Chrome('./chromedriver')
driver.get("https://www.python.org")

first_search_bar = driver.find_element_by_class_name("class-name")

需要注意的是:上面的代码只返回 具有匹配类的第一个元素 。对于所有具有相同匹配类的元素(批量选择),你需要使用一个循环反复 运行查找元素方法,并在每次迭代时将信息存储在这个while中。

3.在Selenium中通过XPath定位元素

如果一个元素的ID、类或名称不能识别它,必须使用元素的XML路径来定位它。

这种方法也可以在阅读XML文档时使用。在这篇文章中,我们将看看如何利用相对路径而不是绝对路径,因为绝对路径在网页的HTML结构(DOM)改变时容易出错。

为了在文档中发现一个合适的元素,我们将利用 find_element_by_xpath() 函数。元素的路径被作为参数传递给find_element_by_xpath()函数。

下面的代码可以用来定位HTML表单中的电子邮件输入框。

email_input = driver.find_element_by_xpath("//form[input/@name='email']")

这段代码寻找页面的初始表单元素。这个表单寻找一个带有名称email和值email的条目,把它限制在所需的元素上。

让我们试着发现表单的名和姓的输入元素。

first_name = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")

last_name = driver.find_element_by_xpath("//form[@id='loginForm']/input[2]")

它寻找一个具有ID登录表单的表单,然后挑选该表单的第一和第二输入元素作为名字和姓氏,如果合适的话。

4.在Python中定位单个HTML元素 Selenium - Misc

在Selenium WebDriver中还有一些元素定位器,除了我们到目前为止提到的常用方法之外,测试人员可能还想研究一下。

使用find_element_by_tag_name()函数,可以通过 HTML标签名称来查找元素。

page_heading = driver.find_element_by_tag_name('h1')

也可以通过在链接文本中搜索一个超链接元素 来找到它。可以使用find_element_by_link_text()函数来搜索特定的链接文本,或者使用find_element_by_partial_link_text()方法来搜索部分链接文本。

对于一个精确的链接文本 -

click_here_link = driver.find_element_by_link_text('Click Here')

部分链接文本 -

click_here_link = driver.find_element_by_partial_link_text('Click')

结论

至此,我们对Selenium中使用Python编程语言的定位器这一课有了结论。我们讨论了一些在HTML页面中选择项目的不同技术。希望你已经很好地学习了关于在网页中定位元素的知识,并准备好自己实现它们。