笔记:web自动化测试(selnium元素操作,浏览器操作,鼠标键盘操作,其它)(黑马)

目录

    1. 元素操作

   2. 浏览器常用操作API

 3. 元素操作其他常用操作API

4. 鼠标及键盘操作

 5. 元素等待【重点】

使用send_keys方法上传文件

6.其他功能   

 6.1下拉框选择

6.2 弹窗框处理

6.3滚动条操作

6.4frame表单切换、多窗口切换(重要)

6.5窗口截图、验证码处理


    1. 元素操作

1.1 为什么要学习操作元素的方法?

1. 需要让脚本模拟用户给指定元素输入值

2. 需要让脚本模拟人为删除元素的内容

3. 需要让脚本模拟点击操作

1.2 元素常用操作方法

1. click()            单击元素
2. send_keys(value)   模拟输入
3. clear()            清除文本

1.3 案例

需求:打开注册A页面,完成以下操作
1).通过脚本执行输入用户名:admin;密码:123456;电话号码:18611111111;电子邮件:123@qq.com
 2).间隔3秒,修改电话号码为:18600000000
 3).间隔3秒,点击‘注册’按钮
4).间隔3秒,关闭浏览器
5).元素定位方法不限

先看看注册A页面

代码:



# 导包
from selenium import webdriver
from time import sleep


# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 注册A.html
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 使用find_element()定位用户名
driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[1]/input").send_keys("admin") # type: ignore
# 使用find_element()定位密码
driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[2]/input").send_keys("123456")
# 电话号码
driver.find_element(By.XPATH, "//*[@id='telA']").send_keys("18611111111")
# 电子邮箱
driver.find_element(By.XPATH, "//*[@id='emailA']").send_keys("123@qq.com")

# 暂停 3秒
sleep(3)
# 清除电话号码
driver.find_element(By.XPATH, "//*[@id='telA']").clear()
# 重新写电话号码
driver.find_element(By.XPATH, "//*[@id='telA']").send_keys("18600000000")

# 暂停 3秒
sleep(3)
# 点击注册按钮
driver.find_element(By.XPATH, "/html/body/form/div/fieldset/button").click() 


# 暂停 3秒
sleep(3)
# 退出浏览器驱动
driver.quit()

   2. 浏览器常用操作API

脚本启动浏览器窗口大小默认不是全屏? 如何刷新页面?

通过调用Selenium的API来实现浏览器的操作

2.1 操作浏览器常用方法

1. maximize_window()                最大化浏览器窗口 --> 模拟浏览器最大化按钮
2. set_window_size(width, height)   设置浏览器窗口大小 --> 设置浏览器宽、高(像素点)
 3. set_window_position(x, y)        设置浏览器窗口位置 --> 设置浏览器位置
4. back()                           后退 --> 模拟浏览器后退按钮
5. forward()                        前进 --> 模拟浏览器前进按钮
6. refresh()                        刷新 --> 模拟浏览器F5刷新
7. close()                          关闭当前窗口 --> 模拟点击浏览器关闭按钮
8. quit()                           关闭浏览器驱动对象 --> 关闭所有程序启动的窗口
9. title                            获取页面title
10. current_url                     获取当前页面URL

代码示例:


# 导包
from selenium import webdriver
from time import sleep

# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 网页
url = r"https://www.csdn.net/"
driver.get(url)

# 最大化浏览器
driver.maximize_window()

 # 刷新
driver.refresh()

# 暂停 2秒
sleep(2)

 # 后退
driver.back()

# 暂停 2秒
sleep(2)

 # 前进
driver.forward()

# 暂停 2秒
sleep(2)

# 点击页面
driver.find_element(By.XPATH, "//*[@id='floor-www-index_558']/div/div[3]/div[1]/div[2]/div[2]/div[2]/div/div[2]/a[1]").click() 

# 暂停 4秒
sleep(4)

 # 设置浏览器大小
driver.set_window_size(300,300)

# 暂停 2秒
sleep(2)
 # 设置浏览器位置
driver.set_window_position(300,200)

 # 获取title
title = driver.title
 # 获取当前页面url
url = driver.current_url

print(title)
print(url)

# 暂停 2秒
# sleep(2)
 # 关闭浏览器单个窗口
# driver.close()

# 暂停 2秒
sleep(2)
 # 关闭浏览器所有窗口
driver.quit()

# 暂停 2秒
# sleep(2)

# 退出浏览器驱动
driver.quit()

2.2 提示:
        1. driver.title 和 driver.current_url 没有括号,应用场景:一般为判断上步操作是否执行成功。
        2. driver.maximize_window() # 一般为我的前置代码,在获取driver后,直接编写最大化浏览器
        3. driver.refresh() 应用场景,在后面的cookie章节会使用到。
        4. driver.close()与driver.quit()区别:
            close():关闭当前主窗口
            quit():关闭由driver对象启动的所有窗口
            提示:如果当前只有1个窗口,close与quit没有任何区别。

 3. 元素操作其他常用操作API

1. 如何获取元素的文本?
2. 如何获取元素属性值?
3. 如何让程序判断元素是否为可见状态?
我们想解决以上问题,就需要学习Selenium封装的获取元素信息的方法

3.2 获取元素信息的常用方法

1. size                 返回元素大小
2. text                 获取元素的文本
3. get_attribute("xxx") 获取属性值,传递的参数为元素的属性名
4. is_displayed()       判断元素是否可见
5. is_enabled()         判断元素是否可用
6. is_selected()        判断元素是否选中,用来检查复选框或单选按钮是否被选中
提示:
    1. size、text:为属性,调用时无括号;如:xxx.size

一般自动化脚本tezt方法用于判断(重要)

代码示例:

"""需求:使用‘注册A.html’页面,完成以下操作:
1).获取用户名输入框的大小
2).获取页面上第一个超链接的文本内容
3).获取页面上第一个超链接的地址
4).判断页面中的span标签是否可见
5).判断页面中取消按钮是否可用
6).判断页面中'旅游'对应的复选框是否为选中的状态"""



# 导包
from selenium import webdriver
from time import sleep

# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# 获取 浏览器驱动对象
# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 注册A.html
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 获取用户名输入框的大小
size_1=driver.find_element(By.XPATH, "//p[@id='p1']/input").size 

print(size_1)

# 获取页面上第一个超链接的文本内容
text_1=driver.find_element(By.XPATH, "//*[@id='fwA']").text

print(text_1)

# 获取页面上第一个超链接的地址
tget_a=driver.find_element(By.XPATH, "//*[@id='fwA']").get_attribute("href")

print(tget_a)

# 判断页面中的span标签是否可见
is_d=driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[5]/span").is_displayed()  
print(is_d)
# 判断页面中取消按钮是否可用
is_e=driver.find_element(By.XPATH, "//*[@id='cancelA']").is_enabled() 
print(is_e)

# 判断页面中'旅游'对应的复选框是否为选中的状态
is_s=driver.find_element(By.XPATH, "//*[@id='lyA']").is_selected() 
print(is_s)
# 暂停2秒
sleep(2)


# # 使用逻辑结合
# driver.find_element_by_xpath("//input[@id='passwordA' and @placeholder='密码A']").send_keys("123")
# # 暂停 3秒
# sleep(3)
# 退出浏览器驱动
driver.quit()

运行结果

提示: 
        1. text和size调用时 无括号
        2. get_attribute一般应用场景:判断一组元素是否为想要的元素或者判断元素属性值是否正确
        3. is_displayed、is_enabled、is_selected,在特殊应用场景中使用。

4. 鼠标及键盘操作

鼠标操作:

说明:在Selenium中将操作鼠标的方法封装在ActionChains类中
实例化对象:
    action = ActionChains(driver)
方法:
    1. context_click(element)          右击 --> 模拟鼠标右键点击效果
    2. double_click(element)           双击 --> 模拟鼠标双击效果
    3. drag_and_drop(source, target)   拖动 --> 模拟鼠标拖动效果
    4. move_to_element(element)        悬停 --> 模拟鼠标悬停效果
    5. perform()                       执行 --> 此方法用来执行以上所有鼠标操作
为了更好的学习其他方法,我们先学习perform()执行方法,因为所有的方法都需要执行才能生效

 提示: 
        1. selenium框架中虽然提供了,右击鼠标方法,但是没有提供选择右击菜单方法,可以通过发送快捷键的方式解决(经测试,谷歌浏览器不支持)。

案例:


# 导包
from selenium import webdriver
from time import sleep

# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# 获取鼠标操作对象
from selenium.webdriver.common.action_chains import ActionChains
# 获取 浏览器驱动对象
# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 注册A.html
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

action = ActionChains(driver)

# 鼠标右键
# # 需求:打开注册页面A,在用户名文本框上点击鼠标右键
# element = driver.find_element(By.ID, "userA") 
# action.context_click(element).perform()  

# 鼠标双击
# # 需求:打开注册页面A,输入用户名admin,暂停3秒钟后,双击鼠标左键,选中admin
# element = driver.find_element(By.ID, "userA") 
# element.send_keys("admin")
# action.double_click(element).perform()  

# 鼠标拖动
# 打开‘drop.html’页面,把红色方框拖拽到蓝色方框上
# url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\drop.html"
# driver.get(url)
# action = ActionChains(driver)
# #  源元素   
# source = driver.find_element(By.XPATH, "//*[@id='div1']")
# #  目标元素 
# target = driver.find_element(By.XPATH, "//*[@id='div2']")
# # 调用方法 
# action.drag_and_drop(source, target).perform()


# 鼠标悬停
# 打开注册页面A,模拟鼠标悬停在‘注册’按钮上
element = driver.find_element(By.XPATH, "/html/body/form/div/fieldset/button") 
action.move_to_element(element).perform() 



# 暂停2秒
sleep(2)

# 退出浏览器驱动
driver.quit()

键盘操作:

1. send_keys(Keys.BACK_SPACE)     删除键(BackSpace) 
2. send_keys(Keys.SPACE)          空格键(Space)
 3. send_keys(Keys.TAB)            制表键(Tab)
 4. send_keys(Keys.ESCAPE)         回退键(Esc) 
5. send_keys(Keys.ENTER)          回车键(Enter) 
6. send_keys(Keys.CONTROL,'a')    全选(Ctrl+A) 
7. send_keys(Keys.CONTROL,'c')    复制(Ctrl+C)
提示:以上方法就不一个一个讲解了,因为调用方法都一样;


        组合键:element.send_keys(Keys.XXX, 'a')
        单键:element.send_keys(Keys.XXX)

案例:

"""
需求:打开注册A页面,完成以下操作
1). 输入用户名:admin1,暂停2秒,删除1
 2). 全选用户名:admin,暂停2秒
3). 复制用户名:admin,暂停2秒
4). 粘贴到密码框
"""
# 导包
from selenium import webdriver
from time import sleep

# 键盘
from selenium.webdriver.common.keys import Keys
# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By
# 获取 浏览器驱动对象
# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 注册A.html
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 定位用户名
element = driver.find_element(By.XPATH, "//*[@id='userA']") 
 # 输入用户名
element.send_keys("admin1")
# 暂停2秒
sleep(2)
 # 删除1
element.send_keys(Keys.BACK_SPACE)
 # 全选
element.send_keys(Keys.CONTROL, 'a')
# 暂停2秒
sleep(2)
 # 复制
element.send_keys(Keys.CONTROL, 'c')
# 暂停2秒
sleep(2)

# 粘贴
driver.find_element(By.XPATH, "//*[@id='passwordA']").send_keys(Keys.CONTROL, 'v')

# 暂停2秒
sleep(2)
# 退出浏览器驱动
driver.quit()

 5. 元素等待【重点】

什么是元素等待?

概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程;

为什么要设置元素等待?

1. 网络速度慢

2. 电脑配置低

3. 服务器处理请求慢

元素等待类型
1. 隐式等待
2. 显式等待

隐式等待

概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该元 素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出元素 不存在的异常 NoSuchElementException 。

特色:
            1. 针对所有元素生效。
            2. 一般情况下为前置必写代码(1.获取浏览器驱动对象;2. 最大化浏览器;3. 设置隐式等待)

实现方式

方法:driver.implicitly_wait(timeout)
 (timeout:为等待最大时长,单位:秒)
说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)

案例

""""
需求:打开页面,完成以下操作
1).使用隐式等待定位用户名输入框,如果元素存在,就输入admin
"""

# 导包
from selenium import webdriver
from time import sleep


# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 注册A.html
url = r"https://www.csdn.net/"
driver.get(url)

# 隐式等待  3秒
driver.implicitly_wait(30)

# 输入
driver.find_element(By.XPATH, "//*[@id='toolbar-search-input']").send_keys("admin") 

# 暂停 3秒
sleep(3)
# 退出浏览器驱动
driver.quit()

显式等待

概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该 元素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出超 时异常 TimeoutException 。

实现方式

1. 导包 等待类  --> from selenium.webdriver.support.wait import WebDriverWait
 2. WebDriverWait(driver, timeout, poll_frequency=0.5)
 1). driver:浏览器驱动对象
2). timeout:超时的时长,单位:秒
3). poll_frequency:检测间隔时间,默认为0.5秒
3. 调用方法 until(method):直到...时
1). method:函数名称,该函数用来实现对元素的定位
2). 一般使用匿名函数来实现:lambda x: x.find_element_by_id("userA")
 4. element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA")
 )

在移动端测试中显示等待特别重要(因为有poll_frequency=0.5))因为app消息框经常一闪而逝。

案例:

"""
需求:打开页面,完成以下操作
1).使用隐式等待定位输入框,如果元素存在,就输入admin
"""

import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

# 打开 注册A.html
url = r"https://www.csdn.net/"
driver.get(url)

# 用匿名函数传参,x就是driver
element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element(By.XPATH,"//*[@id='toolbar-search-input']"))
element.send_keys("admin")

# 暂停 3秒
time.sleep(3)
# 退出浏览器驱动
driver.quit()

显式与隐式区别

1. 作用域:隐式为全局元素,显式等待为单个元素有效

2. 使用方法:隐式等待直接通过驱动对象调用,而显式等待方法封装在WebDriverWait类中

3. 达到最大超时时长后抛出的异常不同:隐式为NoSuchElementException,显式等待为TimeoutExcepti on

使用send_keys方法上传文件

send_keys("文件路径和文件名")

示例:

"""
在注册A中点击浏览上次文件
使用send_keys方法上传文件
"""
# 导包
from selenium import webdriver
from time import sleep


# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 注册A.html
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 最大化浏览器
driver.maximize_window()

# 上传文件
driver.find_element(By.XPATH,"/html/body/form/div/fieldset/form/input[7]").send_keys(r"C:\Users\Administrator\Desktop\13.txt")

# 暂停 3秒
sleep(3)
# 退出浏览器驱动
driver.quit()

6.其他功能   

 6.1下拉框选择

1.使用css定位下拉框

2.select选择框

Select类

说明:Select类是Selenium为操作select标签特殊封装的。
实例化对象:
    select = Select(element)
        element: <select>标签对应的元素,通过元素定位方式获取,
                 例如:driver.find_element_by_id("selectA")
操作方法:
    1. select_by_index(index)             --> 根据option索引来定位,从0开始
    2. select_by_value(value)             --> 根据option属性 value值来定位
    3. select_by_visible_text(text)       --> 根据option显示文本来定位

案例

"""
需求:使用‘注册A.html’页面,完成对城市的下拉框的操作
1).选择‘广州’
 2).暂停2秒,选择‘上海’
 3).暂停2秒,选择‘北京’
"""

# 导包
from selenium import webdriver
from time import sleep
#导包  Select实现下拉框
from selenium.webdriver.support.select import Select
# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 网页
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 最大化浏览器
driver.maximize_window()

# 隐式等待  10秒
driver.implicitly_wait(10)


select = Select(driver.find_element(By.XPATH,"//*[@id='selectA']"))

select.select_by_index(2)  # 根据索引实现

# 暂停2秒
sleep(2)
select.select_by_value("sh")  # 根据value属性实现

# 暂停2秒
sleep(2)
select.select_by_visible_text("A北京")  # 根据文本内容实现

# 暂停2秒
sleep(2)

# 退出浏览器驱动
driver.quit()

注意事项
            1. 实例化select时,需要的参数为 select标签元素
            2. 调用Select类下面的方法,是通过索引、value属性值、显示文本去控制,而不需要click事件

6.2 弹窗框处理

网页中常用的弹出框有三种
    1. alert    警告框
    2. confirm  确认框
    3. prompt   提示框

弹窗框处理方法:

说明:Selenium中对处理弹出框的操作,有专用的处理方法;并且处理的方法都一样
1. 获取弹出框对象
        alert = driver.switch_to.alert
 2. 调用
        alert.text           --> 返回alert/confirm/prompt中的文字信息
        alert.accept()       --> 接受对话框选项
        alert.dismiss()      --> 取消对话框选项

提示:无论以上哪个对话框,都可以使用取消、同意,因为调用的是后台的事件,根页面显示的按钮数量无关。

案例:

"""
需求:打开注册A.html页面,完成以下操作:
1).点击 alert 按钮
2).关闭警告框
3).输入用户名:admin
"""

# 导包
from selenium import webdriver
from time import sleep
#导包  Select实现下拉框
from selenium.webdriver.support.select import Select
# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 网页
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 最大化浏览器
driver.maximize_window()

# 隐式等待  10秒
driver.implicitly_wait(10)

# 定位alerta按钮
driver.find_element_by_id("alerta").click()
# 暂停2秒
sleep(2)

 # 获取警告框
alert = driver.switch_to.alert
# 暂停2秒
sleep(2)

 # 打印警告框文本
print(alert.text)
 # 接受警告框
alert.accept()
 # 取消警告框
# alert.dismiss()

# 使用find_element()定位用户名
driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[1]/input").send_keys("admin") 

# 暂停2秒
sleep(2)

# 退出浏览器驱动
driver.quit()

6.3滚动条操作

1. 在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载

2. 页面注册同意条款,需要滚动条到最底层,才能点击同意

实现方式:

说明:selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本 的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的。

1. 设置JavaScript脚本控制滚动条
    js = "window.scrollTo(0,1000)"
        (0:左边距;1000:上边距;单位像素)
 2. selenium调用执行JavaScript脚本的方法
    driver.execute_script(js)

执行JS语句用.execute_script方法

案例

"""
需求:打开注册页面A,暂停2秒后,滚动条拉到最底层
"""

# 导包
from selenium import webdriver
from time import sleep
#导包  Select实现下拉框
from selenium.webdriver.support.select import Select
# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 网页
url = r"https://www.csdn.net/"
driver.get(url)

# 最大化浏览器
driver.maximize_window()

# 隐式等待  10秒
driver.implicitly_wait(10)


# 滚动条下拉1000
js1 = "window.scrollTo(0,1000)"
driver.execute_script(js1)
# 暂停2秒
sleep(2)

 # 最顶层
js2 = "window.scrollTo(0,0)"
driver.execute_script(js2)


# 暂停2秒
sleep(2)

# 退出浏览器驱动
driver.quit()

6.4frame表单切换、多窗口切换(重要)

frame切换

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>

frame切换方法

说明:在Selenium中封装了如何切换frame框架的方法
方法:
    1). driver.switch_to.frame(frame_reference)   --> 切换到指定frame的方法
            frame_reference:可以为frame框架的name、id或者定位到的frame元素
    2). driver.switch_to.default_content()        --> 恢复默认页面方法

注意:先回到默认页面,再切换页面,不回到主目录,切换语句会报错

注册实例

案例

"""
案例:打开‘注册实例.html’页面,完成以下操作
1). 填写主页面的注册信息
2). 填写注册页面A中的注册信息
3). 填写注册页面B中的注册信息
(这里就只填账户和密码)
"""

# 导包
from selenium import webdriver
from time import sleep
#导包  Select实现下拉框
from selenium.webdriver.support.select import Select
# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 网页
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册实例.html"
driver.get(url)

# 最大化浏览器
driver.maximize_window()

# 隐式等待  10秒
driver.implicitly_wait(10)


# 默认表单
# 主用户名
driver.find_element(By.XPATH, "//*[@id='user']").send_keys("admin")
# 密码
driver.find_element(By.XPATH, "//*[@id='password']").send_keys("admin")


# 切换到注册用户A框架中
driver.switch_to.frame("myframe1")
# A用户名
driver.find_element(By.XPATH, "//*[@id='userA']").send_keys("admin")
# 密码
driver.find_element(By.XPATH, "//*[@id='passwordA']").send_keys("admin")

# 恢复默认页面方
driver.switch_to.default_content()
# 切换到注册用户B框架中
driver.switch_to.frame("myframe2")
# A用户名
driver.find_element(By.XPATH, "//*[@id='userB']").send_keys("admin")
# 密码
driver.find_element(By.XPATH, "//*[@id='passwordB']").send_keys("admin")


# 暂停2秒
sleep(2)

# 退出浏览器驱动
driver.quit()

多窗口切换

说明:在HTML页面中,当点击超链接或者按钮时,有的会在新的窗口打开页面。

页面存在多个窗口时,seleniu默认焦点只会在主窗口上所有的元素,不切换切换窗口,无法操作除主窗口以外的窗口内元素

如何实现多窗口切换?

说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;
      句柄:英文handle,窗口的唯一识别码
方法:
    1). driver.current_window_handle        --> 获取当前窗口句
    2). driver.window_handles               --> 获取所有窗口句柄
    3). driver.switch_to.window(handle)     --> 切换指定句柄窗口

步骤: 
            1. 获取当前窗口句柄 
            2. 点击链接 启动另一个窗口
            3. 获取当前所有窗口句柄
            4. 遍历所有窗口句柄
            5. 判断当前遍历的窗口句柄不等于当前窗口句柄
            6. 切换窗口操作

案例:

"""
需求:打开‘注册实例.html’页面,完成以下操作
1). 点击‘注册A页面’链接
2). 在打开的页面中,填写注册信息
"""

# 导包
from selenium import webdriver
from time import sleep
#导包  Select实现下拉框
from selenium.webdriver.support.select import Select
# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 网页
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册实例.html"
driver.get(url)

# 最大化浏览器
driver.maximize_window()

# 隐式等待  10秒
driver.implicitly_wait(10)

# 获取当前窗口句柄
handle_1 = driver.current_window_handle

# 暂停2秒
sleep(2)

# 点击注册A窗口
driver.find_element(By.XPATH, "//*[@id='ZCA']").click() 

# 暂停2秒
sleep(2)
# 获取所有窗口句柄
handles = driver.window_handles

# 切换到A窗口
for i in handles:
    if handle_1 != i:
        driver.switch_to.window(i)

        # A用户名
        driver.find_element(By.XPATH, "//*[@id='userA']").send_keys("admin")
        # 密码
        driver.find_element(By.XPATH, "//*[@id='passwordA']").send_keys("admin")

# 暂停2秒
sleep(2)

# 退出浏览器驱动
driver.quit()

6.5窗口截图、验证码处理

窗口截图:

自动化脚本是由程序去执行的,因此有时候打印的错误信息并不是十分明确。如果在执行出错的时候 对当前窗口截图保存,那么通过图片就可以非常直观地看到出错的原因。

说明:在Selenium中,提供了截图方法,我们只需要调用即可
方法:
      driver.get_screenshot_as_file(imgpath)
            imgpath:图片保存路径

案例:

"""
需求:打开‘注册A.html’页面,完成以下操作
1). 填写注册信息
2). 截图保存

"""


# 导包
from selenium import webdriver
import time 
#导包  Select实现下拉框
from selenium.webdriver.support.select import Select
# 获取 浏览器驱动对象
from selenium.webdriver.common.by import By

# driver = webdriver.Firefox()
driver = webdriver.Chrome()

# 打开 网页
url = r"E:\BaiduNetdiskDownload\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"
driver.get(url)

# 最大化浏览器
driver.maximize_window()

# 隐式等待  10秒
driver.implicitly_wait(10)

# 使用find_element()定位用户名
driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[1]/input").send_keys("admin") # type: ignore
# 使用find_element()定位密码
driver.find_element(By.XPATH, "/html/body/form/div/fieldset/p[2]/input").send_keys("123456")

# 截图
# driver.get_screenshot_as_file("./1.png")

# 动态获取文件名,使用时间戳
driver.get_screenshot_as_file("./%s.png"%(time.strftime("%Y_%m_%d %H_%M_%S")))

# 暂停2秒
time.sleep(2)

# 退出浏览器驱动
driver.quit()

扩展:
        1. 多条用例执行失败,会产生多张图片,可以采用时间戳的形式,进去区分。
        操作: 
            driver.get_screenshot_as_file("../image/%s.png"%(time.strftime("%Y_%m_%d %H_%M_%S")))
            strftime:将时间转为字符串函数
    注意:
        %Y_%m_%d %H_%M_%S:代表,年 月 日 时 分 秒

验证码

说明:一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的 安全性。

在Web应用中,大部分系统在用户登录注册的时候都要求输入验证码,而我们在设计自动化测试脚本的时候, 就需要面临处理验证码的问题。

验证码的处理方式

说明:Selenium中并没有对验证码处理的方法,在这里我们介绍一下针对验证码的几种常用处理方式
方式:
    1). 去掉验证码
            (测试环境下-采用)
    2). 设置万能验证码
            (生产环境和测试环境下-采用)
    3). 验证码识别技术
            (通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)
    4). 记录cookie
            (通过记录cookie进行跳过登录)

提示

1. 去掉验证码、设置万能验证码:都是开发来完成,我们在这里不做讲解
2. 验证码识别技术:成功率不高,验证码种类繁多,不太适合
3. 记录cookie:比较实用,我们对它进行下讲解

cookie是什么?

1. Cookie是由Web服务器生成的,并且保存在用户浏览器上的小文本文件,它可以包含用户相关的信息。
2. Cookie数据格式:键值对组成(python中的字典)
3. Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie
数据
4. Cookie使用:当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务
器检
   查该Cookie,以此来辨认用户状态。

cookie 介绍:
        生成:由服务器生成
        作用:标识一次对话的状态(登录的状态)
        使用:浏览器自动记录cookie,在下一条请求时将cookis信息自动附加请求

cookie的应用场景

1. 实现会话跟踪,记录用户登录状态

2. 实现记住密码和自动登录的功能

3. 用户未登录的状态下,记录购物车中的商品

Selenium操作cookie

说明:Selenium中对cookie操作提供相应的方法
方法:
    1. get_cookie(name)               --> 获取指定cookie
            name:为cookie的名称
    2. get_cookies()                  --> 获取本网站所有本地cookies
    3. add_cookie(cookie_dict)        --> 添加cookie
            cookie_dict:一个字典对象,必选的键包括:"name" and "value"

案例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值