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定位就是根据链接文字进行定位

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常用定位方法

  1. #id id选择器根据id属性来定位元素
  2. .class class选择器,根据class属性来定位元素
  3. [attribute=’value’] 根据属性来定位元素
  4. 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)获取第一个

 

posted @ 2020-10-23 20:14  Water_you  阅读(144)  评论(0编辑  收藏  举报