目录

1.编写测试用例 web_cases.xlsx

2.框架搭建

3.自动化用例实现

4.用例筛选

 

一、流程

首先,在实战之前,回顾好selenium的基础知识。77节

只要是没有现成封装的方法可以使用,都可以通过发送JS代码的方式进行操作。

 

1.编写测试用例 web_cases.xlsx

2.框架搭建

    须知:在接口自动化测试中,已经有现成的框架,可以直接拿来用。

   ①common  通用模块,不以项目为转移的

  可以直接将common目录直接拷贝到web自动化框架中来,(可以用,不代表一定要用,比如其中,MySQL_hanlder、request_handler不需要,web自动化中,不需要这2方面的操作,需要用的时候,可以直接复制过来用)

   ②config 配置文件

  可以直接拷贝模块,但是内容需要根据项目情况进行修改(比如,路径、logger不需要修改,   修改账号)

   ③data、libs、logs、middware、reports、testcases、run.py同理

框架的搭建,基本上跟接口的框架类似

 

3.自动化用例实现(web自动化测试中,登录成功、登录错误的步骤是不一样的,要分开写)

编写测试用例脚本,根据web_testcases.xlsx文件进行编写。

举例:登录失败用例

 步骤如下:

1.打开浏览器
2.访问登录页面
3.元素定位+元素操作,输入用户名和密码,点击登录
4.通过获取页面内容得到实际结果,进行断言

根据上述步骤,编写web自动化测试脚本(需要登录的web页面如下)

 

 手机号为空时,显示显示“请输入手机号”,作为断言

 

代码实现test_login.py:

"""登录功能的测试用例"""

import unittest
from middware.handler import HandlerMiddle
from config.config import Wait_time

class TestLogin(unittest.TestCase):
    """登录功能的测试类"""

    def test_login_error(self):
        """测试步骤
        1.打开浏览器
        2.访问登录页面
        3.元素定位+元素操作,输入用户名和密码,点击登录
        4.通过获取页面内容得到实际结果,进行断言
        :return:
        """

        from selenium import webdriver

        #1.打开浏览器
        driver = webdriver.Chrome()
        #设置隐性等待 等待的时间就可以放在config中,直接参数调用
        ##方法一:放在yaml中
        wait_time = HandlerMiddle.yaml_data["selenium"]["wait_time"]
        ##方法二、放在config.py中
        #wait_time = Wait_time
        driver.implicitly_wait(wait_time)

        #2.访问登录页面
        url = "http://120.78.128.25:8765/Index/login.html"
        driver.get(url)

        #3.元素定位+元素操作,输入用户名和密码,点击登录
        driver.find_element_by_name("phone").send_keys("") #定位输入手机号为空
        driver.find_element_by_name("password").send_keys("")#定位输入的密码为空
        driver.find_element_by_class_name("btn-special").click()

        #4.通过获取页面内容得到实际结果,进行断言
        #实际结果是在页面上的提示,再次进行定位
        actual_result = driver.find_element_by_class_name("form-error-info").text

        #断言
        self.assertTrue(actual_result == "请输入手机号")

上面代码实际结果中的text,是webelement对象直接调用的webelement.py文件中的text属性。

源码如下:

@property
def text(self):
"""The text of the element."""
  return self._execute(Command.GET_ELEMENT_TEXT)['value']
Command.GET_ELEMENT_TEXT,是Command类调用的类属性(GET_ELEMENT_TEXT = "getElementText")

总结:自动化用例,是selenium基础操作的组合,根据用例设置,操作浏览器和页面。

 

78节

上面是异常用例的自动化实现,下面进行正常用例的实现。

一般情况下:步骤不同,写不同的测试用例的函数(根据cases.xlsx测试用例的步骤编写)。

正常用例,以登录来说,登录成功,会跳转到登录成功的页面。与异常用例不同的是,获取实际结果跟断言

首先看下登录成功后,定位“我的账户”,通过Xpath进行定位查找,//a[@href="/Member/index.html"]

 

 

代码实现:

下面的断言,账户信息,用包含关系in:写关键字或者全称都OK,(用 ==的话,要注意查看actual_result是否与预期结果一致,这里是预期结果是写死的,后面再参数化)

    def test_login_success(self):
        """登录成功测试用例
        1.打开浏览器
        2.访问登录页面
        3.元素定位+元素操作,输入用户名和密码,点击登录
        4.通过获取页面内容得到实际结果,进行断言
        :return:
        """
        from selenium import webdriver
        #1.打开浏览器
        driver = webdriver.Chrome()

        #设置隐性等待时间
        wait_time  = HandlerMiddle.yaml_data["selenium"]["wait_time"]
        driver.implicitly_wait(wait_time)

        #2.访问登录页面
        url="http://120.78.128.25:8765/Index/login.html"
        driver.get(url)

        #3.元素定位+元素操作,输入用户名和密码,点击登录
        driver.find_element_by_name("phone").send_keys("159********")
        driver.find_element_by_name("password").send_keys("15******")
        driver.find_element_by_class_name("btn-special").click()

        #4.获取实际结果,进行断言
        actual_result = driver.find_element_by_xpath("//a[@href='/Member/index.html']").text
        print(type(actual_result))
        self.assertTrue("我的帐户[小蜜蜂177872141]" in actual_result)

 

4.用例筛选   ---引入pytest

背景:为什么进行用例筛选?

虽然实现了异常用例,但是用的比较少,因为在web自动化测试中,大多数情况下都是正向测试,主流程测试、回归测试、冒烟测试;跑主流程,比如登录成功。

所以在编写web自动化测试用例的时候,可以将用例全部编写,但是测试的时候,要进行用例筛选,只跑成功的用例。

unittest框架:将成功的用例,手动一个个添加到测试集testsuite中:suite.addTests(),比较麻烦    (接口自动化中用的是discover,自动发现全部的测试用例,这里就无法实现筛选了,所以web不能用discover)

 

下面引入pytest 框架

安装pytest: pip install pytest 

pytest在web自动化方面更加智能,筛选用例方便 ------(pytest可以用于api,web,app自动化)

语法:(项目路径下新建个pytest.ini文件,注册标签名)

1.在筛选的方法(用例)上,加“标签”:@pytest.mark.标签名

2.终端项目路径下运行:pytest -m "标签名"

 

下面运行登录成功的用例结果:一共3个用例,只收集了成功的2个用例。

 运行结果后谜案,有warning,打的mark标签,pytest无法识别,并给出细节查看链接,

 

 点击链接查看:需要在pytest.ini文件中,把标签添加上去,就不会有warning信息了。

 

 在项目路径下新建一个普通文件,命名为pytest.ini,将markers提前编写好,就不会出warning了

扩展:pytest.ini文件

pytest.ini文件是pytest的主配置文件,可以改变pytest的运行方式,它是一个固定的文件,pytest.ini文件读取配置信息,按指定的方式去运行。

pytest.ini的位置:一般放在项目工程的根目录(即当前项目的顶级文件夹下)

 

总结:标记功能的步骤

①先注册:在ini文件中,先注册mark的 名字

②打标签:测试用例函数上面@property.mark.标签名

③运行指定的标签用例:pytest -m "标签名"

 

pytest模块规则:

①自动智能发现用例:模块名以test开头、结尾(否则不会当做是测试用例)-----发现用例规则

②测试类,不能有__init__(self)初始化的方法-----测试用例的类不需要初始化

③方法(函数),必须以test_开头,类必须时Test

④pytest测试用例函数可以脱离类,可以直接使用函数的形式(测试用例的py文件直接写为函数)------unittest中无此用法

⑤类可以不继承unittest.TestSuite

(修改规则,78节50min),了解规则可以修改即可

 

总结:pytest的优点

①灵活的筛选用例

②不需要手动加载用例(不需要导入加载器,运行器),不需要手动添加,手动运行,直接一行运行代码即可。

 ③pytest可以兼容unit test(unit test不能兼容pytest)

 

执行测试:

1.可以在pycharm中直接右键,以pytest方式运行,但是这个pycharm解释器的特有功能,不建议使用。可以在pycharm的终端中运行

    -----如果的别人需要运行自己的自动化代码,拷贝代码到本机,可以直接在terminal中,cd到该项目的根目录下,运行

2.运行 pytest  testcase -sv    表示运行testcase目录下的所有的测试用例

   ---- 加上testcase目录,比较安全,万一别的目录中的函数有test_开头,会被pytest检测到当作用例执行了

   ----  -s 可以把用例中的print信息显示出来

   ---- -v 显示详细的测试结果在terminal    (可以组合表示为-sv)

   ---- 生成测试报告  --html=report.html --self-contained-html      (其中,如果不加--self-contained-html  ,会自动生成一个目录,不需要该目录就加上该这cmd)