返回首页 | 申博娱乐APP下载

合作共赢、快速高效、优质的网站建设提供商

更多精品源码-尽在织梦模板-www.moke8.com

网站开发Appium python自动化测验系列之等候函数怎么进行实战

时间:2017-10-30 编辑:admin

?9.1 等候函数的运用 9.1.1 为什么要运用等候函数

我们们在做主动化的时分许多时分都不是很顺畅,不是由于app的问题,我们们的脚本也没问题,可是许多时分都会报错,比方一个页面正本就有id为1的这个元素,可是我们不管怎样定位他都没方法操作,然后报错,这个是怎样个状况呢?由于当我们们app翻开一个页面的时分我们们的appium的运转速度过快那么可能害没有将页面的资源解析完结然后你就去操作了,这样能行吗?必定不可的,这样不报错谁错呢?所以在许多的时分我们们都需求加载等候时刻的。那我们们是不是盲意图去每个页面都加载等候时刻呢?

9.1.2 什么时分运用等候函数

答案必定是否定的,主动化的意图是高效,可是你每个页面都去添加等候时刻那么履行下来的功率是不是大大降低了?估量你的领导该找你说话了。在加载等候时刻时我们们需求依据自己的判断去添加,比方一些页面资源较多加载慢了那你必定需求加的。是不是都是这样呢?其实不是的,所以这个就有了下面我们们需求讲的知识点,几种不同类型的等候。

9.2 强制等候 9.2.1 什么是强制等候

故名思义就是你有必要给我们等,有点***的意思。比方:我们进入到登陆页面,刚好有一个强制等候的函数,那么成果就是不管页面的资源加载完没有你都得给我们等着。懂了吗?只需时刻没到你就给我们等着!哈哈,就像那啥一样****哈。

9.2.2 强制等候运用

在python里边这个比较好,他调用的是time包下的等候函数,代码如下:

#coding = "utf-8"
import time
time.sleep(10)

首要是需求导入time的包,下面一句话就搞定,是不是便利、有用呢?你调试程序的时分这样写写就好,千万别在实践项目中多用。由于这个time的等候是线程的死等,就是不管怎样都会履行这一条句子,如果你在实践项目中去运转那么你会发现功率会很慢。所以实践项目不引荐。

补白:时刻是按秒核算

9.2.3 强制等候封装实战

前面我们们学了函数的封装,如果我们们这个等候函数需求在许多当地用到是不是每个当地都要来这么一句呢?其实不是的,程序最重要的意图就是我们们可以少写哪怕是一个单词我们们都要进行封装,这是我们的了解。完成相同的功用为什么不挑简略的挑选做呢?对吧。看封装代码:

#conding="utf-8"
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)

看见这个代码我是不是有种含糊的感觉?其实这个就是上一章节让我下去考虑的,我们将我们们发动的参数做了一个简略的封装,然后将等候函数也进行了封装,然后他俩结合就成了现在的姿态。是不是很简略?其实我们想通知你的是这个在真的主动化中不算主动化,可是我需求渐渐的养成这个思维,多操练。在上面的代码中我们们将我们们发动app的代码进行了一个简略的重构封装,这个时分关于初学者来说强烈建议我着手操作,否则你不知道你是否可以发动,并且上面各行代码什么意思必定要搞清楚。

9.3 隐式等候

隐式等候可能关于刚学的人来说比较含糊,不知道是什么意思,我可以这样了解,智能等候。为什么这么说呢,我们们需求先了解了他的用途那么为什么这么叫也就很了解了,首要我们们看下面的代码:

driver.implicitly_wait(10)

上面代码就是隐式等候,他的句子就是这样很简略。可是你有考虑过一个问题没,为什么这个等候是运用的driver?这儿需求说的是由于这个等候函数是webdriver供给的一个等候函数。那么问题又来了,既然是webdriver供给的等候函数为什么没看到他指定需求的等候目标呢?有没有考虑过这个问题呢?由于这儿的等候函数是针对我们们整个driver的。也就是说你只需是用driver去操作一个目标,或许一个元素,当你找不到这个元素或许目标的时分他就会主动的去等候你设置的这个超时时刻,如果在超时时刻内还没有找到,程序就会报错。是不是感觉这个等候太巨大上了?还不着手操练去。

可能又有人会提出疑问说:为什么你这了又driver,我们没有啊,或许说我们依照你强制等候那样将发动的封装了,然后隐式等候我们也这样封装了,然后我们这个就报错了,为什么?首要考虑一下,你回去把我们们生成driver的当地去掉封装,然后运转这样的一句话就不是就不会报错,测验一下。可是封装就报错,为什么?由于我们们这儿没有把driver回来出去,也就是说我们们需求用到的driver现在是没有被界说的,那么必定会报错,那我们怎样和前面的代码一样封装呢?看下面:

#conding="utf-8"
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)

再回过头去看代码是不是发现了不一样的当地?这儿我们们将初始化的driver进行了一个闭包,也就是给出了一个回来值,然后我们们在隐式等候中将我们们的driver进行调用,然后他就具有了driver,所以这个时分就可以像上面的代码一样进行调用该等候挑选了。

9.4 显式等候

前面我们们讲了隐式等候和强制等候,下面我们们看看显现等候,相同的先看代码:

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

首要我们们来弄了解这个挑选里边几个参数的意义:

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

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

3、poll_frequency:间隔时刻,怎样了解?就是说在超时时刻内每多少秒去查询一次,默许状况是0.5秒一次

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

在一般状况下我们们只需求填写前面两个就行。看到这儿是否发现一个问题,这个也没有定位元素,仅仅driver和时刻。是不是也是大局的呢?答案必定是否定的。在一般的状况下显式等候是需求和其他挑选一同结合的,看下面完好的代码:

driver = self.driver
WebDriverWait(driver, 10,5).until(lambda driver:driver.find_element_by_id("ssss"))

这个代码是不是又看不懂了?我们们再接着依照方才的挑选把这个代码重构一下:

#conding="utf-8"
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)
#显现等候
def wait(t):
 driver = Case(platformName,platformVersion,deviceName,app,appPackage,appActivity)
 WebDriverWait(driver, 10,5).until(lambda driver:driver.find_element_by_id("ssss"))

这儿python根底欠好的读者会有必定困难,前面的不解说。先看lambda后边的代码,他是一个匿名函数,冒号前面的是参数,冒号后边的是回来值,driver是我们们需求传入的一个参数,相似下面的代码:

def appiumDriver(driver):
 return driver.find_element_by_id("***xx");

他们俩的意思是一样的。接着看.until挑选,他给出的解说是:调用该挑选供给的驱动程序作为一个参数,直到回来值不为 False。那么整脚本的认识翻译过来是不是在10秒内每5秒去查找一个id为sss的元素,如果没找到那么就报错。

在主动化中我们们需求的是不断去学习新的思维,程序永远是跟着思维走的,如果说你的思维很好了,那么脚本怎样完成就相对而言很简略了。


浏览:

网站建设

流程

    网站建设流程