Appium+python自动化4-等待函数

4.1 等待函数癈使用

4.1.1 为什么要使用等待函数

我们在做自动化的时候很多时候都不是很顺利,不是因为app的问题,我们的脚本也没问题,但是很多时候都会报错,比如一个页面本来就有id为1的这个元素,可是我无论怎么定位他都没办法操作,然后报错,这个是怎么个情况呢?因为当我们app打开一个页面的时候我们的appium的运行速度过快那么可能害没有将页面的资源解析完成然后你就去操作了,这样能行吗?肯定不行的,这样不报错谁错呢?所以在很多的时候我们都需要加载等待时间的。那什么时候为每个页面都加载等待时间呢?

4.1.2 什么时候用等待函数

自动化的目的是高效,如果你每个页面都去添加等待时间那么执行下来的效率是不是大大降低了?在加载等待时间时我们需要根据自己的判断去增加,比如一些页面资源较多加载慢了那你肯定需要加的。是不是都是这样呢?其实不是的,下面介绍几种不同类型的等待。

4.2 强制等待

4.2.1 什么是强制等待

故名思义就是你必须给我等,有点耍流氓的意思。比如:我进入到登陆页面,刚好有一个强制等待的函数,那么结果就是无论页面的资源加载完没有你都得给我等着。

4.2.2 强制等待使用

import time
time.sleep(10) #单位秒

备注:调试程序的时候这样写写就好,千万别在实际项目中多用。因为这个time的等待是线程的死等,就是无论如何都会执行这一条语句,如果你在实际项目中去运行那么你会发现效率会很慢。所以实际项目不推荐

4.2.3 强制等待封装

#!/usr/bin/env python
# -*- codinfg:utf-8 -*-
'''
@author: Jeff LEE
@file: 等待函数.py
@time: 2018-07-30 11:08
@desc:
'''
import time
from appium import webdriver
import os

def Case(platformName, platformVersion, deviceName, app, appPackage, appActivity):
    PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))
    # print getConfig("baseconf", "platformName")
    desired_caps = {}
    desired_caps['platformName'] = platformName  # 设置平台
    desired_caps['platformVersion'] = platformVersion  # 系统版本
    desired_caps['deviceName'] = deviceName  # 设备id
    # desired_caps['autoLaunch'] = 'true'  # 是否自动启动
    # desired_caps['noReset'] = 'true'
    # desired_caps['newCommandTimeout'] = 20
    # desired_caps['app'] = PATH(app)  # 安装包路径,放在该py文件的目录下)
    desired_caps['appPackage'] = appPackage  # 包名
    desired_caps['appActivity'] = appActivity  # 启动的activity
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    waitFor(5)
# 等待函数 def waitFor(t): time.sleep(t)

4.3 隐式等待

4.3.1 什么是隐式等待

driver.implicitly_wait(10) #单位秒

  隐式等待,顾名思义看不见,也可理解为智能等待,从上面函数可以看出,这个等待函数是webdriver提供的一个等待函数,它是针对我们整个driver的。也就是说你只要是用driver去操作一个对象,或者一个元素,当你找不到这个元素或者对象的时候他就会自动的去等待你设置的这个超时时间,如果在超时时间内还没有找到,程序才会报错。

4.3.2 隐式等待封装

#!/usr/bin/env python
# -*- codinfg:utf-8 -*-
'''
@author: Jeff LEE
@file: 等待函数.py
@time: 2018-07-30 11:08
@desc:
'''
import time
from appium import webdriver
import os

def Case(platformName, platformVersion, deviceName, app, appPackage, appActivity):
    PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))
    # print getConfig("baseconf", "platformName")
    desired_caps = {}
    desired_caps['platformName'] = platformName  # 设置平台
    desired_caps['platformVersion'] = platformVersion  # 系统版本
    desired_caps['deviceName'] = deviceName  # 设备id
    # desired_caps['autoLaunch'] = 'true'  # 是否自动启动
    # desired_caps['noReset'] = 'true'
    # desired_caps['newCommandTimeout'] = 20
    # desired_caps['app'] = PATH(app)  # 安装包路径,放在该py文件的目录下)
    desired_caps['appPackage'] = appPackage  # 包名
    desired_caps['appActivity'] = appActivity  # 启动的activity
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    waitFor(5)

    return driver

# 等待函数
def waitFor(t):
    time.sleep(t)

# 隐式等待
def implicit_for_wait(t):
    driver = Case(platformName, platformVersion, deviceName, app, appPackage, appActivity)
    driver.implicitly_wait(t)

4.4 显示等待

4.4.1 什么是显示等待

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

  

首先我们来弄明白这个方法里面几个参数的含义:

1、driver:是我们操作的driver。

2、timeout:超时时间,也就是我们找这个元素要找多久

3、poll_frequency:间隔时间,怎么理解?就是说在超时时间内每多少秒去查询一次,默认情况是0.5秒一次

4、ignored_exceptions:异常,就是没有找到程序抛出什么异常。在默认情况是跑出:NoSuchElementException

4.4.2 显示等待封装

#!/usr/bin/env python
# -*- codinfg:utf-8 -*-
'''
@author: Jeff LEE
@file: 等待函数.py
@time: 2018-07-30 11:08
@desc:
'''
import time
import os

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait


def Case(platformName, platformVersion, deviceName, app, appPackage, appActivity):
    PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))
    # print getConfig("baseconf", "platformName")
    desired_caps = {}
    desired_caps['platformName'] = platformName  # 设置平台
    desired_caps['platformVersion'] = platformVersion  # 系统版本
    desired_caps['deviceName'] = deviceName  # 设备id
    # desired_caps['autoLaunch'] = 'true'  # 是否自动启动
    # desired_caps['noReset'] = 'true'
    # desired_caps['newCommandTimeout'] = 20
    # desired_caps['app'] = PATH(app)  # 安装包路径,放在该py文件的目录下)
    desired_caps['appPackage'] = appPackage  # 包名
    desired_caps['appActivity'] = appActivity  # 启动的activity
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    waitFor(5)

    return driver

# 等待函数
def waitFor(t):
    time.sleep(t)

# 隐式等待
def implicit_for_wait(t):
    driver = Case(platformName, platformVersion, deviceName, app, appPackage, appActivity)
    driver.implicitly_wait(t)

#显示等待
def wait(t):
  driver = Case(platformName,platformVersion,deviceName,app,appPackage,appActivity)
  WebDriverWait(driver, 10,5).until(lambda driver:driver.find_element_by_id("XXXX"))