Python+Selenium自动化测试框架--利用xpath(XML)定位元素

本章主要学习利用tag_name定位元素,通过百度搜索编辑框进行学习:

 

find_element_by_xpath()方法用于 XPath 语言定位元素

主要有一些几种方式:

一、xpath的绝对路径进行定位:

 1 # coding=utf-8
 2 from selenium import webdriver
 3 
 4 driver = webdriver.Chrome()
 5 driver.maximize_window()
 6 driver.implicitly_wait(5)
 7 
 8 driver.get("http://www.baidu.com")
 9 try:
10     driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input")      # 绝对路径
11 print("测试通过,xpath定位成功") 12 except Exception as e: 13 print("测试失败,xpath定位失败", format(e)) 14 driver.quit()

 

  XPath 的绝对路径主要用标签名的层级关系来定位元素的绝对路径。最外层为 html 语言,body 文本内,一级一级往下查找,如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个。如:div[1]表示第一个 div 标签。

 

二、利用元素属性定位:

 1 # coding=utf-8
 2 from selenium import webdriver
 3 
 4 driver = webdriver.Chrome()
 5 driver.maximize_window()
 6 driver.implicitly_wait(5)
 7 
 8 driver.get("http://www.baidu.com")
 9 try:
10     driver.find_element_by_xpath("//*[@id='kw']")           # 利用元素属性(id)定位
11     driver.find_element_by_xpath("//*[@name='wd']")        # 利用元素属性(name)定位
12     driver.find_element_by_xpath("//*[@class='s_ipt']")     # 利用元素属性(class)定位
13     print("测试通过,xpath定位成功")
14 except Exception as e:
15     print("测试失败,xpath定位失败", format(e))
16 driver.quit()

 

  如果不想指定标签名也可以用星号(*)代替。当然,使用 XPath 不仅仅只局限在 id、name 和 class 这三个属性值,元素的任意属性值都可以使用,只要它能唯一的标识一个元素。如:autocomplete、title等等,大家可以都尝试下。

 1 # coding=utf-8
 2 from selenium import webdriver
 3 import time
 4 
 5 driver = webdriver.Chrome()
 6 driver.maximize_window()
 7 driver.implicitly_wait(5)
 8 
 9 driver.get("http://www.baidu.com")
10 try:
11     driver.find_element_by_xpath("//*[@autocomplete='off']").send_keys("selenium")
12     driver.find_element_by_xpath("//*[@value='百度一下']").click()
13     time.sleep(5)
14     print("测试通过,xpath定位成功")
15 except Exception as e:
16     print("测试失败,xpath定位失败", format(e))
17 driver.quit()

  当然也可以指定标签名

 1 # coding=utf-8
 2 from selenium import webdriver
 3 
 4 driver = webdriver.Chrome()
 5 driver.maximize_window()
 6 driver.implicitly_wait(5)
 7 
 8 driver.get("http://www.baidu.com")
 9 try:
10     driver.find_element_by_xpath("//input[@id='kw']")
11     driver.find_element_by_xpath("//input[@name='wd']")
12     driver.find_element_by_xpath("//input[@class='s_ipt']")
13     print("测试通过,xpath定位成功")
14 except Exception as e:
15     print("测试失败,xpath定位失败", format(e))
16 driver.quit()

三、层级与属性结合:

 

 

 

 1 # coding=utf-8
 2 from selenium import webdriver
 3 import time
 4 
 5 driver = webdriver.Chrome()
 6 driver.maximize_window()
 7 driver.implicitly_wait(5)
 8 
 9 driver.get("http://www.baidu.com")
10 try:
11     driver.find_element_by_xpath("//form[@name='f']/span[1]/input").send_keys("selenium")
12     driver.find_element_by_xpath("//span[@class='bg s_btn_wr']/input").click()
13     time.sleep(3)
14     print("测试通过,xpath定位成功")
15 except Exception as e:
16     print("测试失败,xpath定位失败", format(e))
17 driver.quit()

假如百度输入框本身没有可利用的属性值,我们可以查找它的上一级属性。

find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")
find_element_by_xpath("//span[@class='bg s_btn_wr']/input")
span[@class='bg s_ipt_wr'] 通过 class 属性定位到是父元素,后面/input 也就表示父元素下面标签名为
input 的子元素。如果父元素没有可利用的属性值,那么可以继续向上查找“爷爷”元素。
find_element_by_xpath("//form[@id='form']/span/input")
find_element_by_xpath("//form[@id='form']/span[2]/input")
我们可以通过这种方法一级一级的向上打找,直到找到最外层的<html>标签,那么就是一个绝对路径的写法了。

四、使用逻辑运算符:

 1 # coding=utf-8
 2 from selenium import webdriver
 3 import time
 4 
 5 driver = webdriver.Chrome()
 6 driver.maximize_window()
 7 driver.implicitly_wait(5)
 8 
 9 driver.get("http://www.baidu.com")
10 try:
11     driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").send_keys("selenium")
12     driver.find_element_by_xpath("//*[@id='su' and @class='bg s_btn']").click()
13     time.sleep(3)
14     print("测试通过,xpath定位成功")
15 except Exception as e:
16     print("测试失败,xpath定位失败", format(e))
17 driver.quit()

我们可以通过逻辑运算符连接更多的属性来唯一的标识一个元素。

 

总之一句话,只要能够达到定位元素的目的你就成功了,多的不说,多练习下。

 

posted @ 2020-05-19 14:54  给自己一个改变的理由  阅读(604)  评论(0编辑  收藏  举报