python+selenium+unittest 自动化测试

1、业余兴趣玩玩自动化接口测试,但是接口需要传输cookie,则先利用模拟UI登陆获取cookie:

#coding=utf-8
from selenium import webdriver
import time,datetime
from selenium.webdriver.firefox.options import Options
import unittest


def TestUI():
     # 设置为无界面浏览器
     options = Options()
     options.add_argument('--headless')

     # 打开浏览器
     driver = webdriver.Firefox(options=options)
     #driver = webdriver.Firefox(executable_path = 'C:/Program Files (x86)/Mozilla Firefox/geckodriver')
     driver.get('http://XXX.com/') ###实际url
     #driver.find_elements_by_class_name(tips_btn).click()
     driver.find_element_by_link_text('请点击登录').click()
     #time.sleep(10)
     driver.find_element_by_xpath("/html/body/div[2]/div[2]/div[1]/div/div[3]/a").click()
     #driver.find_element_by_xpath("//*[@id="loginname"]").input("xxx")
     #driver.find_element_by_xpath("//*[@id="nloginpwd"]").input("xxx")
     driver.find_element_by_id("loginname").send_keys("xxx")
     driver.find_element_by_id("nloginpwd").send_keys("xxx")
     driver.find_element_by_id("loginsubmit").click()
     #driver.find_element_by_xpath("/html/body/div[2]/div[1]/div/a[1]").click()
     time.sleep(2)
     #driver.find_element_by_xpath("//*[@id="dowebok"]/div[1]/div/a[1]").click()
     driver.find_element_by_link_text('开始玩转魔方').click()
     cookies = driver.get_cookies()
     #print(cookies)
     cookie_dict={}
     for cookie in cookies:
        cookie_dict[cookie['name']]=cookie['value']
     #print(cookie_dict)
     #print(type(cookie_dict))
     return(cookie_dict)

     #print(type(cookie_dict))
if __name__ == '__main__':
    cookie=TestUI()

 

  (a) 利用无界面浏览器进行UI模拟登陆,则先将火狐浏览器exe路径加入环境变量,然后在代码中加入headless下面代码即可,则浏览器识别后不现实界面

    # 设置为无界面浏览器
     options = Options()
     options.add_argument('--headless')

     # 打开浏览器
     driver = webdriver.Firefox(options=options)

(b)在定位元素根据元素属性进行定位,对于一眼就能找到元素属性的直接使用该属性定位,例如link_tex、id...这类,对于较难看出元素属性的直接使用find_element_by_xpath进行定位,xpath路径可通过鼠标右键复制xpath获取

  (ca)   登陆进页面后,通过get_cookies()获取页面cookies,由于获取的cookies是列表格式,则将其转换为字典格式cookie_dict

2、获取到cookie后进行unittest测试用例管理

import unittest
import json
import requests
from demo import TestUI

#继承自unittest.TestCase类
class TestPort(unittest.TestCase):

    #环境配置:进行测试前的初始化工作
    @classmethod
    def setUpClass(cls):
        #self.run1 = RunMain()
        print("start----------------------------------------------------------")
        #cookie_dict =
        globals()["cookie_dict"] = TestUI()


    def test_01(self):
        #cookies = [str(j) for j in cookie]
        # print(cookies)
        #cookiess=''.join(cookies)
        #print(cookiess)
        #cookie_dict = eval(cookiess)
        #cookie_dict=TestUI()
        url = "XXX"
        method = 'post'
        data = {
            'pi': 1,
            'ps': 10,
            'type': 0,
            'st': 0,
            'oc': 2
        }
        headres= {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36 ' ,
            #'cookie':  cookie
        }
       
        response=requests.post(url, headers=headres,cookies=globals()["cookie_dict"])
        #print(response.text)
        print(response.json())
        #print(json.dumps(response, sort_keys=True, indent=2))

    def test_02(self):
        url = "http://XXX"
        method = 'post'
        data = {
            'pi': 1,
            'ps': 10,
            'type': 0,
            'st': 0,
            'oc': 2
        }
        headres = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36 ',
            # 'cookie':  cookie
        }

        response = requests.post(url, headers=headres, cookies=globals()["cookie_dict"])
        # print(response.text)
        print(response.json())




if __name__ == '__main__':
    #unittest.main()----执行全部用例
    # 1、构造用例集
    suite = unittest.TestCase()
    #2、执行测试用例顺序
    suite.addTest(TestPort('test_01'))
    suite.addTest(TestPort('test_02'))
    #3、实例化runner类
    runner=unittest.TextTestRunner()
    #4、执行测试
    runner.run(suite)

(a)如何让多个用例共用setup、teardown

unittest的setup、teardown会在每个用例执行前后执行一次,像例子,只需要setup执行一次,针对该种场景,unittest的处理方法是使用setupclass、teardownclass,注意@classmethod的使用,即可实现在test用例执行前执行一次setUp,待用例执行完后,执行次teardownclass

(b)setUp中实现用例之间共享变量

    1、setupclass里设置self.xxx变量,不同用例之间无法实时共享参数变动

    2、setupclass里设置globals().[“xxx”]变量,不同用例之间可以实时共享参数变动

    3、setupclass里设置 ClassName.XXX变量,不同用例之间可以实时共享参数变动

    4、setupclass之前设置 XXX变量

    本例需要将cookie设置为全局变量,则将cookie设置为globals()["cookie"],在用例间调用此全局变量即可

(c)unittes.request.post传输的cookie参数是字典格式,即传输字典格式的cookie_dict即可

(d)对于main主函数里的即为对执行哪些测试用例进行操作

3、unittest的工作原理

编写TestCase,由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,最后将运行的结果保存在TextTestResult中

ps:整理ing

 

 

 
 

你可能感兴趣的:(python)