Selenium自动化测试——计算器加法测试

发布于:2022-12-25 ⋅ 阅读:(428) ⋅ 点赞:(0)

项目简介:对“在线计算器”的加法功能进行自动化测试

使用技术:PO框架+Unittest+Selenium

项目框架:

 以下针对代码结构及功能作相应分析:

1、base基类层

        base_cal_test.py包含page页面一些公用的方法,比如说查找定位计算器元素,点击功能等;

        get_driver.py 获取driver对象

  • 注意解包loc只需要在查找元素的地方使用就可以 
  • 包含

    #初始化方法

    #查找元素方法

    #点击元素方法

    #获取value属性方法封装

    #截图方法

 源代码:base_cal_test.py

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time

class Base:
    #  初始化方法
    def __init__(self,driver):
        self.driver = driver

    #  查找元素
    def base_find_element(self,loc,timeout=30,poll=0.5):
        """
        @param loc: 元素的定位信息,元组格式
        @param timeout: 默认超时时间30秒
        @param poll: 访问频率,0.5秒一次
        @return: 返回查找到的元素
        """
        return  WebDriverWait(self.driver,
                              timeout=timeout,
                              poll_frequency=poll).until(lambda x:x.find_element(*loc))

    #  点击元素
    def base_click(self,loc):
        self.base_find_element(loc).click()

    #  获取元素的value值
    def base_get_ele_value(self,loc):
        #使用get_attribute("value")获取指定元素的属性值
        return self.base_find_element(loc).get_attribute("value")

    #  截图
    def base_get_image(self):
        self.driver.get_screenshot_as_file('../image/{}.png'.format(time.strftime("%Y_%m_%d %H:%M:%S")))

get_driver.py

from selenium import webdriver
from PO.练习计算器 import page

class GetDriver:

    #设置driver
    driver = None
    #   获取driver
    @classmethod
    def get_driver(cls):
        if cls.driver is None:
            #实例化浏览器
            cls.driver = webdriver.Chrome()
            #最大化
            cls.driver.maximize_window()
            #打开浏览器
            cls.driver.get(page.url)
        return cls.driver
        #单例原则

    #   关闭driver
    @classmethod
    def quit_driver(cls):
        if cls.driver:
            print('关闭之前',cls.driver)
            cls.driver.quit()
            print('关闭之后', cls.driver)
            cls.driver = None
            print('关闭之后', cls.driver)
            #注意此处有很大的坑,必须在关闭之后要置空

if __name__ == '__main__':
    #第一次获取浏览器
    print(GetDriver().get_driver())
    # 第二次获取浏览器
    print(GetDriver().get_driver())
    GetDriver.quit_driver()

2、page(页面对象):一个页面封装成一个对象,继承base,

        模块名:page+实际操作模块名称;

        类名:大驼峰命名:PageLogin

        方法名:每个元素操作单独封装成一个方法

__init__.py:包含服务器配置url和计算器元素的定位方式

'''以下为计算器数据的配置数据'''
from selenium.webdriver.common.by import By

'''以下为服务器域名配置地址'''

url = "http://cal.apple886.com/"

#数字键

#加号
clac_add = By.ID, "simpleAdd"
#减号
clac_sub = By.ID, "simpleSubtr"
#乘号:
clac_multi = By.ID, "simpleMulti"
#除号
clac_divi = By.ID, "simpleDivi"
#等号
clac_equal = By.ID, "simpleEqual"
#清空
clac_clear = By.ID, "simpleClearAllBtn"
#获取结果
clac_result = By.ID, "simpleIpt"

page_cal_test.py

from selenium.webdriver.common.by import By
from PO.练习计算器 import page
from PO.练习计算器.base.base_cal_test import Base


class PageCalc(Base):
    #   输入数字方法
    def page_input_num(self,num):
        for i in str(num):
            #拆开单个按键定位方式
            loc = By.ID, "simple{}".format(i)
            self.base_click(loc)

    #   点击+操作符
    def page_click_add(self):
        self.base_click(page.clac_add)

    #   点击"等号"计算出结果
    def page_click_eq(self):
        self.base_click(page.clac_equal)

    #   获取结果
    def page_get_result(self):
        return self.base_get_ele_value(page.clac_result)

    #   点击清屏
    def page_clear(self):
        self.base_click(page.clac_clear)

    #   截图
    def page_get_image(self):
        self.base_get_image()
    #组装加法业务方法
    def page_calc(self,num1,num2):
        self.page_input_num(num1)
        self.page_click_add()
        self.page_input_num(num2)
        self.page_click_eq()

3、scripts/cases(业务层)

        导包调用page,使用unittest框架调用page页面对象层完成业务流程测试需求

        模块名:test+实际操作模块名称

       测试业务名称:大驼峰命名,把模块名抄写一下

test_calc.py

import json
import unittest
from parameterized import  parameterized

from PO.练习计算器.page.page_cal_test import PageCalc
from PO.练习计算器.base.get_driver import GetDriver
from PO.练习计算器.scripts.tools.read_json import read_json


def get_data():
    datas = read_json("calc.json")
    data = []
    for info in datas.values():
        data.append((info.get('num1'), info.get('num2'), info.get('except')))
    return data

class Test_calc(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        #获取driver
        cls.driver = GetDriver.get_driver()
        cls.calc = PageCalc(cls.driver)

    @classmethod
    def tearDownClass(cls):
        #关闭driver
        GetDriver.quit_driver()

    #测试加法方法
    @parameterized.expand(get_data())
    def test_add_calc(self,num1,num2,expect):
        #调用业务方法
            #进行计算
            self.calc.page_calc(num1,num2)
            try:
                #断言
                self.calc.assertEqual(self.calc.page_get_result(),expect)
            except:
                #截图
                self.calc.page_get_image()

在scripts/tools文件夹里添加对数据读取的封装函数

read_json.py

import json

def read_json(filename):
    with open('../data/'+ filename,'r' , encoding='utf-8') as f:
        return json.load(f)

if __name__ == '__main__':
    datas = read_json("calc.json")
    print(datas)

这里的read_json函数返回的是读取测试用例数据,格式如下,所以需要在test_calc.py文件中有对应的改造,需要的格式是:[( ),( ),( )]

 

在该项目中需要注意:

1、在需要定位网页元素的时候需要用到loc的时候,只用在查找元素那块使用*进行解码

2、注意:在关闭driver对象的语句之后一定要将driver重置为None

3、深刻体会封装的含义 

本文含有隐藏内容,请 开通VIP 后查看