测开学习DAY32

黑马程序员网课学习(web自动化)

第二章 Selenium API操作

一、切换frame表单

提示:常用的frame表单有两种:frame、iframe

1. 为什么要切换

当前主目录内没有iframe表单页面元素信息,不切换,找不到元素。

2. 如何切换

方法:driver.switch_to.frame("id\name\element")

3. 为什么要回到主目录

iframe或frame只有在主目录才有相关元素信息,不回到主目录,切换语句会报错。

4. 如何回到主目录

方法:driver.switch_to.default_content()

5. 提示

切换frame时,可以使用name、id、iframe元素

python 复制代码
# 导包
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)


"""
    目标: 为什么要切换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")

# 切换到默认目录
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()

二、多窗口切换

1. 为什么要切换多窗口

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

2. 如何切换

思路:获取要切换的窗口句柄,调用切换方法进行切换。

方法:

  1. driver.current_window_handle # 获取当前主窗口句柄

  2. driver.window_handles # 获取当前由driver启动所有窗口句柄

  3. driver.switch_to.window(handle) # 切换窗口

步骤:

  1. 获取当前窗口句柄

  2. 点击链接 启动另一个窗口

  3. 获取当前所有窗口句柄

  4. 遍历所有窗口句柄

  5. 判断当前遍历的窗口句柄不等于当前窗口句柄

  6. 切换窗口操作

python 复制代码
# 导包
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(imgepath)

参数:

imagepath:为图片要保存的目录地址及文件名称

如: 当前目录 ./test.png

上一级目录 ../test.png

扩展:

  1. 多条用例执行失败,会产生多张图片,可以采用时间戳的形式,进去区分。

操作:

driver.get_screenshot_as_file("../image/%s.png"%(time.strftime("%Y_%m_%d %H_%M_%S")))

strftime:将时间转为字符串函数

注意:

%Y_%m_%d %H_%M_%S:代表,年 月 日 时 分 秒

python 复制代码
# 导包
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()

四、验证码

1. 什么是验证码

一种随机生成信息(文字、数字、图片)

2. 验证码作用

防止恶意请求

3. 验证码处理方式

  1. 去掉验证码(项目在测试环境、公司自己的项目)

  2. 设置万能验证码(测试环境或线上环境,公司自己项目)

  3. 使用验证码识别技术 (由于现在的验证码千奇百怪,导致识别率太低)

  4. 使用cookie解决(推荐)

生成:由服务器生成

作用:标识一次对话的状态(登录的状态)

使用:浏览器自动记录cookie,在下一条请求时将cookis信息自动附加请求

5. 应用

方法:

  1. driver.get_cookies() # 获取所有的cookie

  2. driver.add_cookies({字典}) # 设置cookie

步骤:

  1. 打开百度url driver.get("http://www.baidu.com")

  2. 设置cookie信息: driver.add_cookie({"name":"BDUSS","value":"根据实际情况编写"})

  3. 暂停2秒以上

  4. 刷新操作

注意:

  1. 以上百度BDUSS所需格式为百度网站特有,别的网站请自行测试。

  2. 必须进行刷新操作。

python 复制代码
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动对象
driver = webdriver.Firefox()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)
# 打开url
# 设置cookie
url = "http://www.baidu.com"
driver.get(url)
driver.add_cookie({"name": "BDUSS", "value":"05VkJaelAtblhuV2hIQncxS0p2N1l4MVNrdmctZGxWREUwNWdYTjRwV1N3Y1pjRVFBQUFBJCQAAAAAAAAAAAEAAAD82ggPMTUwNjkxNTU1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJI0n1ySNJ9ca0"})

# 获取所有的cookies信息
# cookies = driver.get_cookies()
# print("cookies内容为:", cookies)
# for co in cookies:
#     print(co['name'])

# cookie = driver.get_cookie("BDUSS")
# print("cookie:", cookie)

# 暂停2秒
sleep(2)
# 刷新 必须进行刷新才能看到效果
driver.refresh()



"""
    目标: cookie操作
    案例:
        使用cookie绕过百度登录
    步骤:
        1. 手动登录百度网站
        2. 手动获取登录后的cookies 'BDUSS'
        3. 使用selenium内的add_cookie(name='BDUSS', value='xxxx')
"""




# 暂停 2
sleep(5)
# 关闭驱动对象
driver.quit()

第三章 UnitTest

一、UnitTest框架

1. 为什么使用UnitTest框架

  1. 批量执行用例

  2. 提供丰富的断言知识

  3. 可以生成报告

2. 什么是UnitTest框架

python自带一种单元测试框架

3. 核心要素

1). TestCase(测试用例)

2). TestSuite(测试套件)

3). TextTestRunner(以文本的形式运行测试用例)

4). TestLoader(批量执行测试用例-搜索指定文件夹内指定字母开头的模块) 【推荐】

5). Fixture(固定装置(两个固定的函数,一个初始化时使用,一个结束时使用))

4. TestCase

说明:测试用例

步骤:

  1. 导包 import unittest

  2. 新建测试类并继承 unittest.TestCase

  3. 测试方法必须以test字母开头

运行:

  1. 运行测试类所有的测试方法,光标定位到类当前行右键运行

  2. 运行单个测试方法:光标放到测试方法当前行。

python 复制代码
"""
    目标:unittest框架--TestCase使用
    步骤:
    案例:
        编写 求和测试函数
"""
# 导包
import unittest


# 编写求和函数
def add(x, y):
    return x+y


# 定义测试类 并 继承
class Test01(unittest.TestCase):
    # 定义测试方法 注意:以test字母开头
    def test_add(self):
        # 调用 要是的函数
        result = add(1, 1)
        print("结果为:", result)

    def test_add02(self):
        result = add(1, 2)
        print("结果为:", result)
        print("__name__内置变量获取当前运行的模块名称:", __name__)

    def eest_add03(self):
        result = add(1, 2)
        print("结果为:", result)

# 可以这么使用
# unittest.main("test01_testcase")

if __name__ == '__main__':
    unittest.main()

4. TestSuite

说明:测试套件

步骤:

  1. 导包

  2. 获取测试套件对象 suite = unittest.TestSuite()

  3. 调用addTest()方法 添加测试用例

添加测试用例方法:

  1. suite.addTest(类名("方法名称")) # 添加指定类中指定的测试方法

  2. suite.addTest(unittest.makeSuite(类名)) # 添加指定类中所有已test开头的方法

python 复制代码
import unittest


class Test02(unittest.TestCase):
    def test001(self):
        print("test001被执行")

    def test002(self):
        print("test002被执行")

    def test003(self):
        print("test003被执行")

    def test004(self):
        print("test004被执行")

if __name__ == '__main__':
    print("__name__的值:", __name__)


"""
    __name__: 为python中内置变量
        值:
            1. 如果当前运行的模块为当前模块,那么__name__的值为:__main__
            2. 如果当前运行的模块不是主模块,那么__name__的值为:模块名称
"""
python 复制代码
"""
    目标:unittest框架  - TestSuite使用
    操作:
        1. 导包
        2. 实例化获取 TestSuite对象
        3. 调用addTest方法添加用例 到指定套件中
"""

# 导包
import unittest

from scripts.test02 import Test02

# 实例化 suite
suite = unittest.TestSuite()

# 调用添加方法
# 写法1  类名("方法名") 注意:方法名称使用双引号
# suite.addTest(Test01("test_add"))
# suite.addTest(Test01("test_add02"))

# 扩展 添加测试类中所有test开头的方法
suite.addTest(unittest.makeSuite(Test02))

# 执行测试套件
runner = unittest.TextTestRunner()
runner.run(suite)

5. TextTestRunner

说明:执行测试套件方法

步骤:

  1. 导包

  2. 实例化后去执行套件对象 runner = unittest.TextTestRunner()

  3. 调用run方法去执行 runner.run(suite)

6. TestLoader

说明:

  1. 将符合条件的测试方法添加到测试套件中

  2. 搜索指定目录文件下指定字母开头的模块文件下test开始的方法,并将这些方法添加到测试套件中,最后返回测试套件

操作:

  1. 导包

import unittest

  1. 调用TestLoader()

写法1. suite = unittest.TestLoader().discover("指定搜索的目录文件","指定字母开头模块文件")

写法2. suite = unittest.defaultTestLoader.discover("指定搜索的目录文件","指定字母开头模块文件") 【推荐】

注意:如果使用写法1,TestLoader()必须有括号。

  1. 执行测试套件

unittest.TextTestRunner().run(suite)

python 复制代码
"""
    目标:演示TestLoader()类的用法
    作用:搜索指定目录下指定开头的py文件,在Py文件中搜索test开头测试方法,并且将这些方法添加到测试套件中,最后返回测试套件
    需求:
        运行 cases目录下test01.py~test05.py文件
    操作:
        1. 导包 unittest
        2. 调用TestLoader类下discaver方法
        3. 执行测试用例
"""
# 导包
import unittest
# 调用方法
# suite = unittest.TestLoader().discover("../cases")

# 扩展 指定 tpshop开头的模块
# suite = unittest.TestLoader().discover("../cases", pattern="tpshop*.py")

# 扩展 使用 推荐使用
suite = unittest.defaultTestLoader.discover("../cases")

# 执行 套件 方法 TextTestRunner
unittest.TextTestRunner().run(suite)

7. TestSuite与TestLoader区别

共同点:都是测试套件

不同点:实现方式不同

TestSuite: 要么添加指定的测试类中所有test开头的方法,要么添加指定测试类中指定某个test开头的方法

TestLoader: 搜索指定目录下指定字母开头的模块文件中以test字母开头的方法并将这些方法添加到测试套件中,最后返回测试套件

二、fixture

说明:装置函数(setUp、tearDown)

级别:

1). 函数级别 def setUp() / def tearDown()

特性:几个测试函数,执行几次。每个测试函数执行之前都会执行 setUp,执行之后都会执行tearDwon

2). 类级别 def setUpClass() / def tearDownClass()

特性:测试类运行之前运行一次setUpClass 类运行之后运行一次tearDownClass

注意:类方法必须使用 @classmethod修饰

3). 模块级别:def setUpModule() / def tearDownModule()

特殊:模块运行之前执行一次setUpModule ,运行之后运行一次tearDownModule

提示:

无论使用函数级别还是类级别,最后常用场景为:

初始化:

  1. 获取浏览器实例化对象

  2. 最大化浏览器

  3. 隐式等待

结束:

关闭浏览器驱动对象

python 复制代码
"""
    目标:unittest 中的fixture用法
    fixture其实就是两个函数,这个函数可以一起使用,也可以单独使用
        1. 初始化函数:def setUp()
        2. 结束函数: def tearDown()

    fixture级别:
        1. 函数级别 [常用]
        2. 类级别 [常用]
        3. 模块级别
"""
import unittest

def setUpModule():
    print("setUpModule")

def tearDownModule():
    print("tearDownModule")


class Test03(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("setUpClass被执行")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass被执行")

    def setUp(self):
        print("setUp被执行")

    def tearDown(self):
        print("tearDown被执行")

    def test01(self):
        print("test01被执行")

    def test02(self):
        print("test02被执行")


class Test04(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("setUpClass被执行")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass被执行")

    def setUp(self):
        print("setUp被执行")

    def tearDown(self):
        print("tearDown被执行")

    def test01(self):
        print("test01被执行")

    def test02(self):
        print("test02被执行")
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习