Appium python自动化测试系列之等待函数如何进行实战(九)
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("xxxxx");
他们俩的意思是一样的。接着看.until方法,他给出的解释是:调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。那么整脚本的意识翻译过来是不是在10秒内每5秒去查找一个id为sss的元素,如果没找到那么就报错。
在自动化中我们需要的是不断去学习新的思想,程序永远是跟着思想走的,如果说你的思想很好了,那么脚本怎么实现就相对而言很简单了。
Appium python自动化测试系列之等待函数如何进行实战(九)的更多相关文章
- Appium python自动化测试系列之滑动函数封装实战(八)
8.1 什么是函数的封装 教科书上函数的封装太官方,我们这里暂且将函数的封装就是为了偷懒把一些有共性的功能或者一些经常用的功能以及模块放在一起,方便我们以后再其他地方调用.这个只是个人的理解所以大家懂 ...
- Appium python自动化测试系列之页面滑动原理讲解(十)
10.1.1 页面滑动原理分析 在页面滑动查找章节我们就讲了滑动的知识点,只是不知道大家是否有认真练习以及去理解,如果你认真练习.理解了那么我相信这一章节的东西不用看也能够完成,下面我们还是简单分析一 ...
- Appium python自动化测试系列之元素的定位(六)
6.1 常用定位方法讲解 对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你对象都没定位那么你想操作也不行.所以本章节的知识我希望大家多动手去操作,不要仅仅只是书本上的知识,毕竟这个 ...
- Appium python自动化测试系列之认识Appium(四)
4.1界面认识 在之前安装appium的时候说过我们有两种方法安装,也就有两种结果,一种是有界面的,一种是没有界面的,首先我们先讲一下有界面的,以及界面有哪些东西. 首先看第一幅图,如果你的是win ...
- Appium python自动化测试系列之移动自动化测试前提(一)
1.1 移动自动化测试现状 因为软件行业越来越发达,用户的接受度也在不断提高,所以对软件质量的要求也随之提高,当然这个也要分行业,但这个还是包含了大部分.因为成本.质量的变化现在对自动化测试的重视度越 ...
- Appium python自动化测试系列之appium环境搭建(二)
2.1 基础环境搭建 当我们学习新的一项技术开始基本都是从环境搭建开始,本书除了第一章节也是的,如果你连最基础的环境都没有那么我们也没必要去说太多,大概介绍一下: 1.因为appium是支持andr ...
- Appium python自动化测试系列之Capability介绍(五)
5.1 Capability介绍 5.1.1 什么是Capability 在讲capability之前大家是否还记得在讲log时给大家看过的启动时的日志?在我们的整个启动日志中会出现一些配置信息,其 ...
- Appium python自动化测试系列之自动化截图(十一)
11.1 截图函数的正常使用 11.1.1 截图方法 无论是在手动测试还是自动化测试中场景复现永远是一个很重要的事情,有时候一些问题可能很难复现,这个都需要测试人员对bug有很高的敏感度,在一般的情况 ...
- Appium python自动化测试系列之混合app实战(十一)
12.1 什么是混合App 12.1.1 混合app定义 什么是混合app,其实这个不言而喻,我们的app正常来说应该都是native的,但是实际工作中却不是,反正种种原因我们的app会有native ...
随机推荐
- Java-判断一个数是不是素数
import java.util.Scanner; /** * @author 薛定谔的猫 * java判断一个数是不是素数 * * 素数又称质数,是指在一个大于1的自然数中,除了1和本身之外,不能被 ...
- centos7配置dhcp
用su 获取root权限 用yum -y install dhcp命令安装dhcp服务(yum是基于RPM包管 理,自动下载RPM包并且安装) 查看安装后生成的配置文件 rpm -qc dhcp 编辑 ...
- Java-大集合拆分为指定大小的小集合
因为Oracle数据的in 最大允许1000 ,超过就会报错, 所以需要将集合拆分为多个集合进行处理. /** * 拆分集合 * @param <T> * @param resList 要 ...
- DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week2优化算法
1. Mini-batch梯度下降法 介绍 假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理: 如图所示,我 ...
- merge 语法解析
merge into 支持sqlserver 2008 和以上的版本 无论是INSERT还是UPDATE,从执行之间上看,MERGE INTO(MERGE)都要比直接INSERT/UPDATE的效率高 ...
- [UIKit学习]03.关于UILable
代码创建UILabel UILabel *label = [[UILabel alloc] init]; label.text = @"单肩包"; label.frame = CG ...
- idea启动tomcat报错:Error during artifact deployment. See server log for details.
出现这种情况的原因老夫猜想是改变了artifact然而tomcat的配置中的artifact没有重新配就会出现这种报错 打开tomcat配置 删除原来的artifact 新添加artifact 保存 ...
- java基础解析系列(六)---深入注解原理及使用
java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer ja ...
- 《HelloGitHub》第 18 期
<HelloGitHub>第 18 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...
- springmvc 格式化返回日期格式
<mvc:annotation-driven conversion-service="conversionService"> <mvc:message-conve ...