selenium+unittest实现web自动化的示例代码

 更新时间:2023年03月02日 08:33:05   作者:小胖虎*  
本文主要介绍了selenium+unittest实现web自动化的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前面我们学习unittest 的目的是用它编写 Web 自动化测试用例,所以接下来会将 unittest 与Selenium 结合起来写一个 Web 自动化测试的例子。

我们仍以百度搜索为例,创建 test_baidu.py 文件

# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/25
"""
 
import unittest
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
 
 
class TestBaidu(unittest.TestCase):
 
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.baidu_url = 'https://www.baidu.com'
 
    def test_search_key_unittest(self):
        self.driver.get(self.baidu_url)
        self.driver.find_element(By.ID, 'kw').send_keys('unittest')
        self.driver.find_element(By.ID, 'su').click()
        sleep(2)
        title = self.driver.title
        self.assertEqual(title, 'unittest_百度搜索')
 
    def test_search_key_selenium(self):
        self.driver.get(self.baidu_url)
        self.driver.find_element(By.ID, 'kw').send_keys('selenium')
        self.driver.find_element(By.ID, 'su').click()
        sleep(2)
        title = self.driver.title
        self.assertEqual(title, 'selenium_百度搜索')
 
    def tearDown(self):
        self.driver.close()
 
 
if __name__ == '__main__':
    unittest.main

对上面的代码不做过多介绍,都是以 unittest 创建测试类和方法的。方法中的代码是Selenium 脚本。不过,这里的代码存在一些问题,我们来一一改进。

首先,观察代码可以发现,两个测试用例中的步骤是一样的,唯一的区别是搜索的关键字和断言的结果不同。在学习过python模块化,所以这里把操作步骤封装成一个方法。

代码如下:

# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/25
"""
 
import unittest
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
 
 
class TestBaidu(unittest.TestCase):
 
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.baidu_url = 'https://www.baidu.com'
    
    # 将百度首页的访问和搜索过程封装成一个baidu_search()方法
    def baidu_search(self, search_key):
        self.driver.get(self.baidu_url)
        self.driver.find_element(By.ID, 'kw').send_keys(search_key)
        self.driver.find_element(By.ID, 'su').click()
        sleep(2)
 
    def test_search_key_unittest(self):
        search_key = 'unittest'
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + '百度搜索')
 
    def test_search_key_selenium(self):
        search_key = "selenium"
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "百度搜索")
    
    def tearDown(self):
        self.driver.close()
 
if __name__ == '__main__':
    unittest.main

这里将百度首页的访问和搜索过程封装成一个 baidu_search()方法,并定义 search_key参数为搜索关键字,根据接收的关键字执行不同内容的搜索。这里的 baidu_search()方法不会被当作测试用例执行,因为根据 unittest 查找和执行测试用例的规则,它只会把以“test”开头的方法当作测试用例。

另一个值得讨论的问题是,测试用例的断言要不要写在封装的方法中?从前面的代码可以看出,测试的断言点是一样的。这里更倾向于把断言写在每一条测试用例里面。因为很多时候就算操作步骤是一样的,断言点也不完全一样。从设计的角度来看,断言写在每一个测试用例中也会更加清晰。

另外我们还发现每一条测试用例都要启动和关闭一次浏览器,这是非常耗时的,那么如何减少浏览器的启动和关闭次数呢?利用前面学过的setUpClass/tearDownClass可以解决这个问题。

# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/25
"""
 
import unittest
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
 
 
class TestBaidu(unittest.TestCase):
 
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()
        cls.baidu_url = 'https://www.baidu.com'
 
    def baidu_search(self, search_key):
        self.driver.get(self.baidu_url)
        self.driver.find_element(By.ID, 'kw').send_keys(search_key)
        self.driver.find_element(By.ID, 'su').click()
        sleep(2)
 
    def test_search_key_unittest(self):
        search_key = 'unittest'
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + '_百度搜索')
 
    def test_search_key_selenium(self):
        search_key = 'selenium'
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + '_百度搜索')
 
    @classmethod
    def tearDownClass(cls):
        cls.driver.close()
 
 
if __name__ == '__main__':
    unittest.main

修改前:

修改后:

可以看到修改后省去16秒之多,这里虽然我们将 driver 驱动定义为 cls.driver,但是在每个测试用例中使用时依然为self.driver。

当整个测试类中的所有测试用例都运行完成后,会调用 cls.driver.quit()关闭浏览器。

当一个测试类中有多条测试用例时,这种方式将会大大缩短测试用例的执行时间。

这样我们就得到了一个简单的百度搜索的自动化测试脚本,读者可以根据此例试试别的场景。

到此这篇关于selenium+unittest实现web自动化的示例代码的文章就介绍到这了,更多相关selenium unittest web自动化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python构建简单线性回归模型

    Python构建简单线性回归模型

    这篇文章主要介绍了Python构建简单线性回归模型,线性回归表示发现函数使用线性组合表示输入变量。简单线性回归很容易理解,使用了基本的回归技术,一旦理解了这些基本概念,可以更好地学习其他类型的回归模型
    2022-08-08
  • 答题辅助python代码实现

    答题辅助python代码实现

    这篇文章主要为大家详细介绍了答题辅助python代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python静态Web服务器面向对象处理客户端请求

    Python静态Web服务器面向对象处理客户端请求

    这篇文章主要为大家介绍了Python面向对象实现静态Web服务器处理客户端请求示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • python 函数嵌套及多函数共同运行知识点讲解

    python 函数嵌套及多函数共同运行知识点讲解

    在本篇文章里小编给各位整理的是一篇关于python 函数嵌套及多函数共同运行知识点讲解,需要的朋友们可以学习下。
    2020-03-03
  • python递归打印某个目录的内容(实例讲解)

    python递归打印某个目录的内容(实例讲解)

    下面小编就为大家带来一篇python递归打印某个目录的内容(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Python+Pygame实战之炫舞小游戏的实现

    Python+Pygame实战之炫舞小游戏的实现

    提到QQ炫舞,可能很多人想到的第一个词是“青春”。恍然间,这个承载了无数人回忆与时光的游戏品牌,已经走到了第十几个年头。今天小编就来给大家尝试做一款简单的简陋版的小游戏——《舞动青春*炫舞》,感兴趣的可以了解一下
    2022-12-12
  • pandas分组聚合(agg,transform,apply)

    pandas分组聚合(agg,transform,apply)

    在SQL中我们经常使用 GROUP BY 将某个字段,按不同的取值进行分组, 在pandas中也有groupby函数,本文主要介绍了pandas分组聚合(agg,transform,apply),具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Python爬虫之UserAgent的使用实例

    Python爬虫之UserAgent的使用实例

    今天小编就为大家分享一篇关于Python爬虫之UserAgent的使用实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Python实现读取txt文件并画三维图简单代码示例

    Python实现读取txt文件并画三维图简单代码示例

    这篇文章主要介绍了Python实现读取txt文件并画三维图简单代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 如何用Python识别车牌的示例代码

    如何用Python识别车牌的示例代码

    车牌识别系统计算机视频图像识别技术在车辆牌照识别中的一种应用,本文主要介绍了如何用Python识别车牌的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论