Commit a3601612 authored by 17322369953's avatar 17322369953
Browse files

air更新

parent 6c225100
# -*- encoding=utf8 -*-
__author__ = "Administrator"
"""
case_tag:api,baidu,sit,on
"""
from airtest.core.api import *
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from airtest_selenium.proxy import *
driver = WebChrome()
driver.implicitly_wait(20)
driver.get("https://www.baidu.com")
sleep(4)
driver.find_element_by_id("kw").send_keys("airtest")
sleep(4)
driver.airtest_touch(Template(r"tpl1691374901526.png", record_pos=(12.3, 2.8), resolution=(100, 100)))
# -*- encoding=utf8 -*-
__author__ = "Administrator"
"""
case_tag:api,baidu,sit,on
"""
from airtest.core.api import *
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from airtest_selenium.proxy import *
driver = WebChrome()
driver.implicitly_wait(20)
driver.get("https://www.baidu.com")
sleep(4)
driver.find_element_by_id("kw").send_keys("airtest")
sleep(4)
driver.airtest_touch(Template(r"tpl1691374901526.png", record_pos=(12.3, 2.8), resolution=(100, 100)))
...@@ -4,14 +4,14 @@ from common.common_func import commonFuc ...@@ -4,14 +4,14 @@ from common.common_func import commonFuc
__author__ = "meimengting" __author__ = "meimengting"
""" """
case_tag:api,medical-web11111,sit,on case_tag:api,medical-web,sit,on
""" """
from airtest.core.api import * from airtest.core.api import *
# import sys import sys
# sys.path.append('..') sys.path.append('..')
from common.db.db import dbOP from common.db.db import dbOP
# import time import time
# using("common_steps.air") # using("common_steps.air")
# import common_steps # import common_steps
# result_db = dbOP().selectSql('exp_expert', [0, 20]) # result_db = dbOP().selectSql('exp_expert', [0, 20])
...@@ -20,9 +20,9 @@ from common.db.db import dbOP ...@@ -20,9 +20,9 @@ from common.db.db import dbOP
enc_user_id可替换成接口实际所需要id,默认是u779700044448 enc_user_id可替换成接口实际所需要id,默认是u779700044448
获取token和时间戳 获取token和时间戳
""" """
# enc_user_id = 'u97969333801' enc_user_id = 'u97969333801'
# token = common_steps.check_token(enc_user_id) # token = common_steps.check_token(enc_user_id)
# timestamp = str(int(time.time())) timestamp = str(int(time.time()))
# "按照环境将url管理起来,更改api url后的接口名即可" # "按照环境将url管理起来,更改api url后的接口名即可"
# url = common_steps.get_api_url() # url = common_steps.get_api_url()
......
...@@ -14,9 +14,10 @@ from airtest.core.settings import Settings as ST ...@@ -14,9 +14,10 @@ from airtest.core.settings import Settings as ST
from airtest.utils.compat import decode_path, script_dir_name, script_log_dir from airtest.utils.compat import decode_path, script_dir_name, script_log_dir
from copy import copy from copy import copy
from common.logger import logger as LOG
class AirtestCase(unittest.TestCase):
class AirtestCase(unittest.TestCase):
PROJECT_ROOT = "." PROJECT_ROOT = "."
SCRIPTEXT = ".air" SCRIPTEXT = ".air"
TPLEXT = ".png" TPLEXT = ".png"
...@@ -50,17 +51,24 @@ class AirtestCase(unittest.TestCase): ...@@ -50,17 +51,24 @@ class AirtestCase(unittest.TestCase):
def runTest(self): def runTest(self):
scriptpath, pyfilename = script_dir_name(self.args.script) scriptpath, pyfilename = script_dir_name(self.args.script)
LOG.info(f'Final Error1,scriptpath:{scriptpath}')
LOG.info(f'Final Error2,scriptpath:{pyfilename}')
pyfilepath = os.path.join(scriptpath, pyfilename) pyfilepath = os.path.join(scriptpath, pyfilename)
LOG.info(f'Final Error3,scriptpath:{pyfilename}')
pyfilepath = os.path.abspath(pyfilepath) pyfilepath = os.path.abspath(pyfilepath)
LOG.info(f'Final Error4,scriptpath:{pyfilename}')
self.scope["__file__"] = pyfilepath self.scope["__file__"] = pyfilepath
with open(pyfilepath, 'r', encoding="utf8") as f: with open(pyfilepath, 'r', encoding="utf8") as f:
code = f.read() code = f.read()
pyfilepath = pyfilepath.encode(sys.getfilesystemencoding()) pyfilepath = pyfilepath.encode(sys.getfilesystemencoding())
LOG.info(f'Final Error5,scriptpath:{pyfilename}')
LOG.info(f'code.encode("utf-8"):{code.encode("utf-8")}')
try: try:
exec(compile(code.encode("utf-8"), pyfilepath, 'exec'), self.scope) exec(compile(code.encode("utf-8"), pyfilepath, 'exec'), self.scope)
except Exception as err: except Exception as err:
tb = traceback.format_exc() tb = traceback.format_exc()
LOG.error(f'traceback.format_exc(){traceback.format_exc()}')
log("Final Error", tb) log("Final Error", tb)
six.reraise(*sys.exc_info()) six.reraise(*sys.exc_info())
......
...@@ -109,13 +109,14 @@ class commonFuc(object): ...@@ -109,13 +109,14 @@ class commonFuc(object):
result = requests.post(url, data=json.dumps(postdata), headers=header) result = requests.post(url, data=json.dumps(postdata), headers=header)
result = json.loads(result.content) result = json.loads(result.content)
return result return result
#删除请求
def http_delte(self, url,header): # 删除请求
def http_delte(self, url, header):
""" """
一个post请求,返回json 一个post请求,返回json
""" """
# result = requests.post(url, data=postdata, headers=header) # result = requests.post(url, data=postdata, headers=header)
result = requests.delete(url,headers=header) result = requests.delete(url, headers=header)
result = json.loads(result.content) result = json.loads(result.content)
return result return result
...@@ -129,6 +130,9 @@ class commonFuc(object): ...@@ -129,6 +130,9 @@ class commonFuc(object):
actual_value = self.analysis_json(k, result) actual_value = self.analysis_json(k, result)
assert_equal(str(v).replace(" ", ""), str(actual_value).replace(" ", "")) assert_equal(str(v).replace(" ", ""), str(actual_value).replace(" ", ""))
def check_equal(self, one, two):
assert_equal(one, two, f'{one}{two}不相等,失败')
def analysis_json(self, key, result): def analysis_json(self, key, result):
""" """
解析json 解析json
...@@ -151,7 +155,6 @@ class commonFuc(object): ...@@ -151,7 +155,6 @@ class commonFuc(object):
pass pass
return res return res
def typeof(self, variate): def typeof(self, variate):
""" """
变量类型 变量类型
...@@ -301,6 +304,13 @@ class commonFuc(object): ...@@ -301,6 +304,13 @@ class commonFuc(object):
return url return url
def step_ok_info(self, info):
assert_equal('step_ok', 'step_ok', info)
def step_fail_info(self, driver, info):
#driver.snapshot()
assert_equal('step_fail', 'step_fail_plus', info)
def login_backend(self, driver): def login_backend(self, driver):
driver.get(self.get_url()) driver.get(self.get_url())
sleep(3) sleep(3)
...@@ -363,12 +373,13 @@ class commonFuc(object): ...@@ -363,12 +373,13 @@ class commonFuc(object):
结果检查,检查文本内容是否存在于返回结果中 结果检查,检查文本内容是否存在于返回结果中
""" """
Flag = False Flag = False
check_text=str(check_text) check_text = str(check_text)
# print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values())) # print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values()))
if check_text in str(result.values()): if check_text in str(result.values()):
Flag = True Flag = True
# print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa',Flag) # print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa',Flag)
assert_equal(Flag, True, '验证文本' + check_text + "存在") assert_equal(Flag, True, '验证文本' + check_text + "存在")
def check_text_no_exist(self, check_text, result): def check_text_no_exist(self, check_text, result):
""" """
结果检查,检查文本内容是否存在于返回结果中 结果检查,检查文本内容是否存在于返回结果中
...@@ -385,7 +396,7 @@ class commonFuc(object): ...@@ -385,7 +396,7 @@ class commonFuc(object):
结果检查,检查文本内容是否存在于返回结果中,返回结果也是文本 结果检查,检查文本内容是否存在于返回结果中,返回结果也是文本
""" """
Flag = False Flag = False
check_text=str(check_text) check_text = str(check_text)
# print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values())) # print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values()))
if check_text in result_text: if check_text in result_text:
Flag = True Flag = True
...@@ -522,23 +533,25 @@ class commonFuc(object): ...@@ -522,23 +533,25 @@ class commonFuc(object):
chrome.get(url) chrome.get(url)
return chrome return chrome
def logIn(self, username, password, login_button,chrome): def logIn(self, username, password, login_button, chrome):
chrome.find_element_by_xpath(username).clear() chrome.find_element_by_xpath(username).clear()
chrome.find_element_by_xpath(username).send_keys('xhs') chrome.find_element_by_xpath(username).send_keys('xhs')
chrome.find_element_by_xpath(password).clear() chrome.find_element_by_xpath(password).clear()
chrome.find_element_by_xpath(password).send_keys('a123456!') chrome.find_element_by_xpath(password).send_keys('a123456!')
chrome.find_element_by_xpath(login_button).click() chrome.find_element_by_xpath(login_button).click()
def check_login_result(self,username,chrome):
def check_login_result(self, username, chrome):
for i in range(10000): for i in range(10000):
sleep(1) sleep(1)
try: try:
if (chrome.find_element_by_xpath('//div[text()=" %s "]' % username)).is_displayed(): if (chrome.find_element_by_xpath('//div[text()=" %s "]' % username)).is_displayed():
print('看看这里显示了没有',username) print('看看这里显示了没有', username)
break break
except: except:
continue continue
return chrome.find_element_by_xpath('//div[text()=" %s "]' % username).text return chrome.find_element_by_xpath('//div[text()=" %s "]' % username).text
def quit_chrome(self,chrome):
def quit_chrome(self, chrome):
chrome.quit() chrome.quit()
# 获取当前项目的根目录的路径 # 获取当前项目的根目录的路径
...@@ -547,4 +560,4 @@ class commonFuc(object): ...@@ -547,4 +560,4 @@ class commonFuc(object):
curPath = os.path.abspath(os.path.dirname(__file__)) # 获取当前文件的所在目录的绝对路径 curPath = os.path.abspath(os.path.dirname(__file__)) # 获取当前文件的所在目录的绝对路径
# print(os.path.split(curPath)) # print(os.path.split(curPath))
rootPath = os.path.split(curPath)[0] rootPath = os.path.split(curPath)[0]
return rootPath return rootPath
\ No newline at end of file
...@@ -74,4 +74,4 @@ class Log(object): ...@@ -74,4 +74,4 @@ class Log(object):
# 实例化,后面直接引入使用 # 实例化,后面直接引入使用
log = Log().logger logger = Log().logger
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# 该功能为读取yaml数据功能 # 该功能为读取yaml数据功能
import yaml import yaml
import os import os
from common.logger import log from common.logger import logger
def read_yaml(yaml_path): def read_yaml(yaml_path):
...@@ -11,7 +11,7 @@ def read_yaml(yaml_path): ...@@ -11,7 +11,7 @@ def read_yaml(yaml_path):
参数path: 相对路径,起始路径:项目的根目录 参数path: 相对路径,起始路径:项目的根目录
realPath: 文件的真实路径,绝对路径地址 ''' realPath: 文件的真实路径,绝对路径地址 '''
if not os.path.isfile(yaml_path): if not os.path.isfile(yaml_path):
log.error("文件路径不存在,请检查路径是否正确:%s" % yaml_path) logger.error("文件路径不存在,请检查路径是否正确:%s" % yaml_path)
raise FileNotFoundError("文件路径不存在,请检查路径是否正确:%s" % yaml_path) raise FileNotFoundError("文件路径不存在,请检查路径是否正确:%s" % yaml_path)
# open方法打开直接读出来 # open方法打开直接读出来
f = open(yaml_path, 'r', encoding='utf-8') f = open(yaml_path, 'r', encoding='utf-8')
...@@ -31,9 +31,9 @@ def get_filed_from_yaml(module, file, field): ...@@ -31,9 +31,9 @@ def get_filed_from_yaml(module, file, field):
project_dir = os.path.dirname(common_dir) project_dir = os.path.dirname(common_dir)
# 开始拼接目录 # 开始拼接目录
yaml_path = project_dir + os.sep + "data" + os.sep + module + os.sep + file + ".yaml" yaml_path = project_dir + os.sep + "data" + os.sep + module + os.sep + file + ".yaml"
log.info(f'当前的yaml文件路径:{yaml_path}') logger.info(f'当前的yaml文件路径:{yaml_path}')
# 获取读取的结果,为字典形式 # 获取读取的结果,为字典形式
dictionary = read_yaml(yaml_path) dictionary = read_yaml(yaml_path)
log.info(f'文件{file}中字段{field}值为{dictionary[field]}') logger.info(f'文件{file}中字段{field}值为{dictionary[field]}')
# 专门返回指定的栏位 # 专门返回指定的栏位
return dictionary[field] return dictionary[field]
...@@ -2,11 +2,11 @@ import os ...@@ -2,11 +2,11 @@ import os
from pytesseract import image_to_string from pytesseract import image_to_string
from PIL import Image, ImageEnhance from PIL import Image, ImageEnhance
from common.logger import log from common.logger import logger
def gen_text_from_picture(element_screenshot_path): def gen_text_from_picture(element_screenshot_path):
log.info('开始解析验证码') logger.info('开始解析验证码')
# 打开图片,将图片转换为obj # 打开图片,将图片转换为obj
image = Image.open(element_screenshot_path) image = Image.open(element_screenshot_path)
# 图片2直化 # 图片2直化
...@@ -20,7 +20,7 @@ def gen_text_from_picture(element_screenshot_path): ...@@ -20,7 +20,7 @@ def gen_text_from_picture(element_screenshot_path):
verify_code_text = image_to_string(image2) verify_code_text = image_to_string(image2)
# 针对平台,去掉最后一个字符“\n”,不同的平台最后一个字符可能不一样 # 针对平台,去掉最后一个字符“\n”,不同的平台最后一个字符可能不一样
verify_code_text_no_wrap = verify_code_text.replace('\n', '') verify_code_text_no_wrap = verify_code_text.replace('\n', '')
log.info("当前验证码的文字为:" + verify_code_text_no_wrap) logger.info("当前验证码的文字为:" + verify_code_text_no_wrap)
# 使用完成后关闭 # 使用完成后关闭
image.close() image.close()
# 返回验证码 # 返回验证码
...@@ -52,21 +52,21 @@ class VerifyCode(object): ...@@ -52,21 +52,21 @@ class VerifyCode(object):
page_shot_obj = Image.open(page_screenshot_path) page_shot_obj = Image.open(page_screenshot_path)
# 获取验证码元素图片的位置 # 获取验证码元素图片的位置
location = self.web_element.location location = self.web_element.location
log.debug("验证码元素图片位置:%s" % location) logger.debug("验证码元素图片位置:%s" % location)
# 获取验证码元素图片的大小 # 获取验证码元素图片的大小
size = self.web_element.size size = self.web_element.size
log.debug("验证码元素图片大小:%s" % size) logger.debug("验证码元素图片大小:%s" % size)
# 获取图片的四个坐标点 # 获取图片的四个坐标点
left = location['x'] left = location['x']
bottom = location['y'] bottom = location['y']
right = left + size['width'] right = left + size['width']
top = bottom + size['height'] top = bottom + size['height']
log.debug("图片的四个位置。左:%s右:%s上:%s下:%s" % (left, right, top, bottom)) logger.debug("图片的四个位置。左:%s右:%s上:%s下:%s" % (left, right, top, bottom))
# 开始按照位置截图 # 开始按照位置截图
crop_image_obj = page_shot_obj.crop((left, bottom, right, top)) crop_image_obj = page_shot_obj.crop((left, bottom, right, top))
# 将切割好的图片保存 # 将切割好的图片保存
crop_image_obj.save(element_screenshot_path) crop_image_obj.save(element_screenshot_path)
# 识别验证码中的字符 # 识别验证码中的字符
verify_code_text = gen_text_from_picture(element_screenshot_path) verify_code_text = gen_text_from_picture(element_screenshot_path)
log.debug("当前验证码的文字为:%s" % verify_code_text) logger.debug("当前验证码的文字为:%s" % verify_code_text)
return verify_code_text return verify_code_text
from math import radians, cos, sin, asin, sqrt
from common.common_func import commonFuc
import json
class businessFuc(object):
def diff_years(self, source_year, target_year):
"""
计算两个日期之间相差的年数
:param target_year: 当前时间
:param source_year: 原始年日期
:return:
"""
years = int(target_year.strftime('%Y')) - int(str(source_year).split("-")[0])
return years
def geopy_distance(self, lng1, lat1, lng2, lat2):
"""
计算两个经纬度之间的距离
:return:
"""
lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)])
dlon = lng2 - lng1
dlat = lat2 - lat1
a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
distance = 2 * asin(sqrt(a)) * 6371 * 1000 # 地球平均半径,6371km
distance = round(distance / 1000, 3)
return distance
def get_globalsid(self):
login_url = commonFuc().get_business_data("", "login_url")
result = commonFuc().http_get(login_url)
return result["sid"]
# 默认数据
"enc_user_id": "u779700044448"
"headers": {
'clientInfo': '{"birthday":"2018-11-18","screenwidth":"375","clientVersion":"2.4.2","screenheight":"667","partner":"meitunmama","clientip":"10.180.81.127","traderName":"iPhone 6S","clientAppVersion":"2.4.2","clientYunyuVersion":"7.9.6","clientSystem":"ios","nettype":"wifi","deviceCode":"1f4b3860acfa303bca0407f5128bc5ea0f529fec"}',
'platform': "1",
'signature': "144c6b3c78fc20ad57da1ebdb879615b",
'token': "%s",
'timestamp': "%s",
}
payload: {}
"post_headers": {
'clientInfo': '{"birthday":"2018-11-18","screenwidth":"375","clientVersion":"2.4.2","screenheight":"667","partner":"meitunmama","clientip":"10.180.81.127","traderName":"iPhone 6S","clientAppVersion":"2.4.2","clientYunyuVersion":"7.9.6","clientSystem":"ios","nettype":"wifi","deviceCode":"1f4b3860acfa303bca0407f5128bc5ea0f529fec"}',
'platform': "1",
'signature': "144c6b3c78fc20ad57da1ebdb879615b",
'token': "%s",
'timestamp': "%s",
'Content-Type': "%s",
}
default_contentType: "application/x-www-form-urlencoded"
login_url: "http://backend-web-backend-web.1.java.babytree-test.com/sso-service/login?loginName=test001&pwd=test001@123"
\ No newline at end of file
172.16.10.203 api.babytree-dev.com
172.16.10.203 api-test11.babytree-test.com
172.16.10.203 api.test11.babytree-fpm.com
172.16.10.203 api.babytree.com
# online
10.54.11.80 idb.baobaoshu.com
10.54.11.80 grafana.baobaoshu.com
10.54.11.80 zabbix.baobaoshu.com
10.54.11.80 cacti.baobaoshu.com
10.54.11.80 ucm.baobaoshu.com
10.54.11.80 rundeck.baobaoshu.com dubbo.baobaoshu.com
10.54.11.80 cmdb.baobaoshu.com
10.54.11.80 apollo.baobaoshu.com muse.baobaoshu.com
10.54.11.80 splunk.baobaoshu.com
172.16.10.203 test100.babytree-dev.com g.babytree-dev.com
122.9.41.244 gerrit.babytree-inc.com
10.54.17.153 localproxy.baobaoshu.com
192.168.24.43 gerrit.mtmm.com
#10.17.65.22 case.cmic.com.cn
10.54.50.90 sso.baobaoshu.com
8.131.247.52 docp.plt.babytree-inc.com
10.17.65.49 spd2hospitaltest2.cmic.com.cn
#10.17.65.49 spd2hospitaluat.cmic.com.cn
10.17.65.49 case.cmic.com.cn
user:
live: 6ea032c10ef24b10aa7fcfe5424446afin01
pre: 6ea032c10ef24b10aa7fcfe5424446afin01
health:
live: 6013c13418a245b9866e9cdec92ff9b9in01
pre : 6013c13418a245b9866e9cdec92ff9b9in01
sit: health
alimall:
live: f4d539e7b8204a8890929320f2052d68in01
pre : f4d539e7b8204a8890929320f2052d68in01
sit: alimall
promotion:
live: 9e33dd3e26a54c8caeaf871e873edb38in01
pre: 9e33dd3e26a54c8caeaf871e873edb38in01
sit: promotion
salesorder:
live: 7f9c968b57084c0782aeb620e2a064b1in01
pre : 7f9c968b57084c0782aeb620e2a064b1in01
sit: salesorder
seller:
live: 2888c1775daf4c60897073068b6c219ain01
pre: 2888c1775daf4c60897073068b6c219ain01
sit: seller
cms:
live: 790afd094355416895ca39891c09c0d3in01
pre: 790afd094355416895ca39891c09c0d3in01
sit: cms
community:
live: 790afd094355416895ca39891c09c0d3in01
pre: 790afd094355416895ca39891c09c0d3in01
sit: community
price:
live: 6ea032c10ef24b10aa7fcfe5424446afin01
pre: 6ea032c10ef24b10aa7fcfe5424446afin01
sit: price
medical:
live: 89a813f93c454db0a23c25f95c0d2e2cin01
pre: 89a813f93c454db0a23c25f95c0d2e2cin01
sit: medical
bcoin:
live: f4d539e7b8204a8890929320f2052d68in01
pre: f4d539e7b8204a8890929320f2052d68in01
sit: bcoin
edu:
live: 8e7f2572f92e49f4b0061f75682470eain01
pre: 8e7f2572f92e49f4b0061f75682470eain01
sit: edu
account:
live: 2888c1775daf4c60897073068b6c219ain01
pre: 2888c1775daf4c60897073068b6c219ain01
sit: account
finance:
live: 6013c13418a245b9866e9cdec92ff9b9in01
pre: 6013c13418a245b9866e9cdec92ff9b9in01
sit: finance
socialec:
live: 89a813f93c454db0a23c25f95c0d2e2cin01
pre: 89a813f93c454db0a23c25f95c0d2e2cin01
sit: socialec
item:
live: 2888c1775daf4c60897073068b6c219ain01
pre: 2888c1775daf4c60897073068b6c219ain01
sit: item
new_wms:
live: 89a813f93c454db0a23c25f95c0d2e2cin01
pre: 89a813f93c454db0a23c25f95c0d2e2cin01
sit: new_wms
distribution:
live: 8e7f2572f92e49f4b0061f75682470eain01
pre: 8e7f2572f92e49f4b0061f75682470eain01
sit: distribution
supplier:
live: 790afd094355416895ca39891c09c0d3in01
sit: supplier
local:
live: pc-2zerh8cqy748e33i8
sit : b9e5fbff-08e9-11ed-866f-00163e324a72
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment