测开学习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被执行")
相关推荐
伯明翰java2 小时前
Redis学习笔记-List列表(2)
redis·笔记·学习
云帆小二2 小时前
从开发语言出发如何选择学习考试系统
开发语言·学习
Elias不吃糖2 小时前
总结我的小项目里现在用到的Redis
c++·redis·学习
BullSmall3 小时前
《道德经》第六十三章
学习
AA陈超3 小时前
使用UnrealEngine引擎,实现鼠标点击移动
c++·笔记·学习·ue5·虚幻引擎
BullSmall3 小时前
《道德经》第六十二章
学习
Knox_Lai4 小时前
数据结构与算法学习(0)-常见数据结构和算法
c语言·数据结构·学习·算法
AA陈超5 小时前
Lyra源码分析:LyraCharacterMovementComponent
c++·笔记·学习·ue5·虚幻引擎·lyra
brave and determined7 小时前
可编程逻辑器件学习(day26):低主频FPGA为何能碾压高主频CPU?
人工智能·嵌入式硬件·深度学习·学习·fpga开发·云计算·fpga