一、.业务全流程操作
二、.selenium学习
1.selenium基础
#web自动自动化基本代码
#1.导入模块,导包
from selenium import webdriver
from time import sleep
#2.实例化浏览器对象:类名()
driver = webdriver.Chrome()
#driver = webdriver.Firefox() #火狐会生成一个log日志文件,不用管
#3.打开网页,必须包含协议头
driver.get('http://www.baidu.com')
#4.观察效果,等3秒
sleep(3)
#5.关闭页面
driver.quit()
2.id定位
'''
# 实现需求
# 需求:打开注册A.html⻚页⾯面,完成以下操作
# id ⽅方法: 通过⽬目标元素的 id 属性值定位, 由于 id 值⼀一般是唯⼀一的,
# 因此当元素存在 id 属性值时, 优先使⽤用 id ⽅方法定位元素
'''
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
# 1).使⽤用id定位,输⼊入⽤用户名:admin,输⼊入⽅方法: 元素对象.send_keys('内容')
username = driver.find_element(By.ID,'userA')
username.send_keys('admin')
# 2).使⽤用id定位,输⼊入密码:123456
password = driver.find_element(By.ID,'passwordA')
password.send_keys('123456')
# 3).3秒后关闭浏览器器窗口
sleep(3)
#关闭
driver.quit()
3.name定位
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
# 实现需求
# 需求:打开注册A.html页面,完成以下操作
# name 方法:由于元素的 name 属性值可能存在重复, 必须确定其能够代表目标元素唯一性才行
# 注意: 当页面内有多个元素的特征值是相同的时候, 定位元素的方法执行时, 默认只会获取第一个符合要求的特征对应的元素
# 1).使用name定位用户名,输⼊入:admin
username = driver.find_element(By.NAME,'userA')
username.send_keys('hetunbaobao')
password = driver.find_element(By.NAME,'passwordA')
password.send_keys('112233')
sleep(5)
driver.quit()
#浏览器F12开发者工具界面内ctrl+f 查找,确定唯一值
4.class_name定位
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
# 实现需求
# 需求:打开注册A.html⻚页面,完成以下操作
# class_name ⽅方法: 由于元素的 class 属性值可能存在重复, 必须确定其能够代表目标元素唯一性之后, 方可使用
# 注意
# 1. ⽅方法名是 class_name, 但要找元素的 class 属性值
# 2. 如果元素的 class 属性值存在多个值, 在 class_name 方法使用时, 只能使用其中的任意一个,
# 1).通过class_name定位电话号码A,并输⼊入:18611111111
phonenumber = driver.find_element(By.CLASS_NAME,'telA')
phonenumber.send_keys('186111111')
# 2).通过class_name定位电⼦子邮箱A,并输⼊入:123@qq.com
# mail = driver.find_element_by_class_name('emailA dzyxA') # 错误样例例
# mail = driver.find_element_by_class_name('emailA') # 正确样例例
email = driver.find_element(By.CLASS_NAME,'emailA')
email.send_keys('1211@qq.com')
sleep(5)
driver.quit()
5.tag_name定位
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
# 实现需求
# 需求:打开注册A.html页面,完成以下操作
# tag_name ⽅方法: 由于页面内可能存在大量重复的标签名, 因此必须确定其能够代表目标元素唯一性之后, 方可使用
# 注意: 由于标签名的重复性过高, 一般做精确定位时, 都不会选择 tag_name方法
# 说明: 如果目标元素对象在后续的代码中只使用一次, 也可以直接在定位元素结束后, 直接调用输入方法实现操作
# 1).使⽤用tag_name定位用户名输入框,并输入:admin
username = driver.find_element(By.TAG_NAME,'input')
username.send_keys('admin')
sleep(5)
driver.quit()
6.link_text定位和partial_link_text定位
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
# 1).使⽤用link_text定位(访问 新浪 ⽹网站)超链接,并点击
# link_text 方法: 该方法只针对超链接元素(a 标签), 并且需要输入超链接的全部文本信息
# 点击方法: 元素对象.click()
# driver.find_element_by_link_text('访问 新浪 网站').click()
# partial_link_text 方法: 该方法只针对超链接元素(a 标签), 并且只需要输入超链接的部分文本信息
# driver.find_element_by_partial_link_text('访问').click()
# 注意: 虽然是只传入部分文本信息, 但是需要确定其唯一性, 方可以使用
#driver.find_element(By.LINK_TEXT,'新浪').click() #全名
driver.find_element(By.PARTIAL_LINK_TEXT,'访问').click() #部分
sleep(5)
driver.quit()
7.定位一组元素
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
# 注意: 元素定位方法如果带有 s,element变成elements 则执行结果返回的是列表类型数据, 里面的数据是多个元素对象
username = driver.find_elements(By.TAG_NAME,'input')
username[0].send_keys('hetunbaobao')
username[1].send_keys('hetunbaobao1')
username[21].send_keys('hetunbaobao21')
print(len(username))
print(type(username))
sleep(5)
driver.quit()
8.XPath定位(绝对路径和相对路径)
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
'''
说明:
绝对路径: 从最外层元素到指定元素之间所有经过元素层级的路径
1). 绝对路路径以/html根节点开始,使⽤用/来分隔元素层级;
如: /html/body/div/fieldset/p[1]/input
2). 绝对路径对页面结构要求比较严格,不建议⽤用
相对路径: 匹配任意层级的元素,不限制元素的位置
1). 相对路径以//开始
2). 例如: //input 或者 //*
'''
#driver.find_element(By.XPATH,'/html/body/div/fieldset/form/p[1]/input')
driver.find_element(By.XPATH,'//*[@id="userA"]').send_keys('hetunbaobao')
9.XPth定位(元素属性)
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
# 利⽤用元素属性策略: 该方法可以使目标元素的任意一个属性和属性值(需要保证唯一性)
# 语法1: //标签名[@属性名="属性值"] 这不就是相对路径??
# 语法2: //*[@属性名="属性值"] 这不就是相对路径??,后面还可以加路径 /input
# 需求:打开注册A.html页面,完成以下操作
# 1).利⽤用元素的属性信息精确定位⽤用户名输⼊入框,并输⼊入:admin
# 注意: 使⽤用 XPath 策略, 需要在浏览器⼯工具中根据策略语法, 组装策略值,验证后再放入代码中使用
driver.find_element(By.XPATH,'//*[@ID="userA"]').send_keys('hetunbaobao')
# 注意: 与 class_name 方法不同的是, 如果使用具有多个值的 class 属性,则需要传入全部的属性值!
driver.find_element(By.XPATH,'//*[@class="emailA dzyxA"]').send_keys('123@qq.com')
#多个属性值精准定位一个元素
# 属性和逻辑集合: 解决目标元素单个属性和属性值无法定位为⼀一个元素的问题时使用
# 语法: //*[@属性1="属性值1" and @属性2="属性值2"]
# 注意: 多个属性值由 and 连接, 每一个属性都要由@开头, 可以根据需求使用更多属性值
# 需求:打开注册A.html页面,完成以下操作
# 1).使⽤用属性与逻辑结合定位策略,在test1对应的输⼊入框里里⼊入:admin
driver.find_element(By.XPATH,'//*[@name="user" and @class="login"]').send_keys('123321')
#//*[contains(@属性名,'属性值的部分内容')] : 通过给定属性值的任意部分内容进行元素定位
driver.find_element(By.XPATH,'//*[contains(@id,"or")]').send_keys('33662')
# //*[starts-with(@属性名,'属性值的开头部分内容')] : 通过给定属性值的开头部分内容进行元素定位
driver.find_element(By.XPATH,'//*[starts-with(@id,"te")]').send_keys('13800001111')
sleep(2)
# //*[text()="文本信息"] : 通过文本信息定位目标元素(要求全部文本内容)
driver.find_element(By.XPATH,'//*[text()="访问 新浪 网站"]').click()
sleep(4)
driver.quit()
10.CSS定位
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
'''
通过 CSS 的选择器语法定位元素
注意:
1. Selenium 框架官⽅方推荐使⽤用CSS, 因为其定位效率远⾼高于XPath
2. CSS 选择器策略也有很多, 但是⽆无论哪⼀个策略使用的都是同一个定位方法
'''
'''
id选择器: #id
class选择器: .class (需要全部属性)
'''
driver.find_element(By.CSS_SELECTOR,'#userA').send_keys('222')
driver.find_element(By.CSS_SELECTOR,'.telA').send_keys('222')
'''
属性选择器: [属性名="属性值"]
元素选择器: 标签名
'''
driver.find_element(By.CSS_SELECTOR,'[placeholder="请输入密码"]').send_keys('123456')
driver.find_element(By.CSS_SELECTOR,'button').click()
#CSS层级选择器:没看懂,以后用到再说
# 标签名[属性名^="属性值开头部分内容"] : 根据给出的属性值开头部分内容定位元素
driver.find_element(By.CSS_SELECTOR,'[id^="pas"]').send_keys('123')
# 标签名[属性名$="属性值结尾部分内容"] : 根据给出的属性值结尾部分内容定位元素
driver.find_element(By.CSS_SELECTOR,'[id$="rdA"]').send_keys('123')
11.元素_浏览器操作
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('file:///F:/BaiduNetdiskDownload/09%20UI%E8%87%AA%E5%8A%A8%E5%8C%96%E8%A7%86%E9%A2%91%E9%85%8D%E5%A5%97%E7%AC%94%E8%AE%B0(1)/UI%E8%87%AA%E5%8A%A8%E5%8C%96/day01_UI%20%E8%87%AA%E5%8A%A8%E5%8C%9601/01_%E8%B5%84%E6%96%99/page/%E6%B3%A8%E5%86%8CA.html')
'''
元素操作
.click() 点击
send_keys(value) 输入
.clear 清空 在使⽤用操作中, ⼀一般对于输入框元素, 都要先执⾏清空, 再执⾏输入,避免操作错误
'''
#Part1: 设置最⼤大化/⼤大⼩小/位置
driver.maximize_window() #浏览器窗口最大化
driver.set_window_size(200,300) #设置浏览器窗口大小(像素),场景: 查看页面是否可以自适应(Web 和 APP 端切换)时使用
driver.set_window_position(200,700) #设置浏览器窗口在屏幕中的位置,屏幕左上角为原点,横向X轴,纵向Y轴
driver.maximize_window()
#Part2: 后退/前进/刷新
driver.find_element(By.ID,'userA').send_keys('2233')
#sleep(4)
buttons = driver.find_elements(By.TAG_NAME,'button')
buttons[0].click()
#sleep(1)
driver.back() #后退
#sleep(1)
driver.forward() #前进
#sleep(1)
driver.back()
#sleep(1)
driver.refresh()
#sleep(1)
#Part3: 关闭/退出/获取页面标题和 URL 地址
driver.find_element(By.LINK_TEXT,'访问 新浪 网站').click()
title = driver.title #获取页面title
utl = driver.current_url #获取当前页面url
print(title)
print(utl)
driver.close() #关闭当前窗口
driver.quit() #关闭浏览器
12.明日计划,selenium浏览器操作剩余内容