Selenium 元素定位
元素定位
元素的定位应该是自动化测试的核心,要想操作一个元素,首先应该识别这个元素象。
webdriver提供了一系列的对象定位方法,常用的有以下几种
- id
- name
- class name
- link text
- partial link text
- tag name
- xpath
- css selector
id与name 定位
案例:打开百度首页,在搜索框自动输入“python”关键词,然后点击搜索按钮,查看搜索页面。
from selenium import webdriver from time import sleep driver=webdriver.Chrome() driver.get("http://www.baidu.com") #根据id=kw定位元素,并输入python driver.find_element_by_id("kw").send_keys("python") sleep(1) #清除输入框内容 driver.find_element_by_id("kw").clear() sleep(1) #根据name=kw定位元素,并输入python driver.find_element_by_name("wd").send_keys("python") sleep(2) #根据id=su定位元素,并点击 driver.find_element_by_id("su").click() sleep(3) driver.quit()
tag_name定位
案例:打开我要自学网页面,在用户名输入框输入用户名“selenium”
from selenium import webdriver from time import sleep driver=webdriver.Chrome() driver.get("http://www.51zxw.com") #定位标签名为input的元素 driver.find_element_by_tag_name("input").send_keys("selenium") #获取页面所有标签名称为“input”的标签。 driver.find_elements_by_tag_name("input")[0].send_keys("selenium") sleep(3) driver.quit()
class_name定位
案例:根据标签中属性class来进行定位的一种方法,打开百度
from selenium import webdriver from time import sleep driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_class_name("s_ipt").send_keys("Selenium 我要自学网") sleep(2) driver.find_element_by_id("su").click() sleep(3) driver.quit()
link_text定位
案例:link_text定位就是根据链接文字进行定位
from selenium import webdriver from time import sleep #1. link_text 和 partial_link_text区别 #link_text 是超链接载体的精确匹配,而partial_link_text是对超链接载体的模糊匹配 #2. 使用时这个超链接载体必须是唯一的。 #3. 在网页上可通过Ctrl+F来查找关键字查看链接载体是否唯一 driver=webdriver.Chrome() driver.get("http://www.52zxw.net/") ### #精确匹配超链接载体 driver.find_element_by_link_text('程序设计').click() sleep(3) #模糊匹配超链接载体 driver.find_element_by_partial_link_text('自动化测试').click() sleep(3) driver.quit()
XPath定位
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
from selenium import webdriver from time import sleep driver=webdriver.Chrome() driver.get("http://www.baidu.com") # 绝对路径定位 driver.find_element_by_xpath("/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input").send_keys("51zxw") # 利用元素熟悉定位--定位到input标签中为kw的元素 driver.find_element_by_xpath("//input[@id='kw']").send_keys("Selenium") # 定位input标签中name属性为wd的元素 driver.find_element_by_xpath("//input[@name='wd']").send_keys("Selenium") # 定位所有标签元素中,class属性为s_ipt的元素 driver.find_element_by_xpath("//*[@class='s_ipt']").send_keys("Python3") driver.find_element_by_id('su').click() sleep(3) driver.quit()
xpath组合与逻辑定位
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get("https://www.52zxw.net/login")
#层级和属性结合定位--自学网首页输入用户和名密码
driver.find_element_by_xpath("//form[@id='loginFrom']/div/div[2]/input").send_keys("51zxw")
driver.find_element_by_xpath("//form[@id='loginFrom']/div/div[4]/input[2]").send_keys("66666")
#逻辑运算组合定位
driver.find_element_by_xpath("//input[@type='text' and @name='loginStr']").send_keys("51test")
sleep(3)
driver.quit()
css定位
Selenium极力推荐使用CSS 定位,而不是XPath来定位元素,原因是CSS 定位比XPath 定速度快,特别是在IE浏览器环境
前端开发人员就是用CSS Selector设置页面上每一个元素的样式,无论那个元素的位置有多复杂,他们能定位到,那我们使用CSS Selector肯定也能非常精准的定位到页面Elements。
CSS常用定位方法
- #id id选择器根据id属性来定位元素
- .class class选择器,根据class属性来定位元素
- [attribute=’value’] 根据属性来定位元素
- element.Attribute>element 根据元素层级来定位 父元素>子元素
from selenium import webdriver from time import sleep driver=webdriver.Chrome() driver.get("http://www.baidu.com") #根据id来定位 driver.find_element_by_css_selector('#kw').send_keys("Selenium 我要自学网") #根据class定位 driver.find_element_by_css_selector('.s_ipt').send_keys('python') #通过属性来定位 driver.find_element_by_css_selector("[autocomplete='off']").send_keys("selenium") sleep(2) driver.find_element_by_id('su').click() driver.get("http://www.52zxw.net/login") #通过元素层级来定位 driver.find_element_by_css_selector("form#loginFrom>div>div>input").send_keys("51zxw") sleep(2) driver.quit()
下拉菜单元素定位
案例:下拉元素定位
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>下拉框练习</title> </head> <body> <select name="辛弃疾" id=""> <option value="01">破阵子·为陈同甫赋壮词以寄之</option> <option value="02">醉里挑灯看剑,梦回吹角连营。</option> <option value="03">八百里分麾下炙,五十弦翻塞外声。沙场秋点兵。</option> <option value="04">马作的卢飞快,弓如霹雳弦惊。</option> <option value="05">了却君王天下事,赢得生前身后名。</option> <option value="06">可怜白发生!</option> </select> </body> </html>
1.根据选项元素标签定位
from selenium import webdriver from time import sleep driver=webdriver.Chrome() driver.get("file:///D:/Users/xxxx/Desktop/test.html") sleep(2) #根据option标签来定位 driver.find_elements_by_tag_name('option')[1].click() driver.find_element_by_css_selector("[value='02']").click() sleep(2) driver.quit()
2.使用Select类定位
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import Select
driver=webdriver.Chrome()
driver.get("file:///D:/Users/xxxx/Desktop/test.html")
sleep(2)
#利用Select类来进行定位
select = Select(driver.find_element_by_css_selector("[name='辛弃疾']"))
select.select_by_index(2)
sleep(2)
select.select_by_visible_text("了却君王天下事,赢得生前身后名。")
sleep(2)
select.select_by_value("06")
sleep(2)
driver.quit()
By 元素定位
- find_element(By.ID,”loginName”)
- find_element(By.NAME,”SubjectName”)
- find_element(By.CLASS_NAME,”u-btn-levred”)
- find_element(By.TAG_NAME,”input”)
- find_element(By.LINK_TEXT,”退出”)
- find_element(By.PARTIAL_LINK_TEXT,”退”)
- find_element(By.XPATH,”.//*[@id=’Title”)
- find_element(By.CSS_SELECTOR,”[type=submit]”)
from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep driver=webdriver.Chrome() driver.get("http://www.baidu.com/") driver.implicitly_wait(5) driver.find_element(By.ID,'kw').clear() driver.find_element(By.NAME,'wd').send_keys("Python ") driver.find_element(By.CLASS_NAME,'s_ipt').send_keys("自动化测试") driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("UI自动化测试") sleep(3) driver.find_element(By.ID,'su').click() sleep(3) driver.quit()
元素操作方法
- text 返回元素内容
- clear()清除元素内容
- send_keys() 传送元素值
- click() 点击操作
- submit()提交操作
- get_attribute()获取元素的属性
from selenium import webdriver driver=webdriver.Chrome() driver.get("http://www.baidu.com") #注意调用的text没有()号,元素属性 text_ban=driver.find_element_by_id("s-usersetting-top").text print(text_ban) driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys("python") print("点击百度一下》》") #driver.find_element_by_id("su").click() #click 和submit是一样的 driver.find_element_by_id("su").submit() size=driver.find_element_by_id("kw").size print("搜索框尺寸为:%r" %size) attribute=driver.find_element_by_id("kw").get_attribute('type') print("输入框的属性为:%s" %attribute)
复选框定位
tag获取页面中所有的标签为input的元素 elements 多了一个“s” 这样可以获取一组元素
在实际项目过程中,会经常遇到页面的各自复选框,那么使用selenium该如何操作这些选项框呢?
<html> <head> <title> </title> </head> <body> <p><input type="checkbox" name="category" value="今日话题" />今日话题 </p> <p><input type="checkbox" name="category" value="视觉焦点" />视觉焦点</p> <p><input type="checkbox" name="category" value="财经" />财经</p> <p><input type="checkbox" name="category" value="汽车" />汽车</p> <p><input id="btnOperate" type="button" value="选择" onclick="static_num()" /></p> </body> </html>
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get("file:///D:/Users/huanghuiyou/Desktop/test2.html")
inputs=driver.find_elements_by_tag_name("input")
print("复选框的个数为")
print(len(inputs))
#inputs=driver.find_elements_by_xpath("//input[@type='checkbox']") #xpath获取元素
#inputs=driver.find_elements_by_css_selector("input[type=checkbox]") #通过css来定位
for i in inputs:
if i.get_attribute("type")=="checkbox": #获取元素属性为checkbox
i.click() #勾选方框
sleep(1)
#去掉最后一个选修的勾
driver.find_elements_by_xpath("//input[@type='checkbox']").pop(-1).click()
#pop(-1)获取最后一个,pop(0)获取第一个