2.3.3 多个元素定位实战
在工作中,某些时候可能会发现元素的 ID、NAME、CLASS_NAME 等元素属性是一致的,这时,使用 ID、NAME、CLASS_NAME 等这些元素属性定位时就无法准确地定位到具体的元素。例如,在百度首页中,以 TAG_NAME 元素属性来定位百度搜索输入框,在代码中发现不仅仅在百度搜索输入框有 input 标签,在百度搜索输入框之前也有 input 标签,这时该如何定位呢?这时可以使用多个元素定位的方式。当定位到多个元素后,结果将以列表形式呈现,然后可以按照
列表的索引来定位到具体的元素位置。下面以 ID、TAG_NAME 为例进行讲解。
1. find_elements_by_tag_name
以百度搜索输入框为例,使用 TAG_NAME 的方式来实现定位,它的 TAG_ NAME 是 input,首先来获取百度首页的 input 标签,并且查看它的类型,代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- from selenium import webdriver driver=webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(30) driver.get('http://www.baidu.com') tag_names=driver.find_elements_by_tag_name('input') for tag_name in tag_names: print tag_name print type(tag_names) driver.quit() |
运行以上代码后输出的结果为:
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="fb4b2fa1-fa15- 408a-9c4d-4b6572804814")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="d92c3809-47de- 4472-b304-e87c04c247c7")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="2f2258f6-ad9d- 482b-952c-d98401eb5251")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="6824d195-3958- 48f3-942b-420451db1fe7")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="6977ddef-82f0- 4c90-8329-eb890c6bb5b0")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="906703ad-6e42- 4ad0-aaed-719f186df244")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="9c421db8-7e48- 44f1-9ee0-2efc6b7f8bee")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="6dc549fa-a1e7- 4811-8365-dc7561f8cd8e")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="5c5dd91b-b4d4- 4a70-bf98-aaa01a1e55dd")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="d0550033-09e4- 4073-878a-3e244424324c")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="c05b5f40-3277- 492c-8e13-db5d711e5e29")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="29c8e081-eda1- 4f10-b395-1f2e4a37aa56")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="2d0ffa2c-8351- 46b1-aa4b-17a577b33326")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="5e9983da-2f3a- 4160-a23e-8e7528927320")> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="54cf7b2e-376d-489a-94d0-264fda35b081", element="a6189485-abf4- 4b77-b4e3-3818cd68a7db")> <type 'list'> |
注解:从以上代码和输出结果中,可以看到,input 的数据类型是 list,那么百度首页搜索输入框是在 input 标签中的第 8 位,也就是对应的索引是 7(索引是从 0 开始),如图 2-3-6 所示。
图 2-3-6
下面使用多个元素定位的方式,实现在百度搜索输入框中输入搜索关键字"selenium"。实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- from selenium import webdriver driver=webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(30) driver.get('http://www.baidu.com') driver.find_elements_by_tag_name('input')[7].send_keys('Selenium') driver.quit() |
2. find_elements_by_id
多个元素的定位思路都是一样的。下面通过一个具体的登录实例来看在 ID一致的情况下,使用多个元素定位的解决方案。HTML 的代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="success.html" method="post"> <center> <p>用户名:<input type="text" id="login" name="username"></p> <p>密 码:<input type="text" id="login" name="passsord"></p> <p><input type="submit" id="login" value="登录"></p> </center> </form> </body> </html> |
在以上代码中可以看到用户名输入框、密码输入框,以及"登录"按钮的 ID 一致,现在希望通过脚本输入用户名和密码,点击"登录"按钮,跳转到success.html 的页面,并且使用 ID 来定位,实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- from selenium import webdriver driver=webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(30) #index.html的地址依据自己本地实际地址 driver.get('file:///D:/git/github/book/testCase/index.html') ids=driver.find_elements_by_id('login') #输入用户名 ids[0].send_keys('wuya') #输入密码 ids[1].send_keys('admin') #点击"登录"按钮 ids[2].click() driver.quit() |
如果在定位元素属性中包含了如 ID 等元素属性,那么在一个测试中,元素定位具体有哪几种方式,可以在 by 模块中的 By 类中看到。By 类的代码如下:
class By(object): """ Set of supported locator strategies. """ ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" |
注解:在 By 类中,类属性实际就是元素定位的方式,经常使用的有 ID、NAME 等。
版权声明:51Testing软件测试网获得电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。