target
- 下拉选择框——seleuim有专门的类
- 弹出框
- 滚动条操作
- frame 表单切换
- 多窗口切换
- 窗口截图
- 验证码处理
下拉选择框
css 里的option选择框
css
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
url = r"D:\xxx"
driver.get(url)
"""
目标: 默认北京A
暂停2秒
1. 定位 A上海
2. 暂停2秒
3. 定位 A广州
"""
"""方式1:使用CSS定位"""
sleep(2)
# 使用css定位来操作 A上海
driver.find_element_by_css_selector("[value='sh']").click()
sleep(2)
# 使用css定位 A广州
driver.find_element_by_css_selector("[value='gz']").click()
# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()
select 选择框,三种方法
- 下标访问
- value 值访问
- 显示文本切换
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
from selenium.webdriver.support.select import Select
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
url = r"D:\web自动化素材\课堂素材\注册A.html"
driver.get(url)
"""
目标: 使用Select类实现操作option选项
需求:
暂停2秒
1. 定位 A上海
2. 暂停2秒
3. 定位 A广州
步骤:
1. 导包 Select类
2. 获取Select对象
匿名:Select(element).select_by_index() # 通过下标
实名:select = Select(element)
调用:select.select_by_index()
注意:
1. Select类是通过select标签来控制其下的option元素
2. element:只能是select标签
"""
"""方式2:使用Select完成需求"""
el = driver.find_element_by_css_selector("#selectA")
sleep(2)
"""通过 下标形式访问"""
# 切换 上海
# Select(el).select_by_index(1)
# sleep(2)
# Select(el).select_by_index(2)
"""通过 value值形式访问"""
# 获取Select引用对象
# sel = Select(el)
# 切换 上海
# sel.select_by_value("sh")
# sleep(2)
# 切换 广州
# sel.select_by_value("gz")
"""通过 显示文本切换"""
sleep(2)
# 切换 上海
Select(el).select_by_visible_text("A上海")
sleep(2)
# 切换广州
Select(el).select_by_visible_text("A广州")
# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()
为什么使用select 类?
如果 option 选项没有 value 值的话, css 定位或者其他定位就不太方便
方法:
- 导包 :
from selenium.webdriver.support.select import Select
- 实例化
s = Select(element)
- 调用方法
s.select_by_index()
调用方法有三种:
索引、value值、显示文本
注意
- 实例化 select 类的时候,需要参数为 select 标签元素
- 调用Select 类下面的方法,是通过 索引 、value值、显示文本 来控制的,不需要click
弹出框—— driver.switch_to.alert
网页中常用的弹出框有三种
- alert 警告框
- confirm 确认框
- prompt 提示框
弹出框不处理的话,接下来的操作就不会生效
需求:打开注册A.html页面,完成以下操作:
1).点击 alert 按钮
2).关闭警告框
3).输入用户名:admin
1. 按钮被点击后弹出警告框,而接下来输入用户名的语句没有生效
2. 什么问题导致的?
3. 如何处理警告框?
说明:Selenium中对处理弹出框的操作,有专用的处理方法;并且处理的方法都一样
1. 获取弹出框对象
alert = driver.switch_to.alert
2. 调用
alert.text --> 返回alert/confirm/prompt中的文字信息
alert.accept() --> 接受对话框选项
alert.dismiss() --> 取消对话框选项
# 定位alerta按钮
driver.find_element_by_id("alerta").click()
# 获取警告框
alert = driver.switch_to.alert
# 注意:要打印弹出文本的话,需要在后面写上后续操作
# 获取文本 ,没有括号
# 打印警告框文本
print(alert.text)
# 接受警告框
alert.accept()
# 取消警告框
# alert.dismiss()
滚动条
滚动条:一种可控制页面显示范围的组件
作用:
1. 在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载
2. 页面注册同意条款,需要滚动条到最底层,才能点击同意
实现方式
说明:selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的。
需求:打开注册页面A,暂停2秒后,滚动条拉到最底层
# 最底层
# 第一步: 设置 js 控制滚动条语句 左边距 上边距
# 第二部:调用执行 js 语句方法
js1 = "window.scrollTo(0,10000)"
driver.execute_script(js1)
# 最顶层
js2 = "window.scrollTo(0,0)"
driver.execute_script(js2)
- JavaScript如何控制滚动条?——
js1 = "window.scrollTo(0,10000)"
- Selenium执行JavaScript脚本的方法?——
driver.execute_script(js1)
frame切换—— 重要
常用的 frame 表单—— frame 和 iframe
不切换到话,当前主目录 没有 iframe 表单页面元素信息 ,不切换的话,找不到元素
frame:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素;
形式一:[了解]
<frameset cols="25%,75%">
<frame src="frame_a.htm">
<frame src="frame_b.htm">
</frameset>
形式二:
<iframe name="iframe_a" src="demo_iframe.htm" width="200" height="200"></iframe>
案例:打开‘注册实例.html’页面,完成以下操作
1). 填写主页面的注册信息
2). 填写注册页面A中的注册信息
3). 填写注册页面B中的注册信息
问题
1. 当前页面内无法定位注册页面A和注册页
说明:在Selenium中封装了如何切换frame框架的方法
方法:
1). driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法
frame_reference:可以为frame框架的name、id或者定位到的frame元素
2). driver.switch_to.default_content() --> 恢复默认页面方法
在frame中操作其他页面,必须先回到默认页面,才能进一步操作
解决方法:
- 完成主页面注册信息;
- 调用frame切换方法(switch_to.frame(“myframe1”))切换到注册用户A框架中
- 调用恢复默认页面方法(switch_to.default_content())
- 调用frame切换方法(switch_to.frame(“myframe2”))切换到注册用户B框架中
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
# driver.implicitly_wait(30)
# 打开url
url = r"xxx"
driver.get(url)
"""
目标: 为什么要切换frame表单
需求:
1. 打开注册实例.html
2. 填写主页面 页面信息
3. 填写注册A 页面信息
4. 填写注册B 页面信息
"""
"""填写主页面"""
# 用户名
driver.find_element_by_css_selector("#user").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#password").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".tel").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#email").send_keys("123@qq.com")
# 切换到注册A 使用name
# driver.switch_to.frame("myframe1")
# 使用id
driver.switch_to.frame("idframe1")
"""填写注册A"""
# 用户名
driver.find_element_by_css_selector("#userA").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#passwordA").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".telA").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#emailA").send_keys("123@qq.com")
# 切换到默认目录—— 因为 A 页面,没有frame 表单,所以需要切换
driver.switch_to.default_content()
# 切换到注册B 使用name
# driver.switch_to.frame("myframe2")
# 使用元素切换
driver.switch_to.frame(driver.find_element_by_css_selector("[name='myframe2']"))
"""填写注册B"""
# 用户名
driver.find_element_by_css_selector("#userB").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#passwordB").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".telB").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#emailB").send_keys("123@qq.com")
# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()
xx:
1.HTML中常用的frame框架——frame 和 iframe
2. 切换框架的方法—— driver.switch_to.frame("idframe1")
3. 恢复到默认页面的方法—— driver.switch_to.default_content()
4. 切换 frame 时 ,可以使用 name id iframe 元素
多窗口切换
在HTML页面中,当点击超链接或者按钮时,有的会在新的窗口打开页面。
案例:
需求:打开 ‘注册实例.html’ 页面,完成以下操作
1). 点击 ‘注册A页面’ 链接
2). 在打开的页面中,填写注册信息
实现多窗口切换的方法:
三个:
说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;
句柄:英文handle,窗口的唯一识别码
方法:
1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口
- 获取‘注册实例.html’当前窗口句柄
- 点击‘注册实例.html’页面中注册A页面
- 获取所有窗口句柄
- 获取注册A页面对应的窗口句柄,并切换
- 操作注册A页面元素
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
# driver.implicitly_wait(30)
# 打开url
url = r"D:\web自动化素材\课堂素材\注册实例.html"
driver.get(url)
"""
目标: 切换窗口
需求:
1. 打开注册实例.html
2. 点击 注册A网页
3. 填写 注册A网页 内容
"""
# 获取当前窗口句柄 -->目的:判断只要不是当前主窗口句柄,就一定时新开的窗口句柄
current_handle = driver.current_window_handle
print("当前窗口句柄为:", current_handle)
# 点击注册A网页
driver.find_element_by_partial_link_text("A网页").click()
# 获取所有窗口句柄
handles = driver.window_handles
print("所有窗口句柄:", handles)
# 判断 不是 当前窗口句柄
for h in handles:
if h != current_handle:
# 切换
driver.switch_to.window(h)
"""填写注册A"""
# 用户名
driver.find_element_by_css_selector("#userA").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#passwordA").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".telA").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#emailA").send_keys("123@qq.com")
# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()
总结;
- 什么是句柄?
- 获取当前窗口句柄方法
- 获取所有窗口句柄方法
- 切换指 定句柄窗口方法
截屏
把当前操作的页面,截图保存到指定位置
窗口截图是因为,自动化脚本是由程序去执行的,有时候打印的错误信息并不是十分明确,如果在执行出错的时候对当前窗口截图保存,那么图片就可以直观的看到出错的原因
方法:driver.get_screenshot_as_file(imgpath)
——imgpath 是图片保存的路径
# 导包
import time
from time import strftime
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
url = r"D:\web自动化素材\课堂素材\注册A.html"
driver.get(url)
"""
目标: 截屏
方法:
driver.get_screenshot_as_file()
需求:
1. 输入用户名
2. 截图 当前目录下 admin.png
"""
# 输入 admin
driver.find_element_by_css_selector("#userA").send_keys("admin")
# 调用截图方法
# driver.get_screenshot_as_file("./admin.png")
# 存放指定目录
# driver.get_screenshot_as_file("../scripts/admin02.png")
# driver.get_screenshot_as_file("../image/admin.png")
# 动态获取文件名称 使用时间戳
# driver.get_screenshot_as_file("../image/%s.png"%(time.strftime("%Y_%m_%d %H_%M_%S")))
# driver.get_screenshot_as_file("../image/%s.jpg"%(time.strftime("%Y_%m_%d %H_%M_%S")))
driver.get_screenshot_as_file("../image/%s.jpg"%(strftime ("%Y_%m_%d %H_%M_%S")))
# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()
验证码
一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性。
学习验证码的目的:在Web应用中,大部分系统在用户登录注册的时候都要求输入验证码,而我们在设计自动化测试脚本的时候,
就需要面临处理验证码的问题。
面试问题:验证码处理方式:
答:说明:Selenium中并没有对验证码处理的方法,在这里我们介绍一下针对验证码的几种常用处理方式
方式:
1). 去掉验证码 (测试环境下-采用,公司自己的项目)
2). 设置万能验证码 (生产环境和测试环境下-采用)
3). 验证码识别技术 (通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)
4). 记录cookie (通过记录cookie进行跳过登录)
cookie
1. Cookie是由Web服务器生成的,并且保存在用户浏览器上的小文本文件,它可以包含用户相关的信息。
2. Cookie数据格式:键值对组成(python中的字典)
3. Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie
数据
4. Cookie使用:当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务
器检
查该Cookie,以此来辨认用户状态。
cookie的应用场景
1. 实现会话跟踪,记录用户登录状态
2. 实现记住密码和自动登录的功能
3. 用户未登录的状态下,记录购物车中的商品
Selenium操作cookie
说明:Selenium中对cookie操作提供相应的方法
方法:
cookie 的返回结果是一个 列表
1. get_cookie(name) --> 获取指定cookie
name:为cookie的名称
2. get_cookies() --> 获取本网站所有本地cookies
3. add_cookie(cookie_dict) --> 添加cookie
cookie_dict:一个字典对象,必选的键包括:"name" and "value"
需求:使用cookie实现跳过登录
1). 手动登录百度,获取cookie
2). 使用获取到的cookie,达到登录目的,然后就可以执行登录之后的操作
BDUSS是登录百度后的唯一身份凭证(*.baidu.com),拿到BDUSS就等于拿到帐号的控制权,
通行贴吧、知道、百科、文库、空间、百度云等百度主要产品。
1. 登录baidu,登录成功后抓取 (BDUSS)
2. 使用add_cookie()方法,添加 (BDUSS)键和值
3. 调用刷新方法 driver.refresh()
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.add_cookie({'name':'BDUSS','value':'根据实际填写'})
time.sleep(3)
driver.refresh()
time.sleep(3)
driver.quit()