0


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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

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

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

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

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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

修改前:

修改后:

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

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

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

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

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】


本文转载自: https://blog.csdn.net/Xsk215/article/details/139925674
版权归原作者 程序员Baby~ 所有, 如有侵权,请联系我们删除。

“selenium+unittest实现web自动化的示例代码”的评论:

还没有评论