第二章
--------------WebDrriver元素定位------------------
白开水笔记,内涵代码可跟着敲一敲,ui自动化必须会的定位
2.0 WebDriver概述
只支持jdk1.8及以上
通过ms官方的webdriver支持Edge浏览器
通过mozilla官方的geckodriver来支持火狐
2.1 安装selenium
安装命令: pip install selenium
查看版本:pip show selenium
dos 退出某个环境:quit()
查看安装路径:where python
重要!!安装火狐浏览器驱动
https://github.com/mozilla/geckodriver/releases/tag/v0.31.0
解压后放到py安装目录下
2.2 WebDriver提供了八中定位元素方式,并提供对应的方法
这个是老方法不用了,仅供了解
1* id find_element_by_id("id属性值")
2* name find_element_by_name("name属性值")
3 link text find_element_by_link_text(“连接文本”)
4 partial link text find_element_by_partial_link_text(“部分连接文本”)
5 class name find_element_by_class_name(“类名”)
6 tag name find_element_by_tag_name(“标记名称”)
7* xpath find_element_by_xpath(“xpath表达式”)
8 css selector find_element_by_css_selector(“css表达式”)
新方法统一调用find_element()方法,通过类by来声明定位方法,并传入相应的定位参数
示例:
find_element(定位类型,定位具体信息)
需要导入类by
from selenium.webdriber.common.by import By
1* id find_element(By.ID,"id属性值")
2* name find_element(By.NAME,"name属性值")
3 link text find_element(By.LINK_TEXT,“连接文本”)
4 partial link text find_element(By.PARTIAL_LINK_TEXT,“部分连接文本”)
5 class name find_elemente(By.LINK_TEXT,“类名”)
6 tag name find_element(By.TAG_NAME,“标记名称”)
7* xpath find_element(By.XPATH,“xpath表达式”)
8 css selector find_element(By.CSS_SELECTOR,“css表达式”)
2.3 ID定位 核心知识点
from selenium import webdriver # 导入webdriver
from selenium.webdriver.common.by import By #导入By
from time import sleep #导入time
# 对火狐实例化
d = webdriver.Firefox()
# 定位元素
myname = d.find_element(By.ID,"username")
2.3.1 操作
文本框输入:
文本框.send_keys(数据)
myname.send_keys("张三")
单击按钮:
按钮.click()
tijiao = d.find_element(By.ID,"tijiao")
tijiao.click()
关闭浏览器:
driver.quit()
控制运行速度:
sleep(3)
2.4 name定位 参考id定位
2.5 linktext定位
find_element(By.LINK_TEXT,"链接文字")
lian1 = driver.find_element(By.LINK_TEXT,"连接文字")
sleep(1)
lian1.click() #点击连接
示例2:
url="https://www.baidu.com"
driver = webdriver.Firefox()
driver.get(url) #打开浏览器
news = driver.find_element(By.LINK_TEXT,"新闻")
new.click #点击连接
2.6 partial link text 定位
find_element(By.PARTIAL_LINK_TEXT,"部分链接文字")
示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver= webdriver.Firefox()
url="https://www.baidu.com"
driver.get(url)
link = driver.find_element(By.PARTIAL_LINK_TEXT,"hao") #首页的hao123
sleep(2)
link.click()
2.7 class name 定位
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Firefox()
url="打开的地址 "
driver.get(url)
data_username = "zhangsan"
data_password ="123456"
name = driver.find_element(By.CLASS_NAME,"username")
pw = driver.find_element(By.CLASS_NAME,"password")
submit = driver.find_element(By.CLASS_NAME,"submit")
name.send_keys(data_username)
pw.send_keys(data_password)
submit.click()
driver.quit() #退出浏览器
2.8 tag name定位(有很多时,只能定位第一个,后面的定位不到了)
mylink = driver.find_element(By.TAG_NAME,"a")
mylink.click()
driver.back() #返回
2.9 火狐插件安装插件
Try xpath --Xpath验证工具
xpath finder --生成Xpath工具
在浏览器按F12左侧的元素定位,点击元件,在查看器蓝色部分右击、
找菜单复制(copy),点击copy XPATH。即可复制元素路径
XPath 路径表达式
绝对路径定位元素
相对路径定位元素
2.10 绝对路径定位元素
绝对路径XPath表达式已斜线“/”开始,从根节点标记html开始,逐级
示例:/html
/html/body/form/textarea
精确定位基本语法: /html/body/form/input[@value='姓名']
python定位语法:
myname=driver.find_element(By.XPATH,"/htme/body/form/input[@value='姓名']")
重点说明:
为了精确定位。需要加一些属性说明
属性说明使用方括号[]括起来
属性名称前使用@前缀
属性说明格式:节点名称[@属性名="属性值"]
绝对路径定位缺点:表达式长,可维护性差,不推绝对路径定位方式,因为页面发生一点变化,原有定位的xpath表达式就会失效
2.11 相对路径定位元素
点对路径XPATH表达式已斜线“//”开始,表示在文档中的全部层级查找
精确定位基本语法: //input[@value='姓名']
重点说明:
相对路径查找以'//'开头,表示在html文档中的全部层级位置进行查找所有满足双斜线“//”之后规则的元素(无论层级关系)
推荐使用相对路径Xpath表达式,可以大大降低测试脚本中定位表达式的维护成本
2.12 谓词(就是附加哦条件)写在[]中的
//input[@id='password']
常用的方法:
使用页面元素的 属性值
使用页面元素的 索引号
索引号是从1开始
//input[1]
使用页面元素的 存在某属性
节点名称[@属性名称]
//input[@checked]
使用页面元素的 存在某子节点
节点名称[子节点名称]
//ul[lable]
u1 = driver.find_element(By.XPATH,"//ul[lable]")
使用页面元素的 子节点值
节点名称[子节点名称='子节点文本值']
//ul[li="英语"]
u2=driver.find_element(By.XPATH,"//ul[li = '英语']")
2.13 多条件查找:
如果通过一个属性信息不能定位到元素,可通过多个属性信息进行定位
语法:
//节点名称[@属性名1="属性值2"][@属性名2="属性值2"]
//节点名称[@属性名1="属性值2" and @属性名2="属性值2"]
a1=driver.find_element(By.XPATH,"//*[@id='linka' and @name='demo']")
2.14 通配符
'*'表示匹配任何元素节点
示例1:
//*[@id='username']查找任何id属性值等于username的元素节点
示例2:
//select[@name]/* 查找存在name属性的select节点的所有子节点
'@*'表示匹配任何属性
示例1:
//input[@*='password']查找任何属性值等于password的input元素节
示例2:
//select[@*]查找所有带有属性的select元素节点
示例3:
//*[@*='飞机']查找任何属性等于“飞机”的所有元素节点
2.15 css定位概述
css中文意思层叠样式单
dricer.find_element(By.CSS_SELENCE,"css表达式")
绝对路径定位
如:html>body>form>textarea
精确定位语法:html>body>form>input[value="姓名"]
相对路径定位
精确定位语法:input[value="姓名"]
2.16 css精确定位方式
1、属性名="属性值"
input[id="password"]
mypassword = driver.find_element(By.CSS_SELECTOR,'input[id="password"]')
2、使用属性:
input[checked]
mypassword = driver.find_element(By.CSS_SELECTOR,'input[checked]')
3、使用ID属性值:
input#password
mypassword = driver.find_element(By.CSS_SELECTOR,'input#password')
4、使用class属性值
input.username
mypassword = driver.find_element(By.CSS_SELECTOR,'input.username')
2.17 定位一组元素
批量操作多个元素
先获取一组元素,在从这组对象中过滤出需要操作的元素
WebDriver 提供find_element**s**()方法进行定位一组元素
注意:这是的element加了s
2.17.1 一些辅助功能
is_selecter() 判断按钮是否选中
get_attribute 获得属性值
示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Firefox()
url = file:///D:/selenium_demo/demo11.html #这是我本地的demo你需要换成自己的
driver.get(url)
# 定位单选按钮,采用一组定位方式
pay = driver.find_elements(By.NAME, "pay")
可用下标使用元素,pay[2].click() #点击第三个元素(下标从0开始数)
# print(pay)
# 可以使for循环遍历列表pay,获取每一个元素信息
for i in pay: # 每次循环获得一个控件/元素,放在变量i中
if not i.is_selected(): # 判断一下该单选按钮是否选中,如果没有选中,就进行点击
i.click()
v = i.get_attribute("value") # 获取该控件的某个属性值,参数就是属性名称
print("点击的是那个一个按钮", v)
sleep(2)
# 定位复选按钮,采用一组定位方式
hobby = driver.find_elements(By.XPATH, "//*[@type='checkbox']")
list1 = []
list2 = []
list3 = []
for m in hobby:
list1.append(m.is_selected()) # 获取控件的初始状态,存到list1
list2.append(m.get_attribute('name')) # 获得每个复选框name属性值,存在list2中
print("复选框初始状态:", list1)
print("所有的爱好:", list2)
for h in hobby:
h.click() # 点击每一个复选框
if h.is_selected() == True: # 如果复选框最后选中
d = h.get_attribute("name") # 获得选中复选框的name属性的值
list3.append(d) # 把获得的name属性值存在list3中
print("选的的爱好包括:", list3)
sleep(3)
driver.quit()
2.30 text()函数 补充
# td标签中含“系统设置”这几个字的td
# 在谓词当中,使用test()函数,可以获得标签中的字符串
set = (By.XPATH, '//td[text()="系统设置"')
版权归原作者 白开水THEONE 所有, 如有侵权,请联系我们删除。