第20章:python自动化——关键字驱动类实现

目录

一、关键字驱动设计模式介绍

二、关键字驱动设计模式原理

三、关键字驱动设计模式代码实现

1.逻辑代码web_keys.py文件内容

2.测试代码web_test.py文件内容

四、总结


一、关键字驱动设计模式介绍

在自动化测试中,分为两种应用方式
第一种叫做线性代码的模式,是所有的学习者以及新手对于自动化的认知。
第二种方式是基于框架的形态来完成,所谓框架其实就是一个完整的工程结构,具备有各类功能,满足企业实际各方功能需求的一个项目工程。

市场主流的自动化测试框架设计,分为POM关键字驱动
主要是为了解决不同的需求而实现的不同设计模式

测试框架在实际工作中是一种灵活的内容,会结合企业的实际需要来实现具体功能。

关键字驱动,最为传统的设计模式。最初就是基于工具的交互形态来实现的。
冗余是非常常见的现象,关键字驱动的设计模式可以极大地降低代码的冗余。

例如:

 def 刷1(学员):
   if 学员听懂了:
     return 1
   else:
     return 懵逼

框架,可以更好地精简代码,而且可以更好地维护代码。
关键字驱动设计模式是最适合以一对多的测试框架。
POM更适合项目的一对一设计,将每个流程封装在不同的py文件中。

框架不是固定的,是非常灵活的内容,会结合企业的实际需要来实现具体的功能。

二、关键字驱动设计模式原理

测试框架基本原理:

  • 代码与数据分离

  • 逻辑代码与测试代码要分离

关键字驱动类就是Selenium的操作行为代码的封装,这是错误的。

关键字驱动类,是行为的封装,重点在封装二字。

关键字驱动类除去封装基本的操作行为之外,还可以实现流程的关键字封装,在整个框架设计上,封装的定义不是固定的。

三、关键字驱动设计模式代码实现

逻辑代码和测试代码的分离,新建逻辑代码和测试代码
逻辑代码web_keys.py文件,测试代码web_test.py文件

1.逻辑代码web_keys.py文件内容

关键字驱动:逻辑代码
        webui全部是基于selenium来实现的。selenium就是一个巨大的商城,很多东西我们用不上
        我们只取自己需要的工具,就可以了
逻辑代码,就类似于一个工具箱,需要什么东西,就在selenium商城去取,将常用的操作进行封装,以便调用
        封装关键字需要提高复用性,提升维护性降低维护成本。

import time

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


def opt():
    options = webdriver.ChromeOptions()
    # 页面加载策略
    options.page_load_strategy = 'normal'
    # 窗体最大化
    options.add_argument('start-maximized')


def open_browser(type_):
    try:
        driver = getattr(webdriver, type_.capitalize())(options=opt())
    except Exception as e:
        print(e)
        driver = webdriver.Chrome()
    return driver


class Webkeys:
    # 临时driver对象
    # driver = webdriver.Chrome()
    def __init__(self, type_):
        self.driver = open_browser(type_)
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)

    # 访问url
    def open(self, url):
        self.driver.get(url)

    # 元素定位,要满足不同的定位需求,将定位到的元素进行返回,方便后面调用
    def locator(self, by, value):
        return self.driver.find_element(by, value)

    # 输入
    def input(self, by, value, txt):
        el = self.locator(by, value)
        el.clear()
        el.send_keys(txt)

    # 点击
    def click(self, by, value):
        self.locator(by, value).click()

    # 关闭
    def quit(self):
        self.driver.quit()

    # 强制等待
    def wait(self, time_):
        time.sleep(time_)

    # 显示等待
    def driver_wait(self, by, value, time_=5):
        WebDriverWait(self.driver, time_, 0.5). \
            until(lambda element: self.locator(by, value), message='显示等待失败')

    # 鼠标悬停
    def action(self,by,value):
        ActionChains(self.driver).move_to_element(self.locator(by,value)).perform()

    # 输出标签页标题
    def title(self):
        print(self.driver.title)

    # 句柄切换,关闭第一个标签页
    def window_switch(self):
        handles = self.driver.window_handles
        self.driver.close()
        self.driver.switch_to.window(handles[1])

    # 句柄切换,不关闭第一个标签页
    def window_switch_old(self):
        handles = self.driver.window_handles
        self.driver.switch_to.window(handles[1])

2.测试代码web_test.py文件内容

测试代码管理:将所有需要执行的测试流程,放在此文件中,进行统一管理
    测试代码文件是可以有多个的,根据业务需要,以及代码管理需要进行文件的批量化管理即可
    测试代码脱离了逻辑代码之后,是没有任何价值的。

from time import sleep

from selenium import webdriver
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.support.select import Select
from class21.web_keys import Webkeys

# 创建一个chrome浏览器、
wk = Webkeys('chrome')

# 打开登录登录页面
wk.open('http://hzp.fecmall.com/customer/account/login')
# 输入账号和密码
wk.input('id', 'email', '[email protected]')
wk.input('id', 'pass', '123456')
wk.click('xpath', '//span[text()="登录"]')
wk.wait(10)

# 鼠标悬停到婚礼,选择婚礼礼服
wk.action('xpath', '//a[text()="婚礼"]')
wk.click('xpath', '//a[text()="婚礼礼服"]')

# 点击选择婚礼礼服
wk.click('xpath', '//img[@class="js_lazy"]')

# 选择绿色的礼服
wk.click('xpath', '//a[@class="current"]/span/img')
wk.click('xpath', '//span[text()="L"]')
wk.locator('xpath', '//input[@class="qty"]').clear()
wk.input('xpath', '//input[@class="qty"]', '3')
wk.click('xpath', '//span[text()="加入购物车"]')

# 点击继续支付
wk.click('xpath', '//span[text()="继续支付"]')

wk.wait(6)

if wk.locator('xpath', '//*[@class="address_list"]'):
    # 支付订单
    wk.click('link text', '支付订单')

else:
    # 填写收货地址
    wk.input('id', 'billing:telephone', '13297912971')
    wk.input('id', 'billing:street1', '武汉市')
    wk.input('id', 'billing:street2', '黄志平家里')

    # 选择国家的select
    country = Select(wk.locator('id', 'billing:country'))
    country.select_by_value('CN')

    # 收货地址城市
    state = Select(wk.locator('id', 'address:state'))
    state.select_by_visible_text('湖北省')
    wk.input('id', 'billing:city', '黄志平家里')
    wk.input('id', 'billing:zip', '430000')
    # 支付订单
    wk.click('link text', '支付订单')

try:
    wk.locator('xpath', '//h2[@class="sub-title"]')
except:
    wk.title()
    wk.driver.save_screenshot('./1.png')

sleep(10)

wk.quit()

四、总结

本章主要学习的是关键字驱动的学习,将常用的一些操作,进行封装,这就是逻辑代码,专门用一个文件进行管理。测试代码专门用一个文件进行管理。

逻辑代码,不涉及数据。测试代码,不涉及逻辑。分开管理,方便维护。

代码和数据的分离,在后面也会讲到。下一章讲解的EXCEL数据驱动就是数据分离的一种形式。

你可能感兴趣的:(Python自动化测试,python,自动化,功能测试,开发语言,测试工具)