WEB自动化(selenuim、unittest、POM设计模式、数据驱动与关键字驱动)

一、WEB自动化简介

1.1 WEB自动化与UI自动化的关系

web端测试: 对网页的测试
UI测试 = web测试+app测试
web自动化测试:通过代码对网页进行测试
UI自动化测试 = web自动化测试+APP自动化测试

1.2 什么WEB项目适合做自动化测试

1. 需求变动不频繁

2. 项目周期长

3. 项目需要回归测试

1.3 WEB自动化测试在什么阶段开始

功能测试完毕(手工测试)(1、时间问题;2、功能不完善)

1.4 WEB自动化测试所属分类

按照代码可见度划分:

  1. 黑盒测试(功能测试)
  2. 白盒测试(单元测试)
  3. 灰盒测试(接口测试)

WEB自动化测试属于黑盒测试(功能测试)

二、WEB自动化测试工具选择

2.1 主流的Web自动化测试工具

1. QTP:收费,支持Web,桌面自动化测试

2. Selenium:开源的Web自动化测试工具,免费,主要做功能测试

3. Robot framework:基于Python可扩展地关键字驱动的测试自动化框架,2014停止更新

三、WEB自动化测试的三板斧

● 定位元素
● 交互元素
● 进行断言

四、HTML与JavaScript

https://www.cnblogs.com/wangyong123/p/12308365.html

五、selenium框架

 https://www.cnblogs.com/wangyong123/articles/18421680

六、unittest框架(单元测试框架)

https://www.cnblogs.com/wangyong123/articles/18421681

七、POM设计模式

https://www.cnblogs.com/wangyong123/articles/18434545

 

八、数据驱动与关键字驱动

8.1什么是数据驱动

数据驱动:现在主流的设计模式之一(以数据驱动测试)。 ddt模块实现

ddt模块模块的安装 pip install ddt
ddt模块:一个类装饰器+三个装饰器方法
  ddt类装饰器 装饰继承unittest.TestCase的类
  data装饰器方法 data()装饰器方法把列表、元组、字典作为参数
  unpack装饰器方法 实现把复杂的数据实现分解成多个数据
  file_data装饰器方法 可以直接接收数据文件(json数据/基于yaml数据文件),实现循环测试8.1.1 

8.1.1 data 装饰器方法

# testdatas.yaml

# testdatas/testdatas.yaml

baseurl: "http://47.107.116.139/shopnc/shop"
login:
  url: /?s=user/loginInfo.html
  success:
    - laoban
    - laoban123
  fail:
    -
      - laoban
      - laoban1234
    -
      - admin
      - admin123
goodsPay:
  goodsname: Python全栈自动化
  passwd: mashang

 

from ddt import ddt, data, unpack, file_data


@ddt
class TestLogin(unittest.TestCase):
    # 传输数据参数(列表、元组、字典),实现数据驱动
    # Data("fail").data -->  [[['laoban', 'laoban1234'], ['admin', 'admin123']]]
    @data(*(Data("fail").data[0]))
    def test_login_fail_error_username(self, data):
        print(data)
        self.driver = webdriver.Chrome()
        loginpage = LoginPage(driver=self.driver)
        # print(data)
        loginpage.login(data[0], data[1])
        loginpage.sleep(2)
        # 断言,登录失败, 获取弹框登录失败
        ele = loginpage.locator("登录页面", loc=(By.XPATH, "//div[@class='msg']"))
        self.assertEqual("登陆失败", ele.text)

 

8.1.2 file_data装饰器方法

# login.yaml 

-
    - laoban
    - laoban1234
-
    - admin
    - admin123
from common import dir_config as Dir
from ddt import ddt, data, unpack, file_data


@ddt
class TestLogin(unittest.TestCase): 
    yaml_file_path = os.path.join(Dir.testdatas_dir, "login.yaml")
    @file_data(yaml_file_path)
    def test_login_fail_error_username(self, data):
        print(data)
        self.driver = webdriver.Chrome()
        loginpage = LoginPage(driver=self.driver)
        # print(data)
        loginpage.login(data[0], data[1])
        loginpage.sleep(2)
        # 断言,登录失败, 获取弹框登录失败
        ele = loginpage.locator("登录页面", loc=(By.XPATH, "//div[@class='msg']"))
        self.assertEqual("登陆失败", ele.text)

8.1.3 unpack 装饰器方法

# login.yaml 

-
    - laoban
    - laoban1234
-
    - admin
    - admin123
# login.yaml 

-
    username: laoban
    password: laoban1234
-
    username: admin
    password: admin123
from common import dir_config as Dir
from ddt import ddt, data, unpack, file_data


@ddt
class TestLogin(unittest.TestCase): 
    file_name = os.path.join(Dir.testdatas_dir, "login.yaml")
    @file_data(file_name)
    @unpack
    def test_login_fail_error_username(self, username, password):  # username 要与字典对应
        print(username, password)
        self.driver = webdriver.Chrome()
        loginpage = LoginPage(driver=self.driver)
        loginpage.login(username, password)
        loginpage.sleep(2)
        # 断言,登录失败, 获取弹框登录失败
        ele = loginpage.locator("登录页面", loc=(By.XPATH, "//div[@class='msg']"))
        self.assertEqual("登陆失败", ele.text)

8.2 关键字驱动

什么关键字驱动?(以关键字函数驱动测试), 关键字驱动又叫动作字驱动

把项目业务封装成关键字函数,再基于关键字函数实现自动化测试,项目业务实现转化为关键字函数

覆盖项目业务 = 用例集合覆盖测试
用例集合 = 一个一个用例实现覆盖测试
覆盖用例 = 多个操作步骤组成=多个关键字函数
操作步骤封装成对应的关键字函数

比如:登录用例
登录用例 = 多个操作步骤组成 基于每个操作步骤封装对应的关键字函数
登录用例:
  1、打开浏览器 关键字函数 open_browser()
  2、加载项目地址 关键字函数 load_url()
  3、输入用户名 关键字函数 input()
  4、输入密码 关键字函数 input()
  5、点击登录 关键字函数 click()

 

# keywords/library.py


from selenium import webdriver


class Library:
    driver = None

    def open_browser(self, browser):
        browser = browser.capitalize()
        self.driver = getattr(webdriver, browser)()  # 代表以下功能
        # 打开浏览器
        # if browser == "chrome":
        #     self.driver = webdriver.Chrome()
        # # 打开IE,火狐浏览器
        # elif browser == "ie":
        #     self.driver = webdriver.Ie()
        # elif browser == "firefox":
        #     self.driver = webdriver.Firefox()
        # else:
        #     pass

    def load_url(self, url):
        self.driver.get(url)

    def locator(self, loc):
        """获取元素的定位"""
        return self.driver.find_element(*loc)

    def input(self, loc, value):
        # 获取元素
        ele = self.locator(loc)
        ele.send_keys(value)

    def click(self, loc):
        ele = self.locator(loc)
        ele.click()
# testcases/test_01.py


import time
import unittest
from Code.keywrdFrame.keywords.libary import Library
from selenium.webdriver.common.by import By


class Test01(unittest.TestCase):

    def test_login(self):
        """
        基于关键字驱动 = 调用多个关键字函数
        :return:
        """
        # 登录页面的属性
        el_username = (By.NAME, "accounts")
        el_password = (By.NAME, "pwd")
        el_login = (By.XPATH, "//form[@class='am-form form-validation-username']/div[3]/button")

        lib = Library()
        lib.open_browser("chrome")
        lib.load_url(url="http://101.34.221.219:8010/?s=user/loginInfo.html")
        lib.input(loc=el_username, value="laoban")
        lib.input(loc=el_password, value="laoban123")
        lib.click(loc=el_login)
        time.sleep(3)

8.3 如何一条用例实现多条用例的覆盖

结合数据驱动: 编辑一条用例,外部导入数据实现循环
用例体:实现不同用例的操作步骤 + 对应的断言

如何代码实现:
  封装对应的方法,可以执行所有的用例的操作步骤 + 断言

# library.py


from selenium import webdriver


class Library:
    driver = None

    def open_browser(self, browser):
        browser = browser.capitalize()
        self.driver = getattr(webdriver, browser)()  # 代表以下功能
        # 打开浏览器
        # if browser == "chrome":
        #     self.driver = webdriver.Chrome()
        # # 打开IE,火狐浏览器
        # elif browser == "ie":
        #     self.driver = webdriver.Ie()
        # elif browser == "firefox":
        #     self.driver = webdriver.Firefox()
        # else:
        #     pass

    def load_url(self, url):
        self.driver.get(url)

    def locator(self, loc):
        """获取元素的定位"""
        return self.driver.find_element(*loc)

    def input(self, loc, value):
        # 获取元素
        ele = self.locator(loc)
        ele.send_keys(value)

    def click(self, loc):
        ele = self.locator(loc)
        ele.click()

    # 封装方法: 可以调用当前类下面的所有的关键字函数
    def run(self, keyword, *args):
        # 打开浏览器
        # keyword: open_browser
        # *args: chrome
        getattr(self, keyword)(*args)
        # self.open_browser(browser="chrome")
        # self.input(loc=(), value="")
import time
import unittest
from Code.keywrdFrame.keywords.libary import Library
from selenium.webdriver.common.by import By
from ddt import ddt, file_data, data, unpack


@ddt
class Test01(unittest.TestCase):
    # 每条用例的数据: 关键字函数 + 测试数据
    case_data = []

    @data(case_data) # z数据在文件中,从文件中导入
    def test_case(self):
        el_username = (By.NAME, "accounts")
        el_password = (By.NAME, "pwd")
        el_login = (By.XPATH, "//form[@class='am-form form-validation-username']/div[3]/button")
        # 用例体 = 操作步骤 + 断言
        # 封装对应的方法,可以执行所有的操作步骤
        lib = Library()
        """
        将参数放入文件中, 通过 case_data传递参数
        """
        lib.run("open_browser", "chrome")
        lib.run("load_url", "http://101.34.221.219:8010/?s=user/loginInfo.html")
        lib.run("input", el_username, "laoban")
        lib.run("input", el_password, "laoban123")
        lib.run("click", el_login)

关键字参数参考如图

 

posted on 2024-09-19 21:44  软饭攻城狮  阅读(11)  评论(0编辑  收藏  举报

导航