Appium+python自动化(二十四)- 白素贞千年等一回许仙 - 元素等待(超详解)
<h2><strong>简介</strong> </h2><p> 许仙小时候最喜欢吃又甜又软的汤圆了,一次一颗汤圆落入西湖,被一条小白蛇衔走了。十几年后,一位身着白衣、有青衣丫鬟相伴的美丽女子与许仙相识了,她叫白娘子。白娘子聪明又善良,两个人很快走到了一起。靠着自己的力量,他们过上了幸福的生活。一天,僧人法海找到许仙,警告说白娘子是一条修行千年的蛇精,许仙不信。到了端午节,勉强喝下了雄黄酒的白娘子现了原形,许仙被吓得昏死过去。原来白娘子真的是之前吃下许仙汤圆的小蛇。白娘子辛苦救回了许仙的性命,但之后法海却以保护许仙的名义将他囚禁起来,白娘子与小青召集虾兵蟹将,要逼法海放出许仙。突然一座宝塔从天而降,把白娘子镇在了塔下…… 想必小伙伴和童鞋们都听过,或者是看过这个故事,是多么的痴情感人,尤其是千年等一回的歌曲是一个经典音乐。好了废话还是少说,进入今天的主题--元素等待<br> 前边介绍了APP页面元素的识别定位、操作等技术,可能你会觉得掌握这两项技术就可以实施APP自动化了,答案基本是这样的,毕竟元素定位和操作是核心技术。但是,在某些场景,脚本的运行并非预期那样,如,要操作的元素用常规方法无法识别、元素可以识别但在脚本运行时却未如期而至等。为了解决这些疑难杂症,接下来内容将会介绍处理这些问题的通用方法。<br> 在本节,主要介绍元素等待的使用方法和场景,该方法是开发稳定、高容错性自动化脚本的前提。</p>
<h2><strong>思考</strong></h2>
<p class="p"><span style="font-family: 微软雅黑"> 在自动化过程中,元素出现受网络环境,设备性能等多种因素影响。因此元素加载的时间可能不一致,从而会导致</span><span style="font-family: 微软雅黑">元素无法定位超时报错,但是实际上元素是正常加载了的,只是出现时间晚一点而已。那么如何解决这个问题呢?</span></p>
<p class="p"><span style="font-family: 微软雅黑">实际测试过程中,比如点击一个控件需要启动一个新activiy界面,或需要加载弹框,或请求网络加载数据成功后刷新界面,此时需要等待一段时间,新界面出现了才能继续执行UI操作,否则还在加载中,程序已开始执行新界面操作的代码,脚本就会报错了。</span></p>
<h2><strong>元素等待作用</strong></h2>
<p class="p">1.设置元素等待可以更加灵活的制定等待定位元素的时间,从而增强脚本的健壮性,提高执行效率。</p>
<p class="p">2.元素等待是为了解决如下场景的问题:脚本执行时,脚本的执行速度和页面元素的加载速度未必一致,也就是说,可能出现脚本已经运行到某个元素,但该元素尚未加载到页面,此时脚本会因无法定位到该元素而导致执行失败。元素等待本质是为了解决时序上不匹配的问题。</p>
<h2><strong>元素等待类型</strong></h2>
<table border="1" cellspacing="1" cellpadding="1" align="center">
<tbody>
<tr>
<td style="text-align: center; width: 79px">类型</td>
<td style="text-align: center; width: 220px">特点</td>
<td style="text-align: center; width: 550px">举例</td>
</tr>
<tr>
<td style="width: 79px">强制等待</td>
<td style="width: 220px">
<p style="margin-left: 0"><span style="color: rgba(36, 41, 46, 1)">设置固定的等待时间</span></p>
</td>
<td style="width: 550px">
<p>from time import sleep<br>
#强制等待5秒<br>
sleep(5)</p>
</td>
</tr>
<tr>
<td style="width: 79px">隐式等待</td>
<td style="width: 220px">
<p style="margin-left: 0"><span style="color: rgba(36, 41, 46, 1)">针对全部元素设置的等待时间</span></p>
</td>
<td style="width: 550px">
<p>driver.implicitly_wait(5)</p>
</td>
</tr>
<tr>
<td style="width: 79px">显示等待</td>
<td style="width: 220px">
<p style="margin-left: 0"><span style="color: rgba(36, 41, 46, 1)">针对某个元素来设置的等待时间</span></p>
</td>
<td style="width: 550px">
<p>from selenium.webdriver.support.ui import WebDriverWait</p>
<p>WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)</p>
</td>
</tr>
</tbody>
</table>
<h3><strong>强制等待</strong></h3>
<p><strong> 这种方法的等待,就相当于白素贞到西湖去等待许仙去,不管许仙是否出现,都要痴情地从白天等到晚上。<strong>说白了这种就是白素贞站在西湖那里一动不动地死等许仙出现。纯粹一个傻子!!!</strong></strong></p>
<p class="p"><span style="font-family: 微软雅黑">设置固定的等待时间,使用</span>sleep()方法即可实现</p>
<p>sleep(): 设置固定休眠时间。 python 的 time 包提供了休眠方法 sleep() , 导入 time包后就可以使用 sleep()进行脚本的执行过程进行休眠。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> time import sleep
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">#强制等待5秒
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> sleep(<span style="color: rgba(128, 0, 128, 1)">5</span>)</pre>
</div>
<h3><strong>隐式等待</strong></h3>
<p class="p">隐式等待是针对全部元素设置的等待时间</p>
<p class="p"> <strong>这种方法的等待,就相当于白素贞到西湖去等待许仙去,白素贞到了西湖先看看许仙在不在,一看在,白素贞完了再看看小青妹妹来没来,等小青这个电灯泡来了,再去和许仙汇合。</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">#implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">#implicitly_wait():隐式等待
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">#当使用了隐士等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">#换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">#一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">#它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">#implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> driver.implicitly_wait(<span style="color: rgba(128, 0, 128, 1)">20</span>)</pre>
</div>
<h3><strong>显式等待</strong></h3>
<p class="p">显式等待是针对某个元素来设置的等待时间。</p>
<p class="p"><strong> 这种方法的等待,就相当于白素贞到西湖去等待许仙去,白素贞到了西湖先看看许仙在不在,一看不在,白素贞自己先去做个头发;过一个小时了,白素贞回来到西湖再去看许仙在不在,一看还是不在,再去买件衣服去;过一个小时了,白素贞回来到西湖再去看许仙在不在,一看仍然不在,再去买个包包去;过一个小时了,白素贞回来到西湖再去看许仙在不在,一看还是不在,白素贞郁闷了,出去喝个小酒去;过了一小时了。。。。。。就这么来来回回的折腾的等许仙。这个白素贞通过修炼进化变得聪明了。</strong></p>
<p>WebDriverWait():同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前。页面元素是否存在,如果超过设置时间检测不到则抛出异常。</p>
<p class="p"><span style="font-family: 微软雅黑">方法</span>WebDriverWait格式参数如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">详细格式如下:</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> WebDriverWait(driver, timeout, poll_frequency=<span style="color: rgba(128, 0, 128, 1)">0.5</span>, ignored_exceptions=<span style="color: rgba(0, 0, 0, 1)">None)
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> driver -<span style="color: rgba(0, 0, 0, 1)"> WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> timeout -<span style="color: rgba(0, 0, 0, 1)"> 最长超时时间,默认以秒为单位
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> poll_frequency - 休眠时间的间隔(步长)时间,默认为 <span style="color: rgba(128, 0, 128, 1)">0.5</span><span style="color: rgba(0, 0, 0, 1)"> 秒
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> ignored_exceptions -<span style="color: rgba(0, 0, 0, 1)"> 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">WebDriverWai()一般由 until()或 until_not()方法配合使用,下面是 until()和 until_not()方法的说明。
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> until(method, message=<span style="color: rgba(0, 0, 0, 1)">’’)
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。
</span><span style="color: rgba(0, 128, 128, 1)">10</span> until_not(method, message=<span style="color: rgba(0, 0, 0, 1)">’’)
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">调用该方法提供的驱动程序作为一个参数,直到返回值为 False。
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">lambda
</span><span style="color: rgba(0, 128, 128, 1)">13</span> lambda 提供了一个运行时动态创建函数的方法。<span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> selenium.webdriver.support.ui import WebDriverWait
</span><span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span> WebDriverWait(driver,<span style="color: rgba(128, 0, 128, 1)">10</span>).until(lambda x:x.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">elementID</span><span style="color: rgba(128, 0, 0, 1)">"</span>))</pre>
</div>
<p>其中,三种等待方法的作用和区别,如下:</p>
<p><strong>强制等待</strong>,也就是常说的死等待,使用time模块提供的sleep方法,脚本在等待sleep(x) x秒后才执行,此时脚本也许出现了无效等待,即元素已经出现,可以继续操作,但因指定的时间未到,脚本无法执行,因而,在实际Web UI开发中应杜绝sleep等待;</p>
<p><strong>显式等待,</strong>WebDriver提供的针对元素级别的、灵活、智能的等待方法,通过配合until()、until_not()、ExpectedCondition等条件的使用,默认每500ms检查一次条件状态,可以及时将脚本从等待中唤醒,避免无效等待,在实际应用中推荐使用该方法。</p>
<p>该等待的调用方法如下:</p>
<p>WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)</p>
<p><strong>隐式等待,</strong>WebDriver提供的针对driver级别的适用整个生命周期的等待方法,该等待是全局设置,因而只需在实例化driver后设置一次即可。从等待作用上看,是可以满足需要的,但是考虑到实际应用场景,driver要等待的元素和脚本要操作的元素未必相同,也就是说,脚本要操作的元素已经出现,但因为设置了全局等待,driver也会继续等待页面上其他无关元素,直至整个页面加载完毕。因而,与显式等待相比,可能出现无效等待的情况。</p>
<h2><strong>等待方法实战举例</strong></h2>
<h3>1.强制等待方法应用实例</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> # coding=utf-<span style="color: rgba(128, 0, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> # <span style="color: rgba(128, 0, 128, 1)">1</span>.先设置编码,utf-<span style="color: rgba(0, 0, 0, 1)">8可支持中英文,如上,一般放在第一行
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> # <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.注释:包括记录创建时间,创建人,项目名称。
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> Created on <span style="color: rgba(128, 0, 128, 1)">2019</span>-<span style="color: rgba(128, 0, 128, 1)">7</span>-<span style="color: rgba(128, 0, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> @author: 北京-宏哥 QQ交流群:<span style="color: rgba(128, 0, 128, 1)">707699217</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> Project:学习和使用appium自动化测试-<span style="color: rgba(0, 0, 0, 1)">元素等待
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)">10</span> # <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">.导入模块
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> appium import webdriver
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">import time
</span><span style="color: rgba(0, 128, 128, 1)">13</span> desired_caps =<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 128, 128, 1)">14</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformName</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> #android的apk还是IOS的ipa
</span><span style="color: rgba(0, 128, 128, 1)">15</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformVersion</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">8.0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#android系统的版本号
</span><span style="color: rgba(0, 128, 128, 1)">16</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">deviceName</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1:62001</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> #手机设备名称,通过adb devices查看
</span><span style="color: rgba(0, 128, 128, 1)">17</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appPackage</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#apk的包名
</span><span style="color: rgba(0, 128, 128, 1)">18</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appActivity</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.tao.welcome.Welcome</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#apk的launcherActivity
</span><span style="color: rgba(0, 128, 128, 1)">19</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">unicodeKeyboard</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> True #使用unicodeKeyboard的编码方式来发送字符串
</span><span style="color: rgba(0, 128, 128, 1)">20</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">resetKeyboard</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> True #将键盘给隐藏起来
</span><span style="color: rgba(0, 128, 128, 1)">21</span> driver = webdriver.Remote(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:4723/wd/hub</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, desired_caps) #启动服务器地址,后面跟的是手机信息
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)"># 休眠五秒等待页面加载完成
</span><span style="color: rgba(0, 128, 128, 1)">23</span> time.sleep(<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">) #强制等待5s,不管等待的元素是否出现,都要等5s
</span><span style="color: rgba(0, 128, 128, 1)">24</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/home_searchedit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).click()
</span><span style="color: rgba(0, 128, 128, 1)">25</span> time.sleep(<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)#演示效果
</span><span style="color: rgba(0, 128, 128, 1)">26</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/searchEdit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).click()
</span><span style="color: rgba(0, 128, 128, 1)">27 </span>driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys(u"北京-宏哥")<br><span style="color: rgba(0, 128, 128, 1)">28</span> driver.quit()</pre>
</div>
<h3>2.显示等待方法应用实例</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> # coding=utf-<span style="color: rgba(128, 0, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> # <span style="color: rgba(128, 0, 128, 1)">1</span>.先设置编码,utf-<span style="color: rgba(0, 0, 0, 1)">8可支持中英文,如上,一般放在第一行
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> # <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.注释:包括记录创建时间,创建人,项目名称。
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> Created on <span style="color: rgba(128, 0, 128, 1)">2019</span>-<span style="color: rgba(128, 0, 128, 1)">7</span>-<span style="color: rgba(128, 0, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> @author: 北京-宏哥 QQ交流群:<span style="color: rgba(128, 0, 128, 1)">707699217</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> Project:学习和使用appium自动化测试-<span style="color: rgba(0, 0, 0, 1)">元素等待
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)">10</span> # <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">.导入模块
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> appium import webdriver
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> selenium.webdriver.support.ui import WebDriverWait
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">import time
</span><span style="color: rgba(0, 128, 128, 1)">14</span> desired_caps =<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 128, 128, 1)">15</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformName</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> #android的apk还是IOS的ipa
</span><span style="color: rgba(0, 128, 128, 1)">16</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformVersion</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">8.0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#android系统的版本号
</span><span style="color: rgba(0, 128, 128, 1)">17</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">deviceName</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1:62001</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> #手机设备名称,通过adb devices查看
</span><span style="color: rgba(0, 128, 128, 1)">18</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appPackage</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#apk的包名
</span><span style="color: rgba(0, 128, 128, 1)">19</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appActivity</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.tao.welcome.Welcome</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#apk的launcherActivity
</span><span style="color: rgba(0, 128, 128, 1)">20</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">unicodeKeyboard</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> True #使用unicodeKeyboard的编码方式来发送字符串
</span><span style="color: rgba(0, 128, 128, 1)">21</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">resetKeyboard</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> True #将键盘给隐藏起来
</span><span style="color: rgba(0, 128, 128, 1)">22</span> driver = webdriver.Remote(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:4723/wd/hub</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, desired_caps) #启动服务器地址,后面跟的是手机信息
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)"> # 显示等待(等待特定元素出现)
</span><span style="color: rgba(0, 128, 128, 1)">25</span> WebDriverWait(driver, <span style="color: rgba(128, 0, 128, 1)">3</span>).until(lambda x: x.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/home_searchedit</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">26</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/home_searchedit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).click()
</span><span style="color: rgba(0, 128, 128, 1)">27</span> time.sleep(<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)# 演示效果
</span><span style="color: rgba(0, 128, 128, 1)">28</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/searchEdit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).click()
</span><span style="color: rgba(0, 128, 128, 1)">29</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/searchEdit</span><span style="color: rgba(128, 0, 0, 1)">"</span>).send_keys(u<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">北京-宏哥</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">31</span> driver.quit()</pre>
</div>
<h3>3.隐式等待方法应用实例</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> # coding=utf-<span style="color: rgba(128, 0, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> # <span style="color: rgba(128, 0, 128, 1)">1</span>.先设置编码,utf-<span style="color: rgba(0, 0, 0, 1)">8可支持中英文,如上,一般放在第一行
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> # <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.注释:包括记录创建时间,创建人,项目名称。
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> Created on <span style="color: rgba(128, 0, 128, 1)">2019</span>-<span style="color: rgba(128, 0, 128, 1)">7</span>-<span style="color: rgba(128, 0, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> @author: 北京-宏哥 QQ交流群:<span style="color: rgba(128, 0, 128, 1)">707699217</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> Project:学习和使用appium自动化测试-<span style="color: rgba(0, 0, 0, 1)">元素等待
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)">10</span> # <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">.导入模块
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> appium import webdriver
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> selenium.webdriver.support.ui import WebDriverWait
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">import time
</span><span style="color: rgba(0, 128, 128, 1)">14</span> desired_caps =<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 128, 128, 1)">15</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformName</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> #android的apk还是IOS的ipa
</span><span style="color: rgba(0, 128, 128, 1)">16</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformVersion</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">8.0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#android系统的版本号
</span><span style="color: rgba(0, 128, 128, 1)">17</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">deviceName</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1:62001</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> #手机设备名称,通过adb devices查看
</span><span style="color: rgba(0, 128, 128, 1)">18</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appPackage</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#apk的包名
</span><span style="color: rgba(0, 128, 128, 1)">19</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appActivity</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.tao.welcome.Welcome</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">#apk的launcherActivity
</span><span style="color: rgba(0, 128, 128, 1)">20</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">unicodeKeyboard</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> True #使用unicodeKeyboard的编码方式来发送字符串
</span><span style="color: rgba(0, 128, 128, 1)">21</span> desired_caps[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">resetKeyboard</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> True #将键盘给隐藏起来
</span><span style="color: rgba(0, 128, 128, 1)">22</span> driver = webdriver.Remote(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:4723/wd/hub</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, desired_caps) #启动服务器地址,后面跟的是手机信息
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)"># 隐式等待(等待所有元素)
</span><span style="color: rgba(0, 128, 128, 1)">25</span> driver.implicitly_wait(<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)#隐式等待,最长3s
</span><span style="color: rgba(0, 128, 128, 1)">26</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/home_searchedit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).click()
</span><span style="color: rgba(0, 128, 128, 1)">27</span> time.sleep(<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)#演示效果
</span><span style="color: rgba(0, 128, 128, 1)">28</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/searchEdit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).click()
</span><span style="color: rgba(0, 128, 128, 1)">29</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao:id/searchEdit</span><span style="color: rgba(128, 0, 0, 1)">"</span>).send_keys(u<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">北京-宏哥</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">30</span> driver.quit()</pre>
</div>
<h2><strong>小结</strong></h2>
<p>1.本节主要介绍appium自动化中三种元素等待方法,并讲解了各自的优缺点,实际开发中推荐使用显示等待,最后,为了便于理解和应用,针对每种等待方法,编写了对应的脚本。</p>
<p>2.强制等待的方法,在debug时候很有用,不过建议慎用这种方法,因为太死板,严重影响程序执行速度!</p>
<p>3.以上三种等待方法,在具体的场景中需要根据情况选择合适的方法,灵活运用。。。</p>
<p>4.做过自动化的小伙伴们或者童鞋们,在启动app的时候,幸运的小伙伴和同学们都会中这个大奖:如果直接做下一步点击操作,经常会报错,于是我们便会自然而然的想到上边介绍的三种方法,会在启动完成的时候加sleep等方法。那么问题来了,宏哥问你这个sleep时间到底设置多少合适呢?你不知道宏哥也不知道这个问题的答案,如果设置长了,就浪费时间,设置短了,就会找不到元素报错了。过长过短都是个让你头疼的事,那么有没有别的方法可以克服这个问题了。当然有,宏哥一般人都不告诉他,大家都是二般人,就分享给各位吧!但是这个只是针对安卓手机的哦,要记住了,iPhone不适合的。这个时候我们可以用wait_activity的语法,等到你想点击的页面activity出现了,再点击,可以有效的节省时间。</p>
<h3 id="2">wait_activity</h3>
<p>(1)查看源码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> def wait_activity(self, activity, timeout, interval=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">):
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">Wait for an activity: block until target activity presents</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> or time <span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)">.
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> This <span style="color: rgba(0, 0, 255, 1)">is</span> an Android-<span style="color: rgba(0, 0, 0, 1)">only method.
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)"> :Agrs:
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> - activity -<span style="color: rgba(0, 0, 0, 1)"> target activity
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> - timeout - max wait time, <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> seconds
</span><span style="color: rgba(0, 128, 128, 1)">10</span> - interval - sleep interval between retries, <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> seconds
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(128, 0, 0, 1)">"""
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> WebDriverWait(self, timeout, interval).until(
</span><span style="color: rgba(0, 128, 128, 1)">14</span> lambda d: d.current_activity ==<span style="color: rgba(0, 0, 0, 1)"> activity)
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> True
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)"> except TimeoutException:
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 255, 1)">return</span> False</pre>
</div>
<p>(2)解释说明:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> wait_activity(self, activity, timeout, interval=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">):
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)"> 等待指定的activity出现直到超时,interval为扫描间隔1秒
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)"> 即每隔几秒获取一次当前的activity
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)"> android特有的
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)"> 返回的True 或 False
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)"> :Agrs:
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> - activity -<span style="color: rgba(0, 0, 0, 1)"> 需等待的目标 activity
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> - timeout -<span style="color: rgba(0, 0, 0, 1)"> 最大超时时间,单位是s
</span><span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span> - interval -<span style="color: rgba(0, 0, 0, 1)"> 循环查询时间
</span><span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> 用法:driver.wait_activity(‘.activity.xxx’,<span style="color: rgba(128, 0, 128, 1)">5</span>,<span style="color: rgba(128, 0, 128, 1)">2</span>)</pre>
</div>
<h3 id="3">获取current_activity</h3>
<p>(1)打开app后,先sleep10秒,等app完全启动完成进入主页面,然后获取当前界面的activity</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> # coding=utf-<span style="color: rgba(128, 0, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> # <span style="color: rgba(128, 0, 128, 1)">1</span>.先设置编码,utf-<span style="color: rgba(0, 0, 0, 1)">8可支持中英文,如上,一般放在第一行
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> # <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.注释:包括记录创建时间,创建人,项目名称。
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> Created on <span style="color: rgba(128, 0, 128, 1)">2019</span>-<span style="color: rgba(128, 0, 128, 1)">7</span>-<span style="color: rgba(128, 0, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> @author: 北京-宏哥 QQ交流群:<span style="color: rgba(128, 0, 128, 1)">707699217</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> Project:学习和使用appium自动化测试-<span style="color: rgba(0, 0, 0, 1)">元素等待
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)">10</span> # <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">.导入模块
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> appium import webdriver
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> time import sleep
</span><span style="color: rgba(0, 128, 128, 1)">13</span> desired_caps =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformName</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">deviceName</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1:62001</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformVersion</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">4.4.2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appPackage</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.baidu.yuedu</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appActivity</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.baidu.yuedu.splash.SplashActivity</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">20</span> driver = webdriver.Remote(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:4723/wd/hub</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, desired_caps)
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> sleep(<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)"># 获取当前界面activity
</span><span style="color: rgba(0, 128, 128, 1)">24</span> ac =<span style="color: rgba(0, 0, 0, 1)"> driver.current_activity
</span><span style="color: rgba(0, 128, 128, 1)">25</span> print(ac)</pre>
</div>
<p>(2)运行结果:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190726144903464-449330011.png"></p>
<h3 id="4">等待activity</h3>
<p>(1)用sleep太浪费时间了,并且不知道什么时候能启动完成,所以尽量不用sleep,宏哥也不推荐使用。因为这个确实是太low了。</p>
<p>(2)上一步已经获取当主页面的activity了,那就可以用wait_activity等它出现了,再做下一步的点击操作</p>
<p><img src="https://yqfile.alicdn.com/img_655261fd782532bb9276d67dac7b5e5b.png"></p>
<p data-spm-anchor-id="a2c4e.11153940.0.i5.2b614376telqYs">(3)参考代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> # coding=utf-<span style="color: rgba(128, 0, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> # <span style="color: rgba(128, 0, 128, 1)">1</span>.先设置编码,utf-<span style="color: rgba(0, 0, 0, 1)">8可支持中英文,如上,一般放在第一行
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> # <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.注释:包括记录创建时间,创建人,项目名称。
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> Created on <span style="color: rgba(128, 0, 128, 1)">2019</span>-<span style="color: rgba(128, 0, 128, 1)">7</span>-<span style="color: rgba(128, 0, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> @author: 北京-宏哥 QQ交流群:<span style="color: rgba(128, 0, 128, 1)">707699217</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> Project:学习和使用appium自动化测试-<span style="color: rgba(0, 0, 0, 1)">元素等待
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(128, 0, 0, 1)">'''
</span><span style="color: rgba(0, 128, 128, 1)">10</span> # <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">.导入模块
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> appium import webdriver
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> time import sleep
</span><span style="color: rgba(0, 128, 128, 1)">13</span> desired_caps =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformName</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">deviceName</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1:62001</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">platformVersion</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">4.4.2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appPackage</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.baidu.yuedu</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appActivity</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.baidu.yuedu.splash.SplashActivity</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">20</span> driver = webdriver.Remote(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://127.0.0.1:4723/wd/hub</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, desired_caps)
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> # sleep(<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">)# 不用sleep
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)"># 获取当前界面activity
</span><span style="color: rgba(0, 128, 128, 1)">25</span> ac =<span style="color: rgba(0, 0, 0, 1)"> driver.current_activity
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">print(ac)
</span><span style="color: rgba(0, 128, 128, 1)">27</span>
<span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)"># 等主页面activity出现,30秒内
</span><span style="color: rgba(0, 128, 128, 1)">29</span> driver.wait_activity(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.base.ui.MainActivity</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">30</span>
<span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 0, 1)"># 点知道了
</span><span style="color: rgba(0, 128, 128, 1)">32</span> driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.baidu.yuedu:id/positive</span><span style="color: rgba(128, 0, 0, 1)">"</span>).click()</pre>
</div>
<p>5. 好了,关于元素等待目前就说这么多!!!</p>
<p><span style="font-size: 14pt"><strong><strong>您的肯定就是我进步的动力。</strong>如果你感觉还不错,就请鼓励一下吧!记得点波 <span style="font-size: 18pt; color: rgba(255, 0, 0, 1)">推荐</span> 哦!!!(点击右边的小球即可,胆子大的可以试一下 <span style="color: rgba(255, 0, 0, 1)">:)</span>)</strong></span><br><img src="https://img-bbs.csdn.net/upload/201609/27/1474961982_791741.gif"></p>
<p><strong>个人公众号</strong></p>
<p><img alt="" width="158" height="158" data-src="https://img2018.cnblogs.com/blog/1232840/201906/1232840-20190613114641312-1547169156.png"></p>
<p><strong>微信群</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724094259908-725232122.png"></p>
</div>
<div id="MySignature" role="contentinfo">
<div id="MySignature" style="display: block">
<div style="font-size: 13px; border: 1px dashed rgb(45, 161, 45); padding: 10px 15px; background-color: rgb(248, 248, 248)">
<label style="font-weight: bold">
为了方便大家在移动端也能看到我分享的博文,现已注册个人微信公众号,扫描左下方二维码即可,欢迎大家关注,提前解锁更多测试干货!有时间会及时分享相关技术博文。
</label>
<br>
<label style="font-weight: bold">
为了方便大家互动讨论相关技术问题,刚刚建立了咱们的专门的微信群交流互动群,群内会分享交流测试领域前沿知识。请您扫描中间的微信二维码进群
</label>
<br>
<label style="font-weight: bold">
为了方便大家互动讨论相关技术问题,现已组建专门的微信群,由于微信群满100,请您扫描右下方宏哥个人微信二维码拉你进群
<label style="font-weight: bold; color: red; font-size: 15px">
(请务必备注:已关注公众号进群)平时上班忙(和你一样),所以加好友不及时,请稍安勿躁~
</label>
,欢迎大家加入这个大家庭,我们一起畅游知识的海洋。
</label>
<br>
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
<br>
如果您觉得阅读本文对您有帮助,请点一下左下角
“推荐”
按钮,您的
<label style="font-weight: bold; color: red; font-size: 15px">
“推荐”
</label>
将是我最大的写作动力!另外您也可以选择
【
<strong>
关注我
</strong>
】
,可以很方便找到我!
<br>
本文版权归作者和博客园共有,来源网址:
https://www.cnblogs.com/du-hong
欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
</div>
<div style="text-align: center; margin-top: 10px">
<p style=" font-weight: bolder; color: red; ">
公众号(关注宏哥)     
        
       
       
微信群(扫码进群)    
       
       
    
      
      客服微信
</p>
<img style="width: 200px;padding-right: 50px;" alt="个人微信公众号" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191119095948011-608816619.png">
<img style="width: 200px;padding-right: 65px;" alt="微信群" src="https://img2024.cnblogs.com/blog/1232840/202506/1232840-20250610113707419-637869921.png">
<img style="width: 200px" alt="个人微信" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191106101257091-849954564.png">
</div>
</div><br><br>
来源:https://www.cnblogs.com/du-hong/p/11243741.html
頁:
[1]