本文已参与「新人创造礼」活动,一同开启创造之路。

一、前言

上一章曲鸟全栈UI自动化教学(六):开端实战吧!实战环境准备咱们经过运用禅道真正的完成了第一个实战脚本,文末的练习题小伙伴完成了吗?下面为你发布答案。

]

二、发布上一章练习题答案

记得把你对应谷歌浏览器版本的chromedriver放入项目中:

import datetime
import random
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(2)
driver.maximize_window()
driver.get('http://127.0.0.1/zentao/user-login.html')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="account"]').send_keys('admin')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="loginPanel"]/div/div[2]/form/table/tbody/tr[2]/td/input').send_keys('替换为你自己的暗码') #这儿替换为你自己的暗码
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="submit"]').click()
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="menuMainNav"]/li[3]/a').click()
driver.switch_to.frame('appIframe-product')
time.sleep(0.5)
y=driver.find_elements(By.XPATH,'//a[@class="btn btn-primary create-product-btn"]')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="mainMenu"]/div[2]/a[3]').click()
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="name"]').send_keys('selenium2')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="code"]').send_keys('002')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="submit"]').click()

三、答案和不足剖析

之前练习题主要是将整个流程进行了串联,其中有个特别的操作是需求切换iframe,其他就没什么特别的当地了。

但如果依照上面的代码写的话,实际上是十分冗余和低效的。首要,为了完成每个过程都等候0.5秒履行,咱们在所有过程代码之间都加了代码time.sleep(0.5),并且对测验用例没有很好的办理,未对操作事情、元素地址等进行封装,导致可读性低、保护性低等。 所以写出自动化脚本很简略,但这并不代表你把握了自动化,可以胜任一份自动化测验的工作。也正因如此,咱们需求建立自动化测验结构,将数据和代码操作进行分离,封装有用的公共办法来提高咱们的效率。

下面咱们结合pytest对咱们的代码进行一些优化,让自动化结构初具模型。


四、Pytest简略介绍和注意事项

pytest是一个十分成熟的全功用的Python测验结构,功用很全,很灵敏,可以与很多第三方插件进行结合,比方:pytest-html(完美html测验报告生成)、pytest-rerunfailures(失利case重复履行)、pytest-xdist(多CPU分发)等;还可以跟类似Jenkins的CI工具进行结合。

小伙伴可能在网上发现很多教程的自动化是下面这样写的,一条用例就要写一个函数办法:

曲鸟全栈UI自动化教学(七):使用Pytest来搭建自动化测试框架


这儿极端不引荐这样做的!等于每次写用例还要写代码,这是严重的低效率和低保护的行为,不可取!


五、建立自动化测验结构

1. 装置pytest

cmd履行如下指令:

pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple some-package


2. 结构思路剖析

咱们理想的作用是测验用例跟代码进行分离,也就是说当咱们编写测验用例的时分,不需求去改动哪怕一行代码。

1)数据层面

咱们先来剖析数据层面,对于Selenium的操作,无论是点击、仍是输入、仍是强制等候等最多需求四样参数:

  1. 元素地址;
  2. 定位办法;
  3. 操作办法(点击/输入内容/强制等候/访问网址 等);
  4. 操作的值(部分操作有,例如:输入内容、强制等候操作需求、点击操作不需求);

现在咱们来用Excel实际的写一个测验用例【用户翻开禅道并输入正确的帐号暗码进行登录】:

曲鸟全栈UI自动化教学(七):使用Pytest来搭建自动化测试框架


清晰明了的知道了每步操作需求干嘛及运用了什么样的参数。


2)代码层面

用例写好了,该考虑如何写代码了。咱们需求写个办法来适配上述用例的履行,需求的功用点:

  1. 能依据填写的操作办法挑选正确的selenium的履行办法,例如上述用例中操作办法为get,那该办法会履行driver.get办法并将【操作的值】中的数据作为网址进行履行;
  2. 可以依据用例【定位办法】的内容挑选正确的定位办法进行履行;
  3. 元素地址可以正确的填写;
  4. 操作的值也是同理;

依据上述要求写了如下的代码,先看目录结构:

曲鸟全栈UI自动化教学(七):使用Pytest来搭建自动化测试框架


再看详细代码

1)main.py

import pytest
# 履行测验用例
pytest.main(['test_case.py'])

2)comDef.py

from openpyxl import load_workbook
def load_excel(file):
    """
    用于读取测验用例所在的表格
    """
    _data = load_workbook(file)
    _value = _data.active
    return _value
def parse_case(file):
    """
    用于将excel中的测验用例转为pytest可识别的测验用例
    """
    excel_value = load_excel(file)
    _cases = []
    for i in range(2, excel_value.max_row + 1):
        _cases.append({'path': excel_value['B' + str(i)].value, 'location_method': excel_value['C' + str(i)].value,
                       'action': excel_value['D' + str(i)].value, 'value': excel_value['E' + str(i)].value})
    return _cases

3)test_case.py

import pytest
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from comDef import parse_case
# 初始化driver
driver = webdriver.Chrome()
driver.implicitly_wait(2)
driver.maximize_window()
@pytest.mark.parametrize("data", parse_case('自动化测验用例.xlsx'))
def test_run_case(data):
    path, location_method = data.get('path'), data.get('location_method')
    action, value = data.get('action'), data.get('value')
    if path:
        if location_method:
            _driver = driver.find_element(getattr(By, location_method), path)
            if action == 'click':
                _driver.click()
            elif action == 'send_keys' and value:
                _driver.send_keys(value)
    elif value:
        if action == 'sleep':
            time.sleep(float(value))
        elif action == 'get':
            driver.get(value)
    else:
        return False

3)履行作用


曲鸟全栈UI自动化教学(七):使用Pytest来搭建自动化测试框架


六、总结

上面的代码看不懂没关系,后面会进行解说。(完整代码获取可以重视文末下方的大众号回复:项目代码,进行获取)现在咱们现已完成了一个自动化测验结构雏形,达到了数据和代码的分离,用户只需求填写excel就可以达到履行自动化测验的作用。

但刚刚也说了,这个结构只是个雏形,很多功用还还需添加,比方:

  1. 更多操作的封装(切换iframe,切换窗口,翻滚、获取文本等);
  2. 每步履行成功失利的校验和成果存储;
  3. 元素地址的办理;
  4. 测验报告的生成;
  5. 根据过程的断点调试;
  6. 用例失利重试;

小伙伴可以先按自己的理解进行上述功用的完成,后续我也会继续进行分享!