Skip to content

Commit bc4abce

Browse files
authored
Merge pull request #267 from ctripcorp/266-web-语句中无timeout的场景增加重试机制
feat: web增加重试机制
2 parents 8566f58 + 7d0b62b commit bc4abce

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed

flybirds/core/config_manage.py

+6
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,10 @@ def __init__(self, user_data, config):
360360
"waitEleTimeout",
361361
return_value(frame_config.get("waitEleTimeout", 10), 10)
362362
)
363+
self.retry_ele_timeout = user_data.get(
364+
"retryEleTimeout",
365+
return_value(frame_config.get("retryEleTimeout", 10), 10)
366+
)
363367
self.wait_ele_disappear = user_data.get(
364368
"waitEleDisappear",
365369
return_value(frame_config.get("waitEleDisappear", 10), 10)
@@ -466,6 +470,8 @@ def __init__(self, user_data, config):
466470
def set_frame_info_attrs(self, user_data):
467471
if not hasattr(self, "wait_ele_timeout"):
468472
self.wait_ele_timeout = user_data.get("waitEleTimeout", 10)
473+
if not hasattr(self, "retry_ele_timeout"):
474+
self.retry_ele_timeout = user_data.get("retryEleTimeout", 30)
469475
if not hasattr(self, "wait_ele_disappear"):
470476
self.wait_ele_disappear = user_data.get("waitEleDisappear", 10)
471477
if not hasattr(self, "click_verify_timeout"):

flybirds/core/dsl/step/element.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from behave import step
66

77
from flybirds.core.global_context import GlobalContext as g_Context
8-
from flybirds.utils.dsl_helper import ele_wrap, VerifyStep
8+
from flybirds.utils.dsl_helper import ele_wrap, VerifyStep, RetryType
99

1010

1111
@step("text[{selector}]property[{param2}]is {param3}")
@@ -272,6 +272,7 @@ def full_screen_swipe(context, param1=None, param2=None):
272272
@step("exist text[{selector}]")
273273
@VerifyStep()
274274
@ele_wrap
275+
@RetryType('timeout')
275276
def wait_text_exist(context, selector=None):
276277
"""
277278
The specified text element string exists in the page
@@ -347,6 +348,7 @@ def wait_ocr_text_appear(context, selector=None):
347348
@step("not exist text[{selector}]")
348349
@VerifyStep()
349350
@ele_wrap
351+
@RetryType('timeout')
350352
def text_not_exist(context, selector=None):
351353
"""
352354
The specified text element string does not exist in the page
@@ -409,6 +411,7 @@ def wait_ele_exit(context, selector=None):
409411
@step("not exist element[{selector}]")
410412
@VerifyStep()
411413
@ele_wrap
414+
@RetryType('timeout')
412415
def ele_not_exit(context, selector=None):
413416
"""
414417
The specified selector element string does not exists in the page

flybirds/utils/dsl_helper.py

+56
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,28 @@
1313

1414
# generate result_dic
1515
from flybirds.core.global_context import GlobalContext
16+
import time
1617

1718
if six.PY2:
1819
# -- USE PYTHON3 BACKPORT: With unicode traceback support.
1920
import traceback2 as traceback
2021
else:
2122
import traceback
2223

24+
import asyncio
25+
import nest_asyncio
26+
27+
nest_asyncio.apply()
28+
tim_loop = asyncio.new_event_loop()
29+
30+
31+
async def sleep_t(t):
32+
await asyncio.sleep(t)
33+
34+
35+
def sleep(sleep_time):
36+
tim_loop.run_until_complete(sleep_t(sleep_time))
37+
2338

2439
def add_res_dic(dsl_params, functin_pattern, def_key):
2540
result_dic = {}
@@ -250,3 +265,44 @@ def wrapper(*args, **kwargs):
250265
return func(*args, **kwargs)
251266

252267
return wrapper
268+
269+
270+
class RetryType:
271+
def __init__(self, *args, **kwargs): # 类装饰器参数
272+
self.retry = args[0]
273+
274+
def __call__(self, func): # 被装饰函数
275+
@wraps(func)
276+
def wrapper(*args, **kwargs):
277+
if gr.get_platform() is not None \
278+
and gr.get_platform().lower() == "web":
279+
self.retryTimeOut = gr.get_frame_config_value("retry_ele_timeout", 30)
280+
281+
self.waitTimeInterval = max(self.retryTimeOut // 30, 1)
282+
self.retryTimes = max(self.retryTimeOut // self.waitTimeInterval, 1)
283+
self.recordMaxRetryTimes = self.retryTimes
284+
self.runSuccess = False
285+
log.info(
286+
f'retry start retryTimeOut: {self.retryTimeOut}s, self.waitTimeInterval: {self.waitTimeInterval}s, maxRetryTimes: {self.recordMaxRetryTimes}')
287+
while self.retryTimes > 0:
288+
try:
289+
func(*args, **kwargs)
290+
self.runSuccess = True
291+
if self.runSuccess == True:
292+
log.info(
293+
f'retry success, max retry times: {self.recordMaxRetryTimes}, retry times: {self.recordMaxRetryTimes - self.retryTimes}')
294+
break
295+
except Exception as e:
296+
self.retryTimes -= 1
297+
if self.retryTimes == 0:
298+
log.info(f'retry fail during {self.retryTimeOut}s, retry times: {self.recordMaxRetryTimes}')
299+
raise e
300+
else:
301+
log.info(
302+
f'retry sleep interval {self.waitTimeInterval}s,current retry times: {self.recordMaxRetryTimes - self.retryTimes}')
303+
sleep(self.waitTimeInterval)
304+
pass
305+
else:
306+
func(*args, **kwargs)
307+
308+
return wrapper

0 commit comments

Comments
 (0)