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