1. 程式人生 > >RF REST介面測試自定義方法

RF REST介面測試自定義方法

1,自定義介面json

{
  "url": "http:xxxxxxxxxx",
  "method": "POST",
  "body": {
    "username": "name",
    "password": "pwd"
  }
}

2、請求處理方法類

注:以下方法主要有update和delete方法中修改url然後傳送請求,其餘post和get請求關注requrl方法即可

# coding = utf-8
import pytesseract
from PIL import Image
from selenium import webdriver
import selenium
import time
import json
import requests


class Base_login():
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
          }

    def __init__(self):
        pass

    # def mark(self, f):
    #     def warpars(**kwargs):
    #         print('%s is start!'.center(100, '=') % f)
    #         f()
    #         print('%s is end!'.center(100, '=') % f)
    #         return f()
    #     return warpars()

    def check_login(self, url, username, passwd, img_dir='D:\payimg'):
        '''
        :param url:
        :param username:
        :param passwd:
        :param img_dir:
        :return: jesssid  token
        '''
        i = 1
        while i < 4:
            driver = webdriver.Chrome()
            driver.set_window_size(1200, 900)
            time.sleep(2)
            driver.get(url)
            time.sleep(1)
            # save image to img_dir
            driver.get_screenshot_as_file(img_dir + '\\checkcode.png')
            # transfer checkcode
            img = Image.open(img_dir + '\\checkcode.png')
            # box = (836, 368, 939, 402)
            box = (765, 315, 855, 345)
            codeshot = img.crop(box)
            codeshot.save(img_dir + '\\code.png')
            checkcode = pytesseract.image_to_string(codeshot).replace(" ", "")
            print('The checkcode is:', checkcode)
            # input login info
            driver.find_element_by_xpath('//*[@id="loginAccount"]').send_keys(username)
            driver.find_element_by_xpath('//*[@id="password"]').send_keys(passwd)
            driver.find_element_by_xpath('//*[@id="randCode"]').send_keys(checkcode)
            driver.find_element_by_xpath('//*[@id="btn_login"]').click()
            time.sleep(6)
            try:
                driver.find_element_by_xpath('//*[@id="page-wrapper"]/div[1]/nav/div/a')
                break
            except selenium.common.exceptions.NoSuchElementException:
                print('failed to catch checkcode %s' % i)
                driver.quit()
            i = i + 1
        cookieL = driver.get_cookies()
        htmlS = driver.page_source
        print(cookieL)
        tokenp = htmlS.split('\n')[2].strip(' ')
        print(tokenp)
        assert len(tokenp) > 1, 'Get token failed'
        token = tokenp.split(' ')[2].split('=')[1].strip('\"')
        print('====%s====' % token)
        session = cookieL[0].setdefault('value')
        print(session)
        driver.quit()
        return session, token

    def set_header(self, jessionid, token=''):
        """
        Prepar the request headers for request
        :param jessionid: session
        :param token: token
        :return: headers
        """
        cook = 'JSESSIONID=' + jessionid
        Base_login.headers['Cookie'] = cook
        Base_login.headers['X-CSRF-TOKEN'] = token
        header = Base_login.headers
        print('The request headers is:', header)
        return header

    def set_params(self, jsonf, **kwargs):
        """
        load jsonf and return data dict
        :param jsonf: json file
        :param kwargs: need to modify params
        :return: data dict
        """
        with open(jsonf, 'r') as jp:
            jdata = json.loads(jp.read())
        print('data is:', jdata)
        data = jdata["body"]
        print(kwargs)
        if len(kwargs) != 0:
            for wrg in kwargs:
                assert wrg in data, 'Params error! do not in json file!'
                data[wrg] = kwargs[wrg]
        print('new data is:', jdata)
        return jdata

    def reqUrl(self, jsonf, jessionid, token='', **kw):
        """
        Useage: The common request method ,it can be used for send all post and get request!
        :param jsonf: json file
        :param jessionid: sessionid
        :param token: token
        :return: json string of response
        """
        jdata = Base_login.set_params(self, jsonf, **kw)
        headers = Base_login.set_header(self, jessionid, token=token)
        print(jdata)
        url = jdata["url"]
        data = jdata["body"]
        print('The request method is:', jdata["method"])
        if jdata["method"] == 'POST':
            resp = requests.post(url, data=data, headers=headers)
        else:
            resp = requests.get(url, params=data, headers=headers)
        assert resp.status_code == 200, 'requests is bad, request code is: %s' % resp.status_code
        print(resp.json())
        return resp.json()

    def deal_result(self, resp, id):
        """
        deal with resp and return need datalist
        :param resp: response of inquire result
        :param id: param for you need
        :param kwargs:
        :return:
        """
        print(type(resp))
        if type(resp) == 'str':
            print('111')
            redic = json.loads(resp.decode('utf-8'))
        else:
            redic = resp
        datalist = redic['data']['dataList']
        idlist = []
        for data in datalist:
            if id in data:
                idlist.append(data[id])
        print('id list is:', idlist)
        if len(idlist) == 1:
            return idlist[0]
        else:
            return idlist

    def get_datavalue(self, resp, key):
        # print(type(resp))
        if type(resp) == 'str':
            print('111')
            redic = json.loads(resp.decode('utf-8'))
        else:
            redic = resp
        datalist = redic['data']['dataList']
        value = datalist[0][key]
        print(value)
        return value

    def delorupdate(self, jsonf, updateid, jessionid, model='update', token='', **kwargs):
        """
        if request is del or update ,updata spacial json file.
        :param jsonf: update json file
        :param updateid: modify id
        :param model: update or del
        :param kwargs: update keyword
        :return:
        """
        headers = Base_login.set_header(self, jessionid, token=token)
        with open(jsonf, 'r') as jp:
            datad = json.loads(jp.read())
        print('data is:', datad)
        updateid = str(updateid)
        datad['url'] = datad['url'].replace('modifyid', updateid)
        print('url is:', datad['url'])
        if model == 'update':
            datad['body'] = {}
            for updated in kwargs:
                datad['body'][updated] = kwargs[updated]
            resp = requests.post(datad['url'], data=datad['body'], headers=headers)
        else:
            resp = requests.post(datad['url'], headers=headers)
        print('new data is:', datad)
        assert resp.status_code == 200, 'request faild!'
        print(resp.json())
        return resp.json()


if __name__ == '__main__':
    bl = Base_login()
    fp = '../Test_data/json/system/inquireuser.json'
    fd = '../Test_data/json/system/deleteuser.json'
    jess, token = bl.check_login(r'http:xxxxxxx/login', 'admin', '123456')
    resp = bl.reqUrl(fp, jess, token, mvnoCode='autotest1')
    dl, idl = bl.deal_result(resp, 'userId')
    rr = bl.delorupdate(fd, idl[0], jess, 'delete', token)