Selenium - 元素定位

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的定位方式,两者相对比较灵活,同一个元素可以由不同的写法。大家也可以参考一下这两个连接去熟悉一下:xpathcss selector
2. 每一种定位方式都提供的find_element_by_xx和find_elements_by_xx两种方法,只管上就可以看出后者可以匹配到多个元素。

XPath是一种XML文档的定位方法,也可以用于HTML文档的定位Selenium中也可以使用XPath来定位网页元素。下面是使用XPath定位元素的详细步骤: 1. 打开浏览器并访问网页: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.example.com") ``` 2. 使用XPath定位元素: ```python # 通过元素id定位 element = driver.find_element_by_xpath('//*[@id="element_id"]') # 通过元素name定位 element = driver.find_element_by_xpath('//*[@name="element_name"]') # 通过元素class定位 element = driver.find_element_by_xpath('//*[@class="element_class"]') # 通过元素标签名定位 element = driver.find_element_by_xpath('//tag_name') # 通过元素属性定位 element = driver.find_element_by_xpath('//*[@attribute_name="attribute_value"]') # 通过元素文本内容定位 element = driver.find_element_by_xpath('//*[text()="text_content"]') # 通过元素部分文本内容定位 element = driver.find_element_by_xpath('//*[contains(text(), "text_content")]') ``` 3. 对元素进行操作: ```python # 输入文本 element.send_keys("text_input") # 点击元素 element.click() # 获取元素文本 print(element.text) # 获取元素属性值 print(element.get_attribute("attribute_name")) ``` 注意事项: - XPath定位需要用到浏览器的开发者工具,在开发者工具中可以查看元素的XPath路径。 - XPath路径中的引号需要用不同类型的引号包裹,例如在单引号内使用双引号包裹。 - 如果XPath路径中包含斜杠(/),则需要使用双斜杠(//)或者使用单引号包裹整个XPath路径。 - 在XPath路径中没有找到元素时,会抛出NoSuchElementException异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值