02-八种元素定位方法

一、前言

        自动化测试过程主要包含四步操作:获取元素(定位元素)、操作元素、获取返回结果、断言(返回结果与期望结果是否一致),最后自动生成测试报告。

        元素定位在这四个环节中是至关重要的,如果说按学习精力分配的话,元素定位占70%、操作元素占10%、获取返回结果占10%、断言占10%。如果一个页面上的元素不能被定位到,那后续的操作就无法进行了,接下来就来介绍WebDriver提供的八种元素定位方法。

        以百度网页的搜索框为例:<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

二、id

        1)百度网页的搜索框有个id属性:id="kw",因此可以使用WebDriver的API根据id属性定位到该元素。

        2)定位到搜索框后,可以使用send_keys()方法,向搜索框中输入内容。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 通过id定位到搜索框,并输入内容
driver.find_element('id', 'kw').send_keys('selenium')

三、name

        百度网页的搜索框有个name属性:name="wd",因此可以使用WebDriver的API根据name属性定位到该元素。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 通过name定位到搜索框,并输入内容
driver.find_element('name', 'wd').send_keys('selenium')

        说明:根据元素的name属性进行定位,前提是该元素有name属性。如果在页面中该元素的name属性值是唯一的,那么可以准确的定位到该元素;如果不是唯一的,则默认返回第一个定位到的元素。

四、class name

        百度网页的搜索框有个class属性:class="s_ipt",因此可以使用WebDriver的API根据class属性定位到该元素。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 通过class定位到搜索框,并输入内容
driver.find_element('class name', 's_ipt').send_keys('selenium')

        说明:根据元素的class属性进行定位,前提是该元素有class属性。如果在页面中该元素的class属性值是单一样式的,比如:class='s_ipt',那么可以使用class name对该元素进行定位;如果是复合样式的,比如:class='s_ipt  border',那么不可以使用class name对该元素进行定位。

五、tag name

        网页中的所有元素都有tag(标签)属性,比如搜索框的tag属性就是最前面的input标签。很明显,在一个页面中,相同的标签有很多,所以一般不用tag属性来进行定位。以下例子,仅供参考和理解。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 通过tag name定位元素
elements = driver.find_elements('tag name', 'input')
print(len(elements))

六、link text

        link text和partial link text专门用于定位超链接(标签是<a></a>)元素,使用link text进行定位时,只能使用<a></a>标签内的全部文本内容进行精准匹配。

        以百度网页的hao123为例:<a href="https://www.hao123.com?src=from_pc" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 通过link text定位超链接元素
driver.find_element('link text', 'hao123').click()

七、partial link text

        使用partial link text进行定位时,可以使用<a></a>标签内的部分文本内容进行模糊匹配。模糊匹配时,最好使用在页面中唯一存在的关键字;如果有多个元素符合条件,则默认返回第一个定位到的元素。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 通过partial link text定位超链接元素
driver.find_element('partial link text', 'hao12').click()

八、xpath

        以上定位方式都是通过元素的某个属性来进行定位的,如果一个元素它既没有id、name、class属性,也不是超链接,那该怎么办呢?或者说在一个页面中,该元素的属性值有很多重复时,该怎么进行定位呢?这个时候就可以用xpath来解决,xpath既可以通过元素的任意属性来定位,又可以通过元素的位置来定位。

        xpath是XML路径语言,通俗一点讲就是通过元素的所在位置来定位到该元素,相当于是通过元素的坐标来进行定位的。以下例子,只是简单介绍xpath定位元素的过程,在下一篇文章中将会对xpath进行详细介绍。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 使用xpath根据位置进行定位
driver.find_element('xpath', "//*[@id='form']/span[1]/input").send_keys('python')

九、css selector

        大部分人在使用selenium定位元素时,都是使用xpath进行定位,因为xpath基本能够解决定位元素的需求。css selector定位往往被忽略掉了,其实css selector定位也有它的价值,css selector定位更快、性能更高、语法更简洁。css selector也能通过元素的任意属性来定位,又能通过元素的位置来定位。以下例子,只是简单介绍css selector定位元素的过程,在后续文章中将会对css selector进行详细介绍。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://baidu.com")

# 使用css selector根据位置进行定位
driver.find_element('css selector', "form#form>span:nth-child(1)>input").send_keys('python')

十、总结

1)元素定位方式的选择
  • 当页面元素有id属性时,优先使用id属性来定位,其次是name属性。
  • xpath功能很强大,但定位性能不是很好,当其他定位方法不好用时,可以使用xpath解决。
  • 定位一组相同元素时,可以考虑使用name属性或者tag name。
  • 定位超链接时,可以考虑使用link text或者partial link text。
2)定位元素的注意事项
  • 找到待定位元素的唯一属性。
  • 如果该元素没有唯一属性,则先找到能够被唯一定位到的父元素,再使用xpath或者css selector进行基于位置的定位。
  • 如果待定位元素的唯一属性是动态变化的,最好是不要用该属性进行定位。
  • 最重要的是多和研发人员沟通,尽量把关键元素的id或name属性加上,并减少不合理的页面元素,比如:重复id这样的事情最好不要发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值