1. 优化步骤出错处理
2. 精简打印内容
3. 修改截图格式为 png
This commit is contained in:
jerrylizilong 2018-09-14 14:21:06 +08:00
parent bd1cb30af0
commit c36e1d85f0
14 changed files with 336 additions and 340 deletions

View File

@ -1,8 +1,5 @@
from app.core import log, buildCase, atx_steps
from app.db import test_batch_manage
import requests
class atx_core():
# run a signle case.
@ -51,13 +48,7 @@ class atx_core():
trytime = 3
while trytime:
log.log().logger.info('try time: %s' % (4 - trytime))
try:
u, result, screenFileList = atx_steps.atx_driver().run_step(u, step_name, detail,
caseNo, screenFileList)
except requests.exceptions.ConnectionError as e:
log.log().logger.error(e)
result = 2
u,result,screenFileList = atx_steps.atx_driver().run_step(u, step_name, detail,caseNo,screenFileList)
if result == 2:
log.log().logger.error('failed at %s : %s, try again!' % (step_name, detail))
trytime += -1
@ -74,3 +65,16 @@ class atx_core():
else:
log.log().logger.info('package is not found in any device!')
return 2, 'package not found', []
# deviceList = ['172.16.131.102']
# steps = 'Android|com.ghw.sdk2,点击|id@@com.ghw.sdk2:id/btn_login,等待|5,点击|name@@FACEBOOK登录,等待|10'
# for i in range(200):
# steps += ',点击|name@@FACEBOOK登录,等待|10'
#
# while 1:
# try:
# atx_core().run_case(steps,1000,deviceList)
# except FileNotFoundError as e:
# print(e)

View File

@ -1,9 +1,8 @@
import requests
import time
import uiautomator2 as ut2
from app.core import log, util, buildCase, hubs
from app.core import log, util, hubs
class atx_driver():
@ -33,8 +32,7 @@ class atx_driver():
u = ut2.connect(device)
log.log().logger.info(u.device_info)
isConnected = 1
except requests.exceptions.ConnectionError as e:
log.log().logger.error(e)
except :
isConnected = 0
u = ''
return isConnected,u
@ -57,20 +55,18 @@ class atx_driver():
result = u.adb_shell(cmd)
log.log().logger.info(result)
return 'versionCode' in str(result)
# start the testing app. for example , com.ghw.sdk2
def start_app(self,u, package):
# try to unlock device.
try:
log.log().logger.info('trying to unlock...')
u.unlock()
except requests.exceptions.ReadTimeout as e:
log.log().logger.error(e)
except:
try:
log.log().logger.info('trying to unlock again...')
u.app_start('xdf.android_unlock')
except requests.exceptions.ReadTimeout as e:
log.log().logger.error(e)
except:
pass
time.sleep(2)
log.log().logger.info('trying to swipe up...')
u.swipe_points([(0.509, 0.601), (0.503, 0.149)], 0.2)
@ -94,7 +90,6 @@ class atx_driver():
else:
log.log().logger.error('package is not found in this device , try to connect another !')
return 0
# save a screenshot to corresponding folder.
def take_screenshot(self,u, type,caseNo,screenFileList):
fileName, fileName1 = util.util().screenshot(type, caseNo)

View File

@ -26,6 +26,8 @@ class buildCase(object):
else:
elementTemplate = ''
element = ''
if len(paraValue) == paraCount-1:
paraValue.append('')
if len(paraValue) in (paraCount, paraCount+1) and paraCount > 0 and paraCount < 5:
if paraValue[0] == 'css':
paraValue[0] = 'css_selector'
@ -73,6 +75,9 @@ class buildCase(object):
def build_case(self,keyword,steps):
paraCount,template, elementTemplate = keywords.keywords().getPara(keyword)
if paraCount=='':
return '',''
else:
conmod, element = self.convertToComend(template,paraCount,steps,elementTemplate)
return conmod,element
@ -155,4 +160,4 @@ class buildCase(object):
newstep.append(step0)
else:
newstep=''
return newstep
return newstep,case

View File

@ -1,4 +1,3 @@
from selenium import webdriver
from selenium.common.exceptions import *
from app.core import log,hubs
@ -10,19 +9,21 @@ class coredriver():
server_url = {}
import random
i = random.randint(0,100)%len(servers)
log.log().logger.info('%s, %s' %(i,len(servers)))
log.log().logger.debug('%s, %s' %(i,len(servers)))
server_url['hostname']=servers[i][0]
server_url['port'] = servers[i][1]
return "http://%s:%s/wd/hub" %(server_url['hostname'],server_url['port'])
# init the driver. if runType is Android, the package is required
def iniDriver(self, runType,devicename = ''):
log.log().logger.info('RUNTYPE is : %s' %runType)
log.log().logger.debug('RUNTYPE is : %s' %runType)
servers = hubs.hubs().showHubs(runType)
log.log().logger.info(servers)
log.log().logger.debug(servers)
if len(servers):
server_url = self.serverUrl(servers)
if runType == 'Chrome':
desired_caps_web = webdriver.DesiredCapabilities.CHROME
desired_caps_web = webdriver.DesiredCapabilities.CHROME.copy()
deviceList = ['Galaxy S5', 'Nexus 5X', 'Nexus 6P', 'iPhone 6', 'iPhone 6 Plus', 'iPad', 'iPad Pro']
if devicename!='' :
if devicename not in deviceList:
@ -40,15 +41,15 @@ class coredriver():
}
desired_caps_web['goog:chromeOptions']=chrome_option
elif runType == 'Firefox':
desired_caps_web = webdriver.DesiredCapabilities.FIREFOX
desired_caps_web = webdriver.DesiredCapabilities.FIREFOX.copy()
else:
log.log().logger.info("browser not support! %s " %runType)
log.log().logger.error("browser not support! %s " %runType)
return 0
log.log().logger.info(desired_caps_web)
log.log().logger.debug(desired_caps_web)
retry = 2
while retry:
try:
log.log().logger.info("start session %s time!" %(3-retry))
log.log().logger.debug("start session %s time!" %(3-retry))
driver = webdriver.remote.webdriver.WebDriver(command_executor=server_url,desired_capabilities=desired_caps_web)
break
except WebDriverException as e:
@ -64,14 +65,18 @@ class coredriver():
if retry == 0:
return 0
else:
if devicename =='':
try:
driver.maximize_window()
log.log().logger.info(driver.get_window_size()['height'])
if driver.get_window_size()['height']<1920:
log.log().logger.debug(driver.get_window_size()['height'])
driver.set_window_size(1920, 1080) #最大化失败,则手动
except WebDriverException as e:
# log.log().logger.info(e)
try:
driver.set_window_size(1920, 1080) #最大化失败,则手动
except WebDriverException as e:
log.log().logger.info(e)
driver.set_window_size(1920, 1080) #最大化失败,则手动
return driver
else:
return 0

View File

@ -5,7 +5,7 @@ from app.db import test_task_manage
def main():
test_task_manage.test_task_manage().update_test_suite_check()
# test_task_manage.test_task_manage().update_test_suite_check()
idList = test_task_manage.test_task_manage().test_suite_list()
idList1 = test_task_manage.test_task_manage().test_case_list()
# log.log().logger.info(idList)
@ -18,25 +18,31 @@ def main():
if runType =='0' or runType =='Android':
threadNum = 1
runType ='Android'
elif runType =='1' or runType =='iOS':
threadNum = 1
runType ='iOS'
elif runType =='2' or runType =='Chrome':
threadNum = 6
runType = 'Chrome'
else:
threadNum = 0
runType = ''
if runType == '':
test_task_manage.test_task_manage().update_test_suite(test_suite_id, '3')
else:
test_task_manage.test_task_manage().update_test_suite(test_suite_id, '2')
# if runType == '':
# test_task_manage.test_task_manage().update_test_suite(test_suite_id, '3')
# else:
# test_task_manage.test_task_manage().update_test_suite(test_suite_id, '2')
process.process().runmain(test_suite_id, threadNum, runType)
# test_task_manage.test_task_manage().update_test_suite_check()
result1 = 0
else:
# log.log().logger.info('no test is available!')
result1=1
if len(idList1):
threadNum = 1
process.process().multipleRun(idList1, threadNum)
result2 = 0
else:
# log.log().logger.info('no test is available!')
result2=1
result = result1 +result2
return result

View File

@ -15,16 +15,12 @@ class extend():
elif 'text' in method:
method = By.PARTIAL_LINK_TEXT
elements = driver.find_elements(by=method,value=value)
if len(elements)==0:
return None
elif len(elements)==1:
return elements[0]
elif is_displayed:
if len(elements)>0 and is_displayed:
for element in elements:
if element.is_displayed():
return element
return None
else:
elements.remove(element)
return elements[0]
def find_elements(self,driver,para_list):
@ -38,7 +34,6 @@ class extend():
elements = driver.find_elements(by=method,value=value)
return elements
def switchIframe(self,driver,para_list):
method, value = para_list[0], para_list[1]
# 切换 iframe
@ -54,72 +49,42 @@ class extend():
time.sleep(2)
def screenshot(self,driver,id,screenFileList,isError=False):
result = 2
result = '2'
if isError:
fileName, fileName1 = util.util().screenshot('error', id)
else:
fileName, fileName1 = util.util().screenshot('normal', id)
try:
# print(fileName)
log.log().logger.debug(fileName)
driver.save_screenshot(fileName)
screenFileList.append(fileName1)
result = 1
except requests.exceptions.ConnectionError as e:
log.log().logger.error(e)
except selenium.common.exceptions.WebDriverException as e:
log.log().logger.error(e)
result = '1'
return result, screenFileList
def assert_text(self,driver,text):
try:
elements = driver.find_elements(by='xpath', value="//*[contains(.,'" + text + "')]")
except NoSuchElementException as e:
log.log().logger.info(e)
elements = []
if len(elements) > 0:
result = '1'
else:
result = '2'
log.log().logger.info('verify result is : %s' % result)
return result
assert len(elements)
def assert_title(self,driver,text):
if text in driver.title:
result = '1'
else:
result = '2'
log.log().logger.info('verify result is : %s' % result)
return result
log.log().logger.info('目标文本:%s 期待包含文本:%s' % (driver.title, text))
assert text in driver.title
def assert_element_text(self,driver,para_list,isNot=False):
result = '2'
para_list=str(para_list).split(',')
# para_list=str(para_list).split(',')
text0 = ''
if len(para_list)==3:
method, value, text = para_list[0],para_list[1],para_list[2]
text0 = ''
try:
element = self.find_element(driver, [method, value])
text0 = element.text
except NoSuchElementException as e:
log.log().logger.info(e)
except AttributeError as e:
log.log().logger.info(e)
if not len(text0):
try:
text0=element.get_attribute('value')
except NoSuchElementException as e:
log.log().logger.info(e)
except AttributeError as e:
log.log().logger.info(e)
log.log().logger.info('目标文本:%s 期待文本:%s' %(text0,text))
if (text in str(text0)):
result = '1'
# log.log().logger.info('目标文本:%s 期待文本:%s' % (text0,text))
if isNot:
if result !=1:
result =1
log.log().logger.info('verify result is : %s' % result)
return result
log.log().logger.info('目标文本:%s 期待不包含文本:%s' % (text0, text))
assert (text in str(text0))==False
else:
log.log().logger.info('目标文本:%s 期待包含文本:%s' % (text0, text))
assert (text in str(text0))
def select(self,driver,para_list):
@ -135,7 +100,7 @@ class extend():
option_method = 'visible_text'
comd = 'Select(driver.find_element_by_%s("%s")).select_by_%s("%s")' % (
method, value, option_method, option_value)
log.log().logger.info(comd)
log.log().logger.debug(comd)
exec(comd)
time.sleep(2)
@ -175,39 +140,27 @@ class extend():
driver.find_element_by_partial_link_text(text).click()
time.sleep(2)
def click_text(self,driver,text):
elements = driver.find_elements(by='xpath', value="//*[contains(.,'" + text + "')]")
for element in elements:
try:
element.click()
except NoSuchElementException as e:
log.log().logger.info(e)
time.sleep(2)
def try_click(self,driver,para_list):
# para_list=str(para_list).split(',')
if len(para_list)==2:
method, value = para_list[0],para_list[1]
# print(value)
element = self.find_element(driver, [method, value])
if element:
for i in range(3):
try:
element.click()
except NoSuchElementException as e:
log.log().logger.info(e)
self.find_element(driver, [method, value]).click()
break
except:
pass
time.sleep(2)
def click_index(self,driver,para_list):
method, value, index = para_list[0], para_list[1], para_list[2]
elements = self.find_elements(driver, [method, value])
if len(elements):
for i in range(3):
try:
elements[int(index)].click()
except NoSuchElementException as e:
log.log().logger.info(e)
time.sleep(2)
def fill_on_date(self,driver,para_list):
@ -223,3 +176,25 @@ class extend():
t=2
else:
time.sleep(int(t))
def move_to(self,driver,para_list):
if len(para_list)==2:
method, value = para_list[0],para_list[1]
for i in range(3):
try:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(to_element=self.find_element(driver, [method, value])).perform()
break
except:
pass
time.sleep(2)
def fill(self,driver,para_list,text, is_displayed = True):
element = self.find_element(driver, para_list,is_displayed)
# element = driver.find_element(by=para_list[0],value=para_list[1])
element.clear()
element.send_keys(text)
def fill_file(self,driver,para_list,text, is_displayed = False):
self.fill(driver,para_list,text, is_displayed = False)

View File

@ -70,7 +70,7 @@ class hubs():
else:
self.updateHub(hub[0],hub[1],'0','0')
if len(hubs) == 0:
log.log().logger.error('no hubs is availabe!')
log.log().logger.debug('no hubs is availabe!')
return hubs
def checkHubs(self):
@ -99,7 +99,7 @@ class hubs():
else:
sql = "select id, ip, port, androidConnect,status from test_hubs;"
list = useDB.useDB().search(sql)
log.log().logger.info('cases : %s' %list)
log.log().logger.debug('cases : %s' %list)
results = []
for i in range(len(list)):
result = {}
@ -120,8 +120,7 @@ class hubs():
if device['present']:
deviceList.append(device['ip'] + ':7912')
else:
# log.log().logger.info(device['ip'] + ' is not ready!')
pass
log.log().logger.debug(device['ip'] + ' is not ready!')
return deviceList
#获取设备列表信息
@ -137,5 +136,5 @@ class hubs():
deviceList["model"]=device['model']
deviceLists.append(deviceList)
else:
log.log().logger.info(device['ip'] + ' is not ready!')
log.log().logger.debug(device['ip'] + ' is not ready!')
return deviceLists

View File

@ -3,10 +3,37 @@ import string
from app import useDB
class keywords(object):
def __init__(self):
self.keywords = [
{'index': '前往', 'paraCount': 1, 'template': 'driver.get("http://$para1")'},
{'index': '点击', 'paraCount': 2, 'template':'driver.element_by_$para1("$para2").click()'},
{'index': '填写', 'paraCount': 3, 'template': 'driver.element_by_$para1("$para2").send_keys("$para3")'},
{'index': '等待', 'paraCount': 1, 'template': 'time.sleep($para1)'},
{'index': '点击菜单', 'paraCount': 1, 'template': 'driver.element_by_partial_link_text("$para1").click()'},
{'index': '点击文字', 'paraCount': 1, 'template': 'driver.element_by_partial_link_text("$para1").click()'},
{'index': '悬浮点击', 'paraCount': 2, 'template':'driver.element_by_$para1("$para2").click()'},
{'index': '选择', 'paraCount': 4, 'template': 'Select(driver.element_by_$para1("$para2")).select_by_$para3("$para4")'},
{'index': '验证', 'paraCount': 1, 'template': 'time.sleep(1)'},
{'index': '验证文字', 'paraCount': 3, 'template': 'result1=(driver.element_by_$para1("$para2").text)'},
{'index': '截图', 'paraCount': 1, 'template': 'driver.save_screenshot("%s" %$para1)'}
]
def getPara1(self, keyword):
# print(self.keywords)
keywords = self.keywords
result = 0
log.log().logger.info(keyword)
for list in keywords:
if list['index']==keyword:
result =1
return list['paraCount'], list['template']
break
if result ==0:
return '',''
def getPara(self, keyword):
result = 0
log.log().logger.info(keyword)
# log.log().logger.info(keyword)
sql = string.Template(
"select paraCount, template, elementTemplate from `test_keyword` where `keyword`= '$index' limit 1;")
sql = sql.substitute(index=keyword)

View File

@ -2,13 +2,13 @@ import queue
import threading
import time
from multiprocessing.dummy import Pool as ThreadPool
import urllib,http
import requests
from retrying import retry
from selenium.common.exceptions import *
from selenium.webdriver.support.select import Select
from app import useDB, config
from app.core import buildCase, log, hubs, coredriver, util, extend, atx_core
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from app import config
from app.core import buildCase, log, hubs, coredriver, util, atx_core,extend
from app.db import test_task_manage,test_batch_manage
isUseATX = config.isUseATX
@ -23,9 +23,9 @@ class process():
browserType = case[2]
case = case[1]
screenFileList = []
devicename = ''
log.log().logger.info('current case is : %s' %case)
newstep = buildCase.buildCase().getCase(case)
package = ''
log.log().logger.info('开始执行 id %-10d | 用例 %s ' %(id,case))
newstep,case = buildCase.buildCase().getCase(case)
if len(newstep):
runType = newstep[0][0]
if len(newstep[0][1]) == 1 :
@ -37,9 +37,9 @@ class process():
log.log().logger.info('%s, %s, %s' %(result, stepN,screenFileList))
else:
# 使用 selenium 执行 web 用例
if browserType !=''and devicename =='':
if browserType !=''and package =='':
runType = browserType
driver = coredriver.coredriver().iniDriver(runType,devicename=devicename)
driver = coredriver.coredriver().iniDriver(runType,devicename=package)
result = '2'
stepN = 'init'
if driver == 0: # 没有可执行的节点,无法执行
@ -52,84 +52,33 @@ class process():
stepN = 'no steps!'
else:
for i in range(1,len(newstep)): # 开始逐个步骤执行
steps = newstep[i]
keyword = steps[0]
comed , element = buildCase.buildCase().build_case(keyword, steps[1]) # 转换为可执行语句
stepN = keyword
tryTimes = 0
result = '2'
while 1:
if keyword=='验证文字':
result = extend.extend().assert_element_text(driver,comed)
elif keyword=='验证文字非':
result = extend.extend().assert_element_text(driver,comed,isNot=True)
elif keyword=='验证':
result = extend.extend().assert_text(driver,comed)
elif keyword=='截图':
result, screenFileList = extend.extend().screenshot(driver,id,screenFileList)
else:
stepN = case[i].replace('"',"'")
# result, stepN, screenFileList = self.do_step(driver, newstep[i], screenFileList)
try:
log.log().logger.info(comed)
result = '1'
exec(comed) #执行语句
except requests.exceptions.HTTPError as e:
log.log().logger.error(e)
result,stepN, screenFileList=self.do_step(driver,newstep[i],stepN,id,screenFileList)
except:
result = '2'
except urllib.error.URLError as e:
log.log().logger.error(e)
result = '2'
except NoSuchElementException as e:
log.log().logger.error(e)
log.log().logger.error('id %-10d | 失败步骤:%s ' %(id,stepN))
# ("id %-10d | 关键字: %-20s | 步骤:%-60s | 命令: %s" % (id, keyword, case, comed))
if result == '2':
trytime = 2
while trytime:
try:
driver.accept_alert()
result1, screenFileList = extend.extend().screenshot(driver, id, screenFileList,
True)
break
except UnexpectedAlertPresentException as e:
log.log().logger.info(e)
time.sleep(5)
try:
driver.switch_to.alert.accept()
except:
log.log().logger.error('no alert')
try:
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
except :
log.log().logger.error('cannot scroll')
result = '2'
except AttributeError as e:
log.log().logger.info(e)
try:
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
except :
log.log().logger.error('cannot scroll')
result = '2'
except WebDriverException as e:
log.log().logger.error(e)
try:
driver.accept_alert()
except :
log.log().logger.error('no alert')
result = '2'
except StaleElementReferenceException as e:
log.log().logger.info(e)
result = '2'
except http.client.RemoteDisconnected as e:
log.log().logger.info(e)
result = '2'
if result == '2' : # 步骤失败时重试3次
tryTimes +=1
time.sleep(2)
else:
break
log.log().logger.info('try times :%s, result is: %s' %(tryTimes, result))
if result == '2' and tryTimes ==3: # 失败3次自动截图
retryScreenshot = 2
while retryScreenshot:
try:
result, screenFileList =extend.extend().screenshot(driver,id,screenFileList,True)
break
except WebDriverException as e:
log.log().logger.error(e)
driver.switch_to_default_content()
retryScreenshot +=-1
# break
if result == '2' and tryTimes >=3: # 失败3次跳出
break
if result == '2' : # 失败3次跳出
trytime += -1
break
# for android driver ,the ending should by driver.quite(); for webdriver ,the ending is driver.close()
try:
driver.quit()
except WebDriverException as e:
@ -147,7 +96,37 @@ class process():
test_batch_manage.test_batch_manage().set_test_end(result, datetime.datetime.now(), stepN, screenFileList,id)
return result
# multiple run, for webdriver , the thread could by more than 1.
@retry(stop_max_attempt_number=3,wait_fixed=2000)
def do_step(self,driver,steps,case,id,screenFileList):
keyword = steps[0]
stepN = keyword
comed, element = buildCase.buildCase().build_case(keyword, steps[1]) # 转换为可执行语句
result = '2'
log.log().logger.info("id %-10d | 关键字: %-20s | 步骤:%-60s | 命令: %s" %(id, keyword,case, comed))
try:
if comed != '':
if keyword == '截图':
result, screenFileList = extend.extend().screenshot(driver, id, screenFileList)
else:
exec(comed) # 执行语句
result = '1'
except UnexpectedAlertPresentException as e:
log.log().logger.info(e)
try:
driver.switch_to.alert.accept()
result = '1'
except :
log.log().logger.error('no alert')
else:
stepN = 'no comed to run!'
return result,stepN,screenFileList
# multiple run, for android , the tread is 1; for webdriver , the thread could by more than 1.
def multipleRun(self,caselist, threadNum):
pool = ThreadPool(threadNum)
pool.map(self.main, caselist)
@ -157,11 +136,11 @@ class process():
def runmain(self,test_suite_id,threadNum, runType ):
if runType == 'Android' and isUseATX:
Hubs = hubs.hubs().getDevices()
log.log().logger.info('Run type is ATX and usable devices are %s' % Hubs)
log.log().logger.debug('Run type is ATX and usable devices are %s' %Hubs)
else:
Hubs = hubs.hubs().showHubs(runType)
if len(Hubs) ==0:
log.log().logger.error('cannot run for no available hubs!')
log.log().logger.debug('cannot run for no available hubs!')
elif runType == 'Android' and isUseATX:
self.atxMain()
else:
@ -183,9 +162,9 @@ def atxMain(self):
log.log().logger.info("start time: %s" %time.ctime())
elif len(alllist):
log.log().logger.info('no device is avaible!')
log.log().logger.debug('no device is avaible!')
else:
log.log().logger.info('no test case is needed!')
log.log().logger.debug('no test case is needed!')
class MyThread(threading.Thread):

View File

@ -25,19 +25,19 @@ class util():
if platform.system() == 'Windows':
screen_shot_path = config.screen_shot_path
screen_shot_path1 = 'static\\screenshot\\'
log.log().logger.info(screen_shot_path)
normalfilename = screen_shot_path + 'normalScreenShot\\' + str(caseNo)+'_success' + nowTime + '.jpg'
errorfilename = screen_shot_path + 'errorScreenShot\\' + str(caseNo)+'_error' + nowTime + '.jpg'
normalfilename1 = '\\' +screen_shot_path1 + '\\' + 'normalScreenShot' + '\\' + str(caseNo)+'_success' + nowTime + '.jpg'
errorfilename1 = '\\' + screen_shot_path1 + '\\' + 'errorScreenShot' + '\\' + str(caseNo)+'_error' + nowTime + '.jpg'
log.log().logger.debug(screen_shot_path)
normalfilename = screen_shot_path + 'normalScreenShot\\' + str(caseNo)+'_success' + nowTime + '.png'
errorfilename = screen_shot_path + 'errorScreenShot\\' + str(caseNo)+'_error' + nowTime + '.png'
normalfilename1 = '\\' +screen_shot_path1 + '\\' + 'normalScreenShot' + '\\' + str(caseNo)+'_success' + nowTime + '.png'
errorfilename1 = '\\' + screen_shot_path1 + '\\' + 'errorScreenShot' + '\\' + str(caseNo)+'_error' + nowTime + '.png'
else:
screen_shot_path = config.screen_shot_path
screen_shot_path1 = 'static/screenshot'
normalfilename = screen_shot_path + 'normalScreenShot' + '/'+ str(caseNo)+'_success' + nowTime + '.jpg'
errorfilename = screen_shot_path + 'errorScreenShot' + '/' + str(caseNo)+'_error' + nowTime + '.jpg'
normalfilename = screen_shot_path + 'normalScreenShot' + '/'+ str(caseNo)+'_success' + nowTime + '.png'
errorfilename = screen_shot_path + 'errorScreenShot' + '/' + str(caseNo)+'_error' + nowTime + '.png'
normalfilename1 = '/' + screen_shot_path1 + '/' + 'normalScreenShot' + '/' + str(
caseNo) + '_success' + nowTime + '.jpg'
errorfilename1 = '/' + screen_shot_path1 + '/' + 'errorScreenShot' + '/' + str(caseNo) + '_error' + nowTime + '.jpg'
caseNo) + '_success' + nowTime + '.png'
errorfilename1 = '/' + screen_shot_path1 + '/' + 'errorScreenShot' + '/' + str(caseNo) + '_error' + nowTime + '.png'
if screenShotType == 'error':
return errorfilename,errorfilename1
else:

View File

@ -53,11 +53,12 @@ class test_keyword_manage:
useDB.useDB().insert(sql)
return 1
def show_test_keywords_options(self):
results = []
sql = 'select keyword from test_keyword where status = 1 ;'
sql = 'select keyword from test_keyword where status = 1 order by keyword ;'
cases = useDB.useDB().search(sql)
print(cases)
# print(cases)
log.log().logger.info('cases : %s'%cases)
for i in range(len(cases)):
results.append(cases[i][0])

View File

@ -624,7 +624,7 @@ function changeValue(obj,order){
//setModule(obj.options[obj.selectedIndex].value);
var keyword = obj.options[obj.selectedIndex].value;
var method = document.getElementsByClassName('td_para_'+order)[0];
if(['点击','填写','选择','填写日期','选择全部','验证文字','验证文字非','点击索引'].indexOf(keyword)!= -1){
if(['点击','填写','选择','填写日期','填写文件','选择全部','验证文字','验证文字非','点击索引'].indexOf(keyword)!= -1){
// changeBy(keyword,order);
var methodSelect = method.getElementsByClassName('method');
// alert(methodSelect.length);

View File

@ -52,14 +52,13 @@ class mysqlDB(object):
def connect(self):
# change root password to yours:
import mysql.connector
conn = mysql.connector.connect(host=config.host,port=config.port, user=config.user, password=config.password, database=config.database)
return conn
def search(self, sql):
conn = self.connect()
cursor = conn.cursor()
log.log().logger.info(sql)
# log.log().logger.info(sql)
cursor.execute(sql)
values = cursor.fetchall()
# log.log().logger.info('values1 :', values)
@ -68,7 +67,7 @@ class mysqlDB(object):
return values
def insert(self, sql):
log.log().logger.info(sql)
log.log().logger.debug(sql)
conn = self.connect()
cursor = conn.cursor()
cursor.execute(sql)
@ -76,11 +75,11 @@ class mysqlDB(object):
try:
conn.commit()
except :
log.log().logger.info('commit error')
log.log().logger.error('commit error')
conn.close()
def excutesql(self, sql):
log.log().logger.info(sql)
log.log().logger.debug(sql)
conn = self.connect()
cursor = conn.cursor()
cursor.execute(sql)
@ -88,7 +87,7 @@ class mysqlDB(object):
try:
conn.commit()
except:
log.log().logger.info('commit error')
log.log().logger.error('commit error')
conn.close()
# 测试查询防止sql注入

View File

@ -172,8 +172,8 @@ insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplat
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('点击文字','1','extend.extend().click_menu(driver, \"$para1\")','driver.element_by_partial_link_text(\"$para1\")','点击文字|查询','通过文本内容,快速点击元素。 适用于文字链接、按钮等元素。','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('悬浮点击','2','driver.find_element_by_$para1(\"$para2\").click()','driver.element_by_$para1(\"$para2\")','悬浮点击|id@@searchBtn\r\ndriver.find_element_by_id(\"searchBtn\").click()','点击页面元素,可按 id、css、xpath 等方式定位元素。 同 点击','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('选择','4','extend.extend().select(driver,[\"$para1\",\"$para2\",\"$para3\",\"$para4\"])','driver.element_by_$para1(\"$para2\")','选择|id@@selectBox@@index@@1选择|id@@selectBox@@text@@中国','选择下拉框中指定的选项。 可按 index、value、 text完全匹配、text_part模糊匹配 等信息选择选项','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('验证','1','$para1',NULL,'验证|成功','验证页面中是否包含预期文字','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('验证文字','3','$para1,$para2,$para3',NULL,'验证文字|id@@text@@成功','验证指定元素中是否包含预期的文字信息。 如验证提示是否包含“成功”','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('验证','1','extend.extend().assert_text(driver, \"$para1\")',NULL,'验证|成功','验证页面中是否包含预期文字','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('验证文字','3','extend.extend().assert_element_text(driver, [\"$para1\",\"$para2\",\"$para3\"])',NULL,'验证文字|id@@text@@成功','验证指定元素中是否包含预期的文字信息。 如验证提示是否包含“成功”','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('截图','1','extend.extend().screenshot(driver,id,screenFileList)',NULL,'截图','手动截图。 注:用例执行失败时会自动截图。','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('填写日期','3','extend.extend().fill_on_date(driver,[\"$para1\",\"$para2\",\"$para3\"])','driver.element_by_$para1(\"$para2\")','填写日期|id@@start_date@@2018-04-01','在指定元素中输入日期。 ps此方法会去除元素的 readonly 属性,达到跳过手动选择日期,快速输入的目的','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('返回','1','driver.back()',NULL,'返回','浏览器后退。','1');
@ -181,15 +181,16 @@ insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplat
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('切换','2','extend.extend().switchIframe(driver,[\"$para1\",\"$para2\"])',NULL,'切换|id@@iframe1','页面中包含iframe 时需要调用该方法进行切换否则无法定位其他iframe的元素。','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('滑动到底部','1','driver.execute_script(\"window.scrollTo(0,document.body.scrollHeight)\")',NULL,'滑动到底部','滑动页面到最底','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('反选','1','extend.extend().uncheck_checkbox(driver)',NULL,'反选','特别封装步骤,用于取消已选择的选项。(用于 mt-checkbox 类型的选择框)','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('验证文字非','3','$para1,$para2,$para3',NULL,'验证文字非|id@@text','验证指定元素中是否不包含预期的文字信息。 如验证提示是否不包含“成功”','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('验证文字非','3','extend.extend().assert_element_text(driver, [\"$para1\",\"$para2\",\"$para3\"], isNot=True)',NULL,'验证文字非|id@@text','验证指定元素中是否不包含预期的文字信息。 如验证提示是否不包含“成功”','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('切换主页','1','driver.switch_to_default_content()',NULL,'切换主页','从iframe中切换回主页面','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('刷新','1','driver.refresh()',NULL,'刷新','浏览器后退。','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('填写1','3','driver.find_element_by_$para1(\"$para2\").send_keys(\"$para3\")','driver.element_by_$para1(\"$para2\")','填写|id@@input_box@@ghw','在指定元素中输入文字。不清除原已输入的值。','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('尝试点击','2','extend.extend().try_click(driver,[\"$para1\",\"$para2\"])','driver.element_by_$para1(\"$para2\")','尝试点击|id@@searchBtn','尝试点击页面元素,如果点击失败,则跳过。','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('填写','3','extend.extend().find_element(driver,[\"$para1\",\"$para2\"]).clear()\r\nextend.extend().find_element(driver,[\"$para1\",\"$para2\"]).send_keys(\"$para3\")','driver.element_by_$para1(\"$para2\")','填写|id@@input_box@@ghw','在指定元素中输入文字,可按 id、css、xpath、class、name、text 等方式定位元素','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('填写','3','extend.extend().fill(driver,[\"$para1\",\"$para2\"],\"$para3\")','driver.element_by_$para1(\"$para2\")','填写|id@@input_box@@ghw','在指定元素中输入文字,可按 id、css、xpath、class、name、text 等方式定位元素','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('选择全部','2','extend.extend().select_all(driver,[\"$para1\",\"$para2\"])','driver.element_by_$para1(\"$para2\")','选择全部|id@@select','对下拉框,选择所有选项','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('点击全部','2','extend.extend().check_all(driver,[\"$para1\",\"$para2\"])','driver.element_by_$para1(\"$para2\")','点击全部|id@@CheckBox','对多选框,选择所有选项','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('切换窗口','1','extend.extend().switchWindow(driver)',NULL,'切换窗口','当浏览器弹出新的窗口时,切换到另一个窗口进行操作','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('验证标题','1','extend.extend().assert_title(driver,"$para1")',NULL,'验证标题|百度地图','验证页面的title中是否包含预期文字','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('Chrome','1','Chrome',NULL,'Chrome','初始化Chrome 浏览器','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('公共方法','1',' $para1',NULL,'公共方法|游客登录','调用公共方法','1');
insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('填写文件','3','extend.extend().fill_file(driver,[\"$para1\",\"$para2\"],\"$para3\")','driver.element_by_$para1(\"$para2\")','填写文件|id@@input_box@@ghw','在指定元素中输入文件路径,可按 id、css、xpath、class、name、text 等方式定位元素','1');