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()
我们可以通过逻辑运算符连接更多的属性来唯一的标识一个元素。
总之一句话,只要能够达到定位元素的目的你就成功了,多的不说,多练习下。