最新消息:这里是最新消息

python装饰器与递归函数的联合应用[可配置]

python benty 386浏览 0评论
from conf import AutoConf
#先判断有没有配置文件
path_file=”./conf.json”
config=AutoConf(path_file)
conf=config.getconf()
# conf[‘userinfo’]包含帐号信息
userinfo=conf[‘userinfo’]
# 声明重试次数
retry=int(userinfo[‘retry’])
1.定义一个装饰器,返回json格式的数据
# 定义一个计时的装饰器
def timek(func):
    # print(args)
    def inner(*args,**kw):
        # print(args)#args是浏览器对象
        # print(kw) #是tmp字典
        start_time=time.perf_counter()
        res=func(*args,**kw)
        # print(res)
        usetime=time.perf_counter()-start_time
        resxx={“status”:res,”time”:usetime}
        # print(resxx)
        #这里进行判断是否为none是因为func函数用了递归所以要进行判断res是否为none,为none不正常
        # print(res==None)
        return resxx
    #func函数成功执行才返回结果,否则不返回中断
    return inner

2.定义一个双层函数来执行具体的事件行为,外层函数用来配合装饰器统计时间,内层函数用来解决递归和装饰器冲突的问题

@timek
def smstest(browser,tmp=retry):
    ”’admin1帐号对短信平台手动核验”’
    def _smstest(browser,tmp):
        try:
            #开头考虑第二次有弹窗
            browser.todefault()
            xx=browser.byname(“module”)
            browser.toframe(xx)
            xx=browser.byid(“module_586708682065679”) #点击短信平台
            browser.execute_script(“arguments[0].click()”,xx)
            browser.todefault()
            #点击手工短信发送
            xx=browser.byatext(“手工短信发送”)
            browser.execute_script(“arguments[0].click();”,xx)
            browser.todefault()
            xx=browser.byname(“main”)
            browser.toframe(xx)
            time.sleep(0.3)
            xx=browser.byname(“sMPNumber”)
            browser.execute_script(“arguments[0].click();”,xx)
            time.sleep(0.5)
            # 输入手机号码回车准备发送短信
            xx.send_keys(userinfo[‘phone’])
            time.sleep(0.3)
            xx.send_keys(Keys.ENTER)
            browser.byname(“sMessageContent”).send_keys(“测试短信接口”)
            xx=browser.byname(“send”)
            browser.execute_script(“arguments[0].click();”,xx)
            # time.sleep(0.8)
            waitalert(browser)
            browser.switch_to.alert.accept()
            waitalert(browser)
            xx=browser.switch_to.alert
            xxtext=xx.text
            # print(xxtext)
            xx.accept()
            #退出登录
            logout(browser)
            if “完成” in xxtext:
                return “短信发送成功”
            elif “失败” in xxtext:
                return “短信发送失败”
        except Exception as e:
            print(e)
            if tmp!=0:
                tmp-=1
                time.sleep(0.3)
                return _smstest(browser,tmp=tmp)
            else:
                return “未知错误”
    return _smstest(browser,tmp)

 

3.selenium等待函数,根据ajax或者弹窗或者frame智能等待处理.

# 等待alert出现,否则一直等
def waitalert(browser,time=8):
    ”’等待alert出现,否则就等0.5秒,超过8秒跳过”’
    try:
        browser.switch_to.alert
    except:
        print(“等待alert出现”)
        timetmp=0
        alertstatus=0
        while alertstatus==0:
            if timetmp<8:
                timetmp+=0.5
                time.sleep(0.5)
                waitalert(browser,time=8)
            else:
                break
# 判断关键词keyword是否在text中 ====暂时可能有问题,用pagewaitq
def pagewait(keywords, textobj, waittime=5):
    ”’判断关键词keywords是否在textobj,不在一直等,存在返回1,主要对ajax页面进行分析”’
    # global browser
    ppagestat = 0
    timek = 0
    while ppagestat == 0:
        if “请稍等” not in textobj:
            ppagestat = 1
        elif keywords in textobj:
            ppagestat = 1
        else:
            print(“else等待元素出现”)
            time.sleep(0.1)
            timek += 1
            if timek > waittime * 2:
                #默认最大等待时间30s,超时跳出
                break
    return ppagestat
# 切换银行帐号的等待函数
def bankwait(browser,t=1):
    ”’切换七家银行的等待时间”’
    try:
        print(“又一次等待银行返回数据”)
        browser.byclass(“ItemBody”)
        print(“找到返回元素了….”)
    except:#异常只执行一次
        if t<4:
            t+=1
            bankwait(browser,t)

 

 

 

 

 

 

转载请注明:稻香的博客 » python装饰器与递归函数的联合应用[可配置]

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址