两个或更多的HTML页面组成了一个网络应用程序。网络元素指的是构成网页的所有组成单元/字段,如文本框、按钮等。
静态元素是数据对象模型(DOM)上的所有元素,它们在任何HTML页面上都会被浏览器呈现出来。动态元素是指在运行时被调用并动态添加到页面上的网页元素。
在Web应用程序的自动化测试中,最关键的阶段之一是定位Web元素(UI)。
Selenium中的一些元素选择器:
- ID
- 名称
- 类名
- 链接文本
- 部分链接文本
- 标签名称
- XPath
- 和CSS选择器
一个Web元素的ID、Name或Class Name是寻找它的最方便的方法。我们可以简单地在代码中输入相应的值,然后运行程序,看看是否有效。
为什么我们需要这许多选择器?
你可能会想,为什么我们需要拥有或学习不同的方法来定位网页中的一个元素。这很重要,因为每次我们需要从一个网页中获取数据时,我们都需要严格地查看该网页的HTML代码(DOM),以寻找独特或常见的选择器。此外,还有一些关于动态网站的问题,这些网站是动态加载的,AJAX网站等。
Selenium中的定位器类型
定位一个元素的不同方法
在HTML标签、属性和HTML文本的基础上,定位器被用来寻找网络元素。在Selenium WebDriver中,有八种不同类型的定位器:
- ID:每当在一个网站页面上寻找网络元素时,这个定位器会优先考虑。因为它的值对整个网页上的每个网页元素都是唯一的,所以使用这个定位器时,你不会收到重复的匹配。我们在HTML代码中利用id属性,只要它存在。
- 名称:这个位置在HTML代码中任何网页元素有名字属性的地方都会使用。
- className:只要HTML代码中有一个class属性,这个位置就会被使用,一般是为批量造型而定义的。
- tagName:这个位置只在一个网页元素有一个独特的HTML标签时使用。
- linkText:如果一个链接有一个独特的HTML文本与之相连,则使用这个定位器。
- 部分链接文本:我们利用这个定位器,当网页上有一个链接有一个很长的文本与之相连时,就使用链接的部分HTML文本。
- cssSelector:cssSelector是一个明显比XPath更快的定位器,而且使用范围更广。它比其他定位器更复杂,但它是最有效的,因为即使缺少特定的html元素,我们也可以用它来识别网页元素。
- XPath:这是一个使用标签、属性和文本来寻找网络元素的定位器。X路径可用于HTML和XML文本。绝对XPath和相对XPath是XPath的两种形式。
- 绝对 XPath - 如同从根元素到所需的子节点,这种XPath定位网络元素。绝对XPath不应该在实时自动化程序中使用。
- 相对 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页面中选择项目的不同技术。希望你已经很好地学习了关于在网页中定位元素的知识,并准备好自己实现它们。