多个元素定位实战—Python自动化测试实战(2)

发表于:2019-6-13 13:26

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:无涯    来源:51Testing软件测试网原创

  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()  
  2.3.4  By 类的分析 
  如果在定位元素属性中包含了如 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 等。 

查看《Python自动化测试实战》全部连载内容>>
版权声明:51Testing软件测试网获得电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号