软件测试框架实战:Python+Slenium搭建Web自动化测试框架全教程

Python+Selenium是一种流行的Web自动化测试框架,可以模拟真实的用户操作,对网页进行功能和样式的验证。要通过selenium测试网页,需要以下几个步骤:

安装selenium库和浏览器驱动 。
使用selenium提供的方法来控制浏览器窗口大小、后退、前进等。
使用selenium提供的方法来定位和操作页面元素,如点击、输入、获取属性等。
使用单元测试、日志系统、数据库等其他软件来配合selenium进行数据驱动的测试和POM设计模式。

一、selenium库和驱动的安装方法

使用pip命令安装selenium库。例如,可以在命令行输入

pip install selenium

或者

pip3 install selenium

下载和安装浏览器驱动程序。例如,如果我们使用的是Chrome浏览器,你可以从官网下载对应版本的chromedriver,并将其放在python的安装路径下

二、通过selenium控制浏览器的具体执行方法

导入selenium的webdriver模块。

from selenium import webdriver

创建一个webdriver对象,指定要使用的浏览器来打开Chrome浏览器。并使用webdriver对象的方法来操作浏览器。

web = webdriver.Chrome()

访问一个网址

web.get(url)

后退一步

web.back()
案例1:selenium控制浏览器

假设我们要用selenium控制Chrome浏览器,打开百度网站,输入关键词并搜索,然后关闭浏览器。可以参考以下代码:

  1. #导入selenium的webdriver模块

  2. from selenium import webdriver

  3. #创建一个webdriver对象,指定使用Chrome浏览器

  4. web = webdriver.Chrome()

  5. #访问百度网站

  6. web.get('https://www.baidu.com/')

  7. #找到搜索框元素,并输入关键词

  8. search_box = web.find_element_by_id('kw')

  9. search_box.send_keys('selenium')

  10. #找到搜索按钮元素,并点击

  11. search_button = web.find_element_by_id('su')

  12. search_button.click()

  13. #关闭浏览器

  14. web.quit()

三、Selenium如何定位和操作页面元素

selenium可以使用多种方法来定位和操作页面元素,比如id、name、类名、css选择器、链接文本、标签名、xpath等。你可以根据元素的属性或者位置来选择合适的方法。

案例2:页面定位

比如,如果你要定位百度首页的搜索框:

  1. #通过id定位

  2. search_box = web.find_element_by_id('kw')

  3. #通过name定位

  4. search_box = web.find_element_by_name('wd')

  5. #通过css选择器定位

  6. search_box = web.find_element_by_css_selector('#kw')

如果我们需要操作页面元素,比如输入文本或者点击按钮,可以使用以下代码:

  1. #在搜索框中输入文本

  2. search_box.send_keys('selenium')

  3. #找到搜索按钮并点击

  4. search_button = web.find_element_by_id('su')

  5. search_button.click()

案例3:Selenium操作下拉框

如果我们需要处理select标签的下拉框,我们可以使用selenium提供的select模块,它有三种方法来选择下拉框中的选项:根据索引、值或者文本属性

例如,我们要选择下面这个下拉框中的“北京”选项:

  1. <select id="city">

  2. <option value="sh">上海</option>

  3. <option value="bj">北京</option>

  4. <option value="gz">广州</option>

  5. </select>

可以使用以下代码:

  1. #导入select模块

  2. from selenium.webdriver.support.select import Select

  3. #定位到下拉框元素

  4. city = web.find_element_by_id('city')

  5. #创建Select对象

  6. select = Select(city)

  7. #根据索引选择第二个选项(索引从0开始)

  8. select.select_by_index(1)

  9. #或者根据值选择'bj'选项

  10. select.select_by_value('bj')

  11. #或者根据文本属性选择'北京'选项

  12. select.select_by_visible_text('北京')


如果我们要处理的下拉框,非select标签的下拉框,比如ul-li标签的下拉框,你可以通过模拟鼠标点击的方式实现操作。比如,选择下面这个下拉框中的“Python”选项:

  1. <div class="dropdown">

  2. <button class="btn btn-default dropdown-toggle" type="button" id="menu1" data-toggle="dropdown">编程语言<span class="caret"></span></button>

  3. <ul class="dropdown-menu" role="menu" aria-labelledby="menu1">

  4. <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Java</a></li>

  5. <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Python</a></li>

  6. <li role="presentation"><a role="menuitem" tabindex="-1" href="#">C++</a></li>

  7. </ul>

  8. </div>

可以使用以下代码实现:

  1. //定位到按钮元素并点击展开下拉框

  2. WebElement button = driver.findElement(By.id("menu1"));

  3. button.click();

  4. //定位到列表元素并获取所有子元素(即选项)

  5. WebElement list = driver.findElement(By.className("dropdown-menu"));

  6. List<WebElement> options = list.findElements(By.tagName("li"));

  7. //遍历所有子元素,找到文本为'Python'的选项并点击

  8. for (WebElement option : options) {

  9. if (option.getText().equals("Python")) {

  10. option.click();

  11. break;

  12. }

  13. }

四、数据驱动测试和POM模式

使用单元测试、日志系统、数据库等其他软件来配合selenium进行数据驱动的测试和POM设计模式,具体需要以下几个步骤:

1、建立一个工程结构,将代码与数据分离,每个页面对应一个类。

新建一个项目,每个页面对应一个包(package),每个包下面有一个__init__.py文件。
在每个包下面创建一个类,封装页面元素和操作。
在根目录下创建一个baseinfo文件夹,存放常量和配置信息。
在根目录下创建一个testcase文件夹,存放测试用例。
在根目录下创建一个report文件夹,存放测试报告。
2、使用unittest框架来组织和运行测试用例,使用setUp和tearDown方法来初始化和清理环境。

使用unittest.main()函数,它会自动寻找当前模块中以test开头的测试方法并执行。
使用TestSuite类,它可以将多个测试用例或者测试类添加到一个测试套件中,并使用TestRunner类来执行
使用TestLoader类,它可以根据给定的模式或者目录来加载测试用例,并返回一个TestSuite对象
使用discover()函数,它可以自动发现给定目录下的所有测试用例,并返回一个TestSuite对象。
3、使用POM设计模式来封装页面元素和操作,将页面对象作为参数传递给测试用例。

创建一个页面类,继承object类,定义页面元素的定位器和操作方法。
创建一个测试类,继承unittest.TestCase类,导入页面类,并在setUp方法中初始化浏览器驱动和页面对象。
在测试方法中,调用页面对象的操作方法,并使用断言验证测试结果。
在tearDown方法中,关闭浏览器驱动。
4、使用DDT或Yaml等工具来读取外部数据源,如数据库、Excel、CSV等,并使用装饰器或参数化方法来驱动测试用例。

使用DDT或Yaml等工具来读取外部数据源,使用装饰器或参数化方法来驱动测试用例,是一种数据驱动测试的方式,可以实现测试数据和用例代码的分离,方便后期维护。

以下是使用这种方式读取Excel数据的一般步骤:

创建一个Excel文件,存放测试数据,每行对应一个测试场景,每列对应一个参数。
创建一个读取Excel文件的类,使用openpyxl库或其他库来操作Excel文件,返回一个列表或字典类型的数据。
创建一个测试类,继承unittest.TestCase类,并在类前面使用@ddt装饰器。
在测试方法前面使用@data或@file_data装饰器,并传入读取Excel文件的类返回的数据。
在测试方法中定义一个参数用来接收用例数据,并调用requests库或其他库发送请求,并使用断言验证响应结果。
DDT是一个数据驱动测试的装饰器,可以用来装饰测试方法,参数是文件名或列表。文件可以是json或yaml类型。如果文件是列表,列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。如果文件是字典,字典的key会作为测试用例方法的后缀显示,字典的value会作为测试用例参数。

Yaml是一种数据格式,类似txt,excel,json。它只有两种数据类型:map对象(键值对,冒号后需要有空格)和list列表对象(以-开头)。读取之后是一个不定长的字典形式。

案例4:DDT Yaml接口测试

下面是一个使用DDT和Yaml进行接口测试的代码示例:

  1. import unittest

  2. from ddt import ddt,data,file_data

  3. import requests

  4. import yaml

  5. @ddt

  6. class TestApi(unittest.TestCase):

  7. @file_data('test_data.yml')

  8. def test_api(self,**kwargs):

  9. url = kwargs.get('url')

  10. method = kwargs.get('method')

  11. data = kwargs.get('data')

  12. expect = kwargs.get('expect')

  13. if method.lower() == 'get':

  14. res = requests.get(url,params=data)

  15. elif method.lower() == 'post':

  16. res = requests.post(url,data=data)

  17. else:

  18. res = None

  19. self.assertEqual(res.json(),expect)

  20. if __name__ == '__main__':

  21. unittest.main()

test_data.yml文件内容如下:

  1. test_01:

  2. url: "http://httpbin.org/get"

  3. method: "get"

  4. data: {"name":"Tom","age":18}

  5. expect: {"args":{"age":"18","name":"Tom"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Host":"httpbin.org","User-Agent":"python-requests/2.26.0","X-Amzn-Trace-Id":"Root=1-61d7f9c8-6a9b0e8a4f7c3b6d5e0a4f7c"},"origin":"223.104.63.230","url":"http://httpbin.org/get?name=Tom&age=18"}

  6. test_02:

  7. url: "http://httpbin.org/post"

  8. method: "post"

  9. data: {"username":"admin","password":123456}

  10. expect: {"args":{},"data":"","files":{},"form":{"password":"123456","username":"admin"

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 31
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值