Selenium
webDriver的使用
下载浏览器驱动包,将其所在的目录地址,配置到环境变量path中
1 2 3 4 5 6 7 8 9 10 11
| from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(3)
driver.quit()
|
元素定位
让程序操作,必须先找到此元素!
f12定位,根据标签名、属性、层级、路径定位元素
定位方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| id name class_name <元素的class属性定位> tag_name <标签名> link_text <a 超链接> partial_link_text <a 超链接 模糊> xPath 基于路径定位 css
定位方式 1. id 2. name 3. class_name(使用元素的class属性定位) 4. teg_name(标签名称 <标签名 .../>) 5. link_text(定位超连接 a标签) 6. partial_link_text(定位超链接 a标签 模糊) 7. xpath(基于元素路径) 8. css(元素选择器) 汇总: 1. 基于元素属性特有定位方式(id\name\class_name) 2. 基于元素标签名称定位:tag_name 3. 定位超链接文本(link_text、partial_link_text) 4. 基于元素路径定位(xpath) 5. 基于选择器(css)
|
id定位
1 2 3 4 5 6 7 8 9
| 通过元素id属性定位,id一般唯一
说明: 通过元素的id属性定位,id一般情况下在当前页面中是唯一。 方法: driver.find_element_by_id(id) driver.find_element(By.ID,'userA') 提示: 元素必须要有id属性。
|
案例:
1 2 3 4 5 6 7 8 9 10 11 12
| from time import sleep
from selenium import webdriver from selenium.webdriver.common.by import By
driver = webdriver.Chrome() url = r'D:\py\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html' driver.get(url) driver.find_element(By.ID,'userA').send_keys('admin') driver.find_element(By.ID,'passwordA').send_keys('1234') sleep(3) driver.quit()
|
提示:
1. 输入方法:send_keys(“输入内容”);
2. 退出浏览器驱动:driver.quit();
3. 打开url: driver.get(url)
4. 导包:from selenium import webdriver
5. 获取火狐浏览器驱动对象 driver = webdriver.Firefox()
name定位
1 2 3 4 5 6 7
| 说明: 通过元素的name属性来定位, name一般名称为重复。 方法: drivr.find_element_by_name(name) drivr.find_element(By.NAME,name) 提示: 元素必须要有name属性
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| from time import sleep
from selenium import webdriver from selenium.webdriver.common.by import By
driver = webdriver.Chrome() url = r'D:\py\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html' driver.get(url) driver.find_element(By.NAME,'userA').send_keys('admin') driver.find_element(By.NAME,'passwordA').send_keys('1234') sleep(3) driver.quit()
|
class_name定位:
1 2 3 4 5 6 7
| 说明: 通过元素的class属性来定位,class属性一般为多个值。 方法: driver.find_element_by_class_name() driver.find_element(By.CLASS_NAME,class_name) 提示: 元素必须要有class属性
|
1 2 3 4 5 6 7 8 9 10 11
| from time import sleep
from selenium import webdriver from selenium.webdriver.common.by import By
driver = webdriver.Chrome() url = r'D:\py\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html' driver.get(url) driver.find_element(By.CLASS_NAME,'telA').send_keys('17861688359') sleep(3) driver.quit()
|
id、name、class区别
1 2 3
| id: 一般为唯一标识符。(快速找到) name:可以重名 (快速更改某一样式) class:多个命名。(通过多种方式找)
|
遇到的问题
1 2 3 4 5 6 7 8
| Python+Selenium 定位元素 drivr.find_element_by_name(name) 使用此方法去定位元素出现以下错误
Selenium - Python - AttributeError: 'WebDriver' object has no attribute 'find_element_by_name'
原因:selenium的版本太高,需要使用 driver.find_element(By.Name,name).send_keys('ChromeDriver')
|
tag_name定位
1 2 3 4 5 6
| 说明:是通过元素的标签名称来定位,标签名(查看元素时尖括号(<)紧挨着的单词或字母就是标签名)(标签名也就是元素名) 方法:driver.find_element_by_tag_name("标签名") 注意: 1. 如果页面中存在多个相同标签,默认返回第一个标签元素。 <后的第一个标签就是标签名> 如果存在多个相同的标签,则会返回第一个标签
|
如何获取第二个元素?
Linkl_text定位
和partial_link_text模糊定位 只能定位超链接
1 2 3 4
| 说明:定位超链接标签 方法:driver.find_element_by_link_text() 注意: 1. link_text:只能使用精准匹配(a标签的全部文本内容)
|
partial_link_text定位
1 2 3 4 5 6
| 说明:定位超链接标签 方法:driver.find_element_by_partial_link_text() 注意: 1. 可以使用精准或模糊匹配,如果使用模糊匹配最好使用能代表唯一的关键词 2. 如果有多个值,默认返回第一个值 3. partial_link_text模糊定位(a标签的全部文本内容),但是必须能代表唯一性
|
1 2 3 4 5 6 7 8 9 10 11 12
| from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url=r'***')
driver.find_element(By.partialLinkText('访问')).click()
sleep(3)
webdriver.quit()
|
Xpath定位
为什么使用Xpath和Css定位?
1 2 3 4 5
| Id,name,class:依赖于元素属性,如果没有属性定位方法就不能生效
Link_text和partial_link_text只适合超链接
Tag_name:只能找唯一的 标签,或者页面中多个相同的只能找到第一个相同的元素
|
什么是Xpath?
基于标签路径来寻找
Xml:标记语言,数据存储和传递
Xpath定位策略:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 路径-定位 1). 绝对路径: 语法:以单斜杠开头逐级开始编写,不能跳级。如:/html/body/div/p[1]/input 以/开头,一步步写到目标标签,不能跳级 2). 相对路径 语法:以双斜杠开头,双斜杠后边跟元素名称,不知元素名称可以使用*代替 以//开头,后面/就可以 想要加属性名 例如: //input[@id=’userA’] 或者 //*[@id=’userA’] 如: //input //* 路径结合元素属性-定位 语法:在Xpath中,所有的属性必须使用@符号修饰 如://*[@id='id值'] 路径结合多个属性- 定位 and 语法://*[@id="id值" and @属性='属性值'] 路径结合层级 -定位 语法://*[@id='父级id属性值']/input 提示: 1. 一般见识使用指定标签名称,不使用*代替,效率比较慢。 2. 无论是绝对路径和相对路径,/后面必须为元素的名称或者* 3. 扩展:在工作中,如果能使用相对路径绝对不使用绝对路径。
|
Xpath延伸
1 2 3 4 5 6 7
| 都是相对路径
//*[text()= ‘xxx’] 定义文本值等于xxx的元素 一般使用p和a标签
//*[contains(@属性,’xxx’)] @是属性 属性包含xxx的元素 //*[contains(@type,’keyword’)]
//*[starts-with(@属性,’xxx)] 定位属性以xxx开头
|
CSS定位
说明:
1. CSS一种标记语言,焦点:数据的样式。控制元素的显示样式,就必须先找到元素,在css标记语言中找元素使用css选择器;
2. css定位就是通过css选择器工具进行定位。
3. 极力推荐使用,查找元素的效率比xpath高,语法比xpath更简单。
方法:
driver.find_element_by_css_selector()
常用测略:
id 选择器
前提:元素是必须有id属性
语法:#id 如:#passwordA
class 选择器
前提:元素是必须有class属性
语法:.class 如:.telA
元素选择器
语法:element 如:input (适合单标签)
属性选择器
语法:[属性名=属性值] 里面的数据type和name
层级选择器
语法:
p>input
p input
提示:>与空格的区别,大于号必须为(上下级关系)子元素,空格则不用(跨越级别)。
扩展:
[属性^=’开头的字母’] # 获取指定属性以指定字母开头的元素
[属性$=’结束的字母’] # 获取指定属性以指定字母结束的元素
[属性*=’包含的字母’] # 获取指定属性包含指定字母的元素
XPath和CSS类型功能对比
工具可以直接获取 firePath 谷歌复制
复制xpath:/html/body/form/div/fieldset/p[1]/input
复制最简://*[@id=”userA”]
复制CSS路径:html body form div#zc fieldset p#p1 input#userA
采用link_text 别的css
提示:
虽然借助工具可以快速生成xpath路径和css语法,但是前期不建议使用。工具在智能,没有人智能。
定位一组元素
方法:driver.find_elements_by_xxx()
只有一个值也是列表
返回结果:类型为列表,要对列表进行访问和操作必须指定下标或进行遍历,[下标从0开始]
扩展8种元素定位的底层实现
方式:driver.find_element(By.xxx, ‘value’)
参数说明:
By.xxx :为By类的类型 如:By.ID
value: 元素的定位值 如: “userA”
By类:需要导包 位置: from selenium.webdriver.common.by import By
元素操作
一、元素操作方法
2.1 方法
1). send_keys() # 输入方法
2). click() # 点击方法
3). clear() # 清空
2.2 提示:
1. 在输入方法之前一定要清空操作。
二、浏览器常用操作API
2.1 方法
1). driver.maximize_window() # 最大化浏览器
2). driver.set_window_size(w, h) # 设置浏览器大小 单位像素
3). driver.set_window_position(x, y) # 设置浏览器位置
4). driver.back() # 后退操作
5). driver.forward() # 前进操作
6). driver.refresh() # 刷新操作 cookie信息刷新有用
7). driver.close() # 关闭当前主窗口(主窗口:默认启动哪个界面,就是主窗口)
8). driver.quit() # 关闭由driver对象启动的所有窗口
9). driver.title # 获取当前页面title信息
10). drive.current_url # 获取当前页面url信息
2.2 提示:
driver.title 和 driver.current_url 没有括号,应用场景:一般为判断上步操作是否执行成功。
driver.maximize_window() # 一般为我的前置代码,在获取driver后,直接编写最大化浏览器
driver.refresh() 应用场景,在后面的cookie章节会使用到。 cookie信息刷新有用
driver.close()与driver.quit()区别:
close():关闭当前主窗口
quit():关闭由driver对象启动的所有窗口
提示:如果当前只有1个窗口,close与quit没有任何区别。