元素定位
元素的定位是自动化测试的核心,想要操作一个元素,首先应该识别这个元素。webdriver 提供了一系列的元素定位方法,常用的有以下几种:
元素名称 | webderiver api |
id | find_element_by_id() |
name | find_element_by_name() |
class name | find_element_by_class_name() |
tag name | find_element_by_tag_name() |
link text | find_element_by_link_text() |
partial link text | find_element_by_partial_link_text |
xpath | find_element_by_xpath() |
css selector | find_element_by_css_selector() |
元素操作方式:
方法 | 说明 |
clear | 清除元素内容 |
send_keys | 模拟按键输入 |
click | 点击 |
submit | 提交表单 |
案例:打开百度首页,根据元素 id ,在搜索框自动输入 seleium 关键字,然后点击搜索按钮,查看索搜页面,再根据元素 name ,搜素python
id:根据标签中属性 input id 来定位
name:根据标签中 name 来定位
from selenium import webdriver
from time import sleep
a = webdriver.Firefox()
a.get("http://www.baidu.com/")
#获取 输入框 id 元素
ele = a.find_element_by_id("kw")
ele.send_keys("selenium")
#定位搜素按钮的id 元素,点击搜素
#a.find_element_by_id("su").click()
sleep(2)
ele.clear()
# 获取输入框 name 元素
ee = a.find_element_by_name("wd")
ee.send_keys("python")
sleep(2)
# 点击 搜索按钮
a.find_element_by_id("su").click()
a.close()
元素定位 - tag name,css selector , link text
tag name:根据标签名称来定位
css selector:根据链接的css路径来定位
link text:定位就是根据超链接文字进行定位
from selenium import webdriver
from time import sleep
a = webdriver.Firefox()
a.get("https://www.taobao.com")
el = a.find_element_by_tag_name("input")
el.send_keys("羽绒服")
sleep(3)
el.clear()
#获取页面所有标签为 input 元素的
el = a.find_elements_by_tag_name("input")[0]
el.send_keys("羽绒服女")
a.find_element_by_css_selector("html.ks-gecko64.ks-gecko.ks-firefox64.ks-firefox body.taobao.s1365.s1440 div.cup.J_Cup div.top.J_Top div.top-wrap.clearfix div.tbh-search.J_Module div.search-wrap div.search-bd div.search-panel.search-hp-panel.ks-switchable-content.J_SearchPanel form#J_TSearchForm.search-panel-focused div.search-button button.btn-search.tb-bg").click()
a.back()
#进入标题导航“天猫”
a.find_element_by_link_text("天猫超市").click()
a.quit()
css selector:还有一种写法:
a.find_element_by_css_selector('input=[id=\'search\']')
或者
a.find_element_by_css_selector("#kw").send_keys("selenium 自学")
.
元素定位:class name , partial link text
class name:根据标签中 class 属性来定位
partial link text:定位就是根据超链接文字模糊定位
from selenium import webdriver
from time import sleep
a = webdriver.Firefox()
a.get("https://www.taobao.com")
#根据class 属性定位
a.find_element_by_class_name("search-combobox-input").send_keys("羽绒服")
a.back()
#根据 partial link text 进入天猫超市
a.find_element_by_partial_link_text("超市").click()
sleep(3)
a.quit()
元素定位:xpath
xpath定位:xpath 即为XML 路径语言,它是一种用来确定 XML 文档中某部分位置的语言。xpath 基于 XML的树状结构,提供在数据结构中找寻节点的能力
xml 路径语言:用来确定 xml 文档中某部分位置的语言
xpath 用于在 xml 文档中通过元素和属性进行导航
xpath 是一个 W3C 标准
对 xml / html 有一定的了解
xpath 节点类型:
元素,属性,文本,命名空间,指令处理,注释及文档
xpath :通过路径表达式从 xml 文档中选取节点或节点设置
表达式 | 结果 |
/xxx | 选取根节点xxx |
/xxx/yyy | 根据绝对路径选择元素 |
//xxx | 整个文档扫描,找到所有xxx元素 |
//xxx/yyy | 所有父元素为xxx的yyy元素 |
. | 选取当前节点的父元素节点 |
.. | 选取父元素地址 |
//xxx[@id] | 选取所有xxx元素中有id属性的元素 |
///xxx[@id=yyy] | 选取所有xxx元素id属性为yyy的元素 |
xpath 绝对与相对定位
<html>
<head>
it's head
<titile>selenium</title>
</head>
<body>
<form>
firstname
<input type="text" name="firstname">
<br />
lastname
<input type="text" name="lastname">
</form>
<p>
age
<input type="text" name="age">
</p>
</body>
</html>
绝对路径定位:
自己创建的 html 文件(aa.html)
from selenium import webdriver
from time import sleep
a = webdriver.Firefox()
#打开本地的 html 文件
a.get("file:///C:/Users/Administrator/Desktop/aa.html")
#选取根路径节点
ele = a.find_element_by_xpath("/html")
print(ele)
#打印页面所显示的文件内容
print(ele.text)
#获取文件的绝对路径,获取的是第一个框里(firstname)的路径
ele=a.find_element_by_xpath("/html/body/titile/form/input")
#打印html 里的type 、name 的值
print(ele.get_attribute('type'))
print(ele.get_attribute('name'))
ele.send_keys("夏天")
ele.clear()
sleep(2)
#第一个框里的绝对路径后面加标注,[1]指第一个
ele=a.find_element_by_xpath("/html/body/titile/form/input[1]")
ele.get_attribute("xiatian")
sleep(3)
ele1=a.find_element_by_xpath("/html/body/titile/form/input[2]")
ele1.get_attribute("dongtian")
#获取 age 的节点,赋值
ele2=a.find_element_by_xpath("/html/body/titile/p/input")
ele2.send_keys(20)
from selenium import webdriver
from time import sleep
a=webdriver.Firefox()
a.get("https://baidu.com")
# 利用熟悉的元素定位,定位到 input 标签中为 kw 元素
a.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
# 定位 input 标签中 name 属性为 wd 的元素
#a.find_element_by_xpath("//input[@name='wd']").send_keys("python3")
#sleep(3)
# 定位所有标签元素中,class 属性为 s_ipt 的元素
#a.find_element_by_xpath("//*[@class='s_ipt']").send_keys("python3") # 有一个标签元素的时候用此
#sleep(3)
sleep(3)
a.quit()
xpath:通过路径表达式从 XML 文档中选取节点或节点设置
表达式 | 结果 |
//*[count(xxx)=2] | 统计xxx元素个数=2的节点 |
//*[local-name()='xxx'] | 找到 tag 为 xxx 的元素 |
//*[starts-with(local-name(),'x')] | 找到所有 tag 以 x 开头的元素 |
//*[contains(local-name(),'x')] | 找到所有 tag 包含 x 的元素 |
//*[string-length(local-name())=3] | 找到所有 tag 长度为 3 的元素 |
//xxx|//yyy | 多个路径查找 |