UI自动化的测试,一般在启动对应的设备(Browser或者Phone)之后,首先要对需要操作的对象(元素)进行定位,之后才能操作该对象。因此对象的定位应该是自动化测试的核心。
对于WebDriver提供了一系列的定位方法:
1. id
2. name
3. class name
4. xpath
5. css selector
6. link text
7. tag name
8. partial link text
关于选择元素的定位,首先要选择优先使用id、name、link text的方法;对于使用xpath、css的定位方法在用FirePath得到value之后,最好在简化之后在使用,这样可以减少在UI变化之后脚本的维护成本。
本次以mails.163.com, 定位邮箱输入框为例,通过Firefox的工具(之前提到过的Firebug、FirePath、FireFinder),可以得到以下信息:
# coding:utf-8
from selenium import webdriver
# 打开163邮箱登录
driver = webdriver.Firefox()
driver.get("http://mail.163.com/")
'''**********定位到邮箱账户输入框**********'''
# 通过id定位
# driver.find_element_by_id("auto-id-1489733733579")
#通过name定位
driver.find_element_by_name("email")
# 通过class name定位
driver.find_element_by_class_name("j-inputtext dlemail")
# 通过xpath定位
driver.find_element_by_xpath(".//input[@data-type='email']")
driver.find_element_by_xpath(".//input[@name='email']")
# 通过css定位
driver.find_elements_by_css_selector("#auto-id-1489733733579")
driver.find_elements_by_css_selector(".j-inputtext.dlemail")
# 通过tag name的方位定位
driver.find_element_by_tag_name("input")
'''**********定位到“忘记密码”按钮*********'''
# <a id="auto-id-1491965780747" class="forgetpwd j-redirect" target="_blank" href="//reg.163.com/resetpwd/index.do" data-outlink="1">忘记密码?</a>
# 通过link text定位
driver.find_element_by_link_text("忘记密码?")
# 通过partial link text定位
driver.find_element_by_partial_link_text("忘记")
# 关闭Firefox
driver.close()
driver.quit()
下面对不同的方法做一下详解:
1. ID和name定位
<input id="auto-id-1489733733579" class="j-inputtext dlemail" type="text" spellcheck="false" tabindex="1" autocomplete="off" data-required="true" data-type="email" name="email" data-placeholder="邮箱帐号或手机号" placeholder="邮箱帐号或手机号" style="width: 125px;"/>
id和name一般是最常用和推荐使用的定位的方法,因为程序员对这两个属性进行命名的时候一般都是唯一、具有意义的,而且这两个属性对UI的位置变化也不会受到影响。
但是也会有特殊的情况:在使用id对邮箱账户输入框定位的时候,可以发现该输入框的id是自动变化的,所以通过id定位的方式是不可行的(所以将通过id定位的方法注释掉)
2. class name定位
class name对应的是class属性
3. tag name定位
HTML中元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码。HTML标签代表的内容可以参考:HTML 参考手册;在定位中常用的有:
<button> 定义按钮
<input> 定义输入控件
<select> 定义选择列表
<title> 定义文档的标题。
<option>定义选择列表中的选项
<a> 定义HTML中的链接
<img> 定义HTML中的图片
<p> 定义了HTML文档中的一个段落
<table> 定义HTML表格
4. link text和partial link text定位
<a id="auto-id-1491965780747" class="forgetpwd j-redirect" target="_blank" href="//reg.163.com/resetpwd/index.do" data-outlink="1">忘记密码?</a>
这两个使用在定位文字连接,如 “忘记密码?”按钮:是一个<a>
标签定义的连接,因此我们可以通过link text的进行定位。而且一般一个页面上不会出现不同功能而同名的文字连接,因此这也是一种比较优先的定位方式。partial link text与link text相比,前者可以通过部分文字进行定位。
另外:HTML中<a>
标签定义超链接,用于从一张页面链接到另一张页面,而<a>
元素最重要的属性是 href 属性,它指示链接的目标; 所有一般可以使用这两个方法进行定位的都是具有href属性或者父元素中含有href属性的<a>
标签元素
PS: 1. 关于xpath和css selector的定位方式,两者相对比较灵活,同一个元素可以由不同的写法。
2. 每一种定位方式都提供的find_element_by_xx和find_elements_by_xx两种方法,只管上就可以看出后者可以匹配到多个元素。