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
__author__ = "meimengting"
"""
case_tag:api,medical-web11111,sit,on
case_tag:api,medical-web,sit,on
"""
from airtest.core.api import *
# import sys
# sys.path.append('..')
import sys
sys.path.append('..')
from common.db.db import dbOP
# import time
import time
# using("common_steps.air")
# import common_steps
# result_db = dbOP().selectSql('exp_expert', [0, 20])
......@@ -20,9 +20,9 @@ from common.db.db import dbOP
enc_user_id可替换成接口实际所需要id,默认是u779700044448
获取token和时间戳
"""
# enc_user_id = 'u97969333801'
enc_user_id = 'u97969333801'
# token = common_steps.check_token(enc_user_id)
# timestamp = str(int(time.time()))
timestamp = str(int(time.time()))
# "按照环境将url管理起来,更改api url后的接口名即可"
# url = common_steps.get_api_url()
......
......@@ -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 copy import copy
from common.logger import logger as LOG
class AirtestCase(unittest.TestCase):
class AirtestCase(unittest.TestCase):
PROJECT_ROOT = "."
SCRIPTEXT = ".air"
TPLEXT = ".png"
......@@ -50,17 +51,24 @@ class AirtestCase(unittest.TestCase):
def runTest(self):
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)
LOG.info(f'Final Error3,scriptpath:{pyfilename}')
pyfilepath = os.path.abspath(pyfilepath)
LOG.info(f'Final Error4,scriptpath:{pyfilename}')
self.scope["__file__"] = pyfilepath
with open(pyfilepath, 'r', encoding="utf8") as f:
code = f.read()
pyfilepath = pyfilepath.encode(sys.getfilesystemencoding())
LOG.info(f'Final Error5,scriptpath:{pyfilename}')
LOG.info(f'code.encode("utf-8"):{code.encode("utf-8")}')
try:
exec(compile(code.encode("utf-8"), pyfilepath, 'exec'), self.scope)
except Exception as err:
tb = traceback.format_exc()
LOG.error(f'traceback.format_exc(){traceback.format_exc()}')
log("Final Error", tb)
six.reraise(*sys.exc_info())
......
......@@ -109,13 +109,14 @@ class commonFuc(object):
result = requests.post(url, data=json.dumps(postdata), headers=header)
result = json.loads(result.content)
return result
#删除请求
def http_delte(self, url,header):
# 删除请求
def http_delte(self, url, header):
"""
一个post请求,返回json
"""
# 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)
return result
......@@ -129,6 +130,9 @@ class commonFuc(object):
actual_value = self.analysis_json(k, result)
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):
"""
解析json
......@@ -151,7 +155,6 @@ class commonFuc(object):
pass
return res
def typeof(self, variate):
"""
变量类型
......@@ -301,6 +304,13 @@ class commonFuc(object):
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):
driver.get(self.get_url())
sleep(3)
......@@ -363,12 +373,13 @@ class commonFuc(object):
结果检查,检查文本内容是否存在于返回结果中
"""
Flag = False
check_text=str(check_text)
check_text = str(check_text)
# print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values()))
if check_text in str(result.values()):
Flag = True
# print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa',Flag)
assert_equal(Flag, True, '验证文本' + check_text + "存在")
def check_text_no_exist(self, check_text, result):
"""
结果检查,检查文本内容是否存在于返回结果中
......@@ -385,7 +396,7 @@ class commonFuc(object):
结果检查,检查文本内容是否存在于返回结果中,返回结果也是文本
"""
Flag = False
check_text=str(check_text)
check_text = str(check_text)
# print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values()))
if check_text in result_text:
Flag = True
......@@ -522,23 +533,25 @@ class commonFuc(object):
chrome.get(url)
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).send_keys('xhs')
chrome.find_element_by_xpath(password).clear()
chrome.find_element_by_xpath(password).send_keys('a123456!')
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):
sleep(1)
try:
if (chrome.find_element_by_xpath('//div[text()=" %s "]' % username)).is_displayed():
print('看看这里显示了没有',username)
print('看看这里显示了没有', username)
break
except:
continue
return chrome.find_element_by_xpath('//div[text()=" %s "]' % username).text
def quit_chrome(self,chrome):
def quit_chrome(self, chrome):
chrome.quit()
# 获取当前项目的根目录的路径
......@@ -547,4 +560,4 @@ class commonFuc(object):
curPath = os.path.abspath(os.path.dirname(__file__)) # 获取当前文件的所在目录的绝对路径
# print(os.path.split(curPath))
rootPath = os.path.split(curPath)[0]
return rootPath
\ No newline at end of file
return rootPath
......@@ -74,4 +74,4 @@ class Log(object):
# 实例化,后面直接引入使用
log = Log().logger
logger = Log().logger
......@@ -3,7 +3,7 @@
# 该功能为读取yaml数据功能
import yaml
import os
from common.logger import log
from common.logger import logger
def read_yaml(yaml_path):
......@@ -11,7 +11,7 @@ def read_yaml(yaml_path):
参数path: 相对路径,起始路径:项目的根目录
realPath: 文件的真实路径,绝对路径地址 '''
if not os.path.isfile(yaml_path):
log.error("文件路径不存在,请检查路径是否正确:%s" % yaml_path)
logger.error("文件路径不存在,请检查路径是否正确:%s" % yaml_path)
raise FileNotFoundError("文件路径不存在,请检查路径是否正确:%s" % yaml_path)
# open方法打开直接读出来
f = open(yaml_path, 'r', encoding='utf-8')
......@@ -31,9 +31,9 @@ def get_filed_from_yaml(module, file, field):
project_dir = os.path.dirname(common_dir)
# 开始拼接目录
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)
log.info(f'文件{file}中字段{field}值为{dictionary[field]}')
logger.info(f'文件{file}中字段{field}值为{dictionary[field]}')
# 专门返回指定的栏位
return dictionary[field]
......@@ -2,11 +2,11 @@ import os
from pytesseract import image_to_string
from PIL import Image, ImageEnhance
from common.logger import log
from common.logger import logger
def gen_text_from_picture(element_screenshot_path):
log.info('开始解析验证码')
logger.info('开始解析验证码')
# 打开图片,将图片转换为obj
image = Image.open(element_screenshot_path)
# 图片2直化
......@@ -20,7 +20,7 @@ def gen_text_from_picture(element_screenshot_path):
verify_code_text = image_to_string(image2)
# 针对平台,去掉最后一个字符“\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()
# 返回验证码
......@@ -52,21 +52,21 @@ class VerifyCode(object):
page_shot_obj = Image.open(page_screenshot_path)
# 获取验证码元素图片的位置
location = self.web_element.location
log.debug("验证码元素图片位置:%s" % location)
logger.debug("验证码元素图片位置:%s" % location)
# 获取验证码元素图片的大小
size = self.web_element.size
log.debug("验证码元素图片大小:%s" % size)
logger.debug("验证码元素图片大小:%s" % size)
# 获取图片的四个坐标点
left = location['x']
bottom = location['y']
right = left + size['width']
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.save(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
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