9.0 toast定位+WebDriverWait显示等待

Posted 佬贰不二

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.0 toast定位+WebDriverWait显示等待相关的知识,希望对你有一定的参考价值。

Toast  判断-----基本操作问题

首先基本操作,进入安卓市场的账号密码页面---

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.touch_action import TouchAction #导入Touch Action类
import time,re,os
Start={}
Start[\'platformName\']=\'android\'    #设备型号  android或者ios
Start[\'platformVersion\']=\'5.1\'  #安卓设备版本号
Start[\'deviceName\']=\'192.168.176.101:5555\'     #安卓设备名称
Start[\'app\']=r\'C:\\Users\\Administrator\\Desktop\\xuexi\\apk\\anzhuoshichang_16793302.apk\'    #设备路径  pc电脑存放apk包的路径
#上面的路径不推荐这种写法,但是目前先这么写!后续告诉大家正确的写法
Start[\'appPackage\']=\'com.hiapk.marketpho\'      #包名
Start[\'appActivity\']=\'com.baidu.appsearch.LauncherActivity\'        #容器
Start[\'noReset\']=\'True\'           #是否重新安装app  True不重新安装
Start[\'unicodeKeyboard\']=\'True\'   #是否禁用手机键盘  True禁用手机输入法
Start[\'resetKeyboard\']=\'True\'     #是否启动appium自带键盘 True开始手机输入法
Start[\'automationName\']=\'uiautomator2\'     #可选模式  本教程默认 Uiautomator2
Start[\'newCommandTimeout\']=\'400\'  #超时时间(s)
driver = webdriver.Remote(\'http://127.0.0.1:4723/wd/hub\',Start)
driver.implicitly_wait(10)  #隐式等待十秒
time.sleep(3)
\'\'\'模拟器或者手机上已经有了安卓市场,那么启动之后,直接点击左上角的头像图标\'\'\'
head=\'com.hiapk.marketpho:id/person_center_btn\'
driver.find_element_by_id(head).click()  #点击头像图标进入个人中心
time.sleep(5)
login=\'com.hiapk.marketpho:id/please_login\'
driver.find_element_by_id(login).click() #点击立即登录
time.sleep(5)

为什么要进入到这个页面呢---因为这个页面输入有个toast提示............

如图所示:这个toast提示是在uiautomator上面定位不到的,所以需要稍微处理一下!

 

 

 

然后随便输入一个手机号码和一个密码登记登录:

 

Elements=driver.find_elements_by_id(\'com.hiapk.marketpho:id/edt_text\')
Elements[0].set_text(\'17700000000\')  #因为账号输入和密码输入id相同,所以需要用到elements,之前有介绍过
Elements[1].set_text(\'123456\')
driver.find_element_by_id(\'com.hiapk.marketpho:id/btn_login\').click()

 

 

这时手机出现下图所示的toast提示:

 

之前章节有说过权限弹窗定位的那个方法--用在这里就O了!记得导入这个库

from selenium.webdriver.support import expected_conditions as EC  #实际上是调用的这个类expected_conditions  ------as EC重命名

 

使用方法: WebDriverWait(driver,30, 0.5).until(EC.presence_of_element_located(Element))

 

expected_conditions类提供的预期条件判断方法:

title_is: 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值
title_contains : 判断当前页面的title是否包含预期字符串,返回布尔值
presence_of_element_located : 判断某个元素是否被加到了dom树里,并不代表该素一定可见
visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
visibility_of : 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
presence_of_all_elements_located : 判断是否至少有1个元素存在于dom树中。
text_to_be_present_in_element : 判断某个元素中的text是否 包含 了预期的字符串
text_to_be_present_in_element_value : 判断某个元素中的value属性是否 包含 了预期的字符串
frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
invisibility_of_element_located : 判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
staleness_of : 等某个元素从dom树中移除,注意,这个方法也是返回True或False
element_to_be_selected : 判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be : 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be : 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
alert_is_present : 判断页面上是否存在alert
 

 注:如果toast用presence_of_element_locatedpan判断不到,可以考虑用alert_is_present

 

try:
    Element = ("xpath", "//*[@text=\'网络连接异常,请重试\']")
    WebDriverWait(driver,30, 0.5).until(EC.presence_of_element_located(Element))
    print(\'获取到toast提示:网络连接异常,请重试\')
except:
    print(\'凉了,兄碟\')

稍微换一下写法呢:

结果:很舒服---也是可以的--

 try:
    Element = "//*[@text=\'网络连接异常,请重试\']"
    WebDriverWait(driver,60, 0.5).until(lambda driver:driver.find_element_by_xpath(Element))
    print(\'获取到toast提示:网络连接异常,请重试\')
except:
    print(\'凉了,兄碟\')

备注:toast定位基本上是稳定的,但是偶尔会判断不鸟,属于正常现象,建议把扫描时间0.5s换成0.1s会稳定很多!

 

 

WebDriverWait(driver,60, 0.5).until(lambda driver:driver.find_element_by_xpath(Element))

 

这个是显示等待, 意思就是 等待60s   在这六十秒中,每隔0.5秒扫描一次,是否出现元素 Element

 

 

 

现在把上面的强制等待time.sleep()全部换成显示等待!

 

 

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.touch_action import TouchAction #导入Touch Action类
import time,re,os
Start={}
Start[\'platformName\']=\'android\'    #设备型号  android或者ios
Start[\'platformVersion\']=\'5.1\'  #安卓设备版本号
Start[\'deviceName\']=\'192.168.176.101:5555\'     #安卓设备名称
Start[\'app\']=r\'C:\\Users\\Administrator\\Desktop\\xuexi\\apk\\anzhuoshichang_16793302.apk\'    #设备路径  pc电脑存放apk包的路径
#上面的路径不推荐这种写法,但是目前先这么写!后续告诉大家正确的写法
Start[\'appPackage\']=\'com.hiapk.marketpho\'      #包名
Start[\'appActivity\']=\'com.baidu.appsearch.LauncherActivity\'        #容器
Start[\'noReset\']=\'True\'           #是否重新安装app  True不重新安装
Start[\'unicodeKeyboard\']=\'True\'   #是否禁用手机键盘  True禁用手机输入法
Start[\'resetKeyboard\']=\'True\'     #是否启动appium自带键盘 True开始手机输入法
Start[\'automationName\']=\'uiautomator2\'     #可选模式  本教程默认 Uiautomator2
Start[\'newCommandTimeout\']=\'400\'  #超时时间(s)
driver = webdriver.Remote(\'http://127.0.0.1:4723/wd/hub\',Start)
driver.implicitly_wait(10)  #隐式等待十秒
time.sleep(3)
\'\'\'模拟器或者手机上已经有了安卓市场,那么启动之后,直接点击左上角的头像图标\'\'\'
head=\'com.hiapk.marketpho:id/person_center_btn\'
driver.find_element_by_id(head).click()  #点击头像图标进入个人中心

# time.sleep(5)
login=\'com.hiapk.marketpho:id/please_login\'
#判断十秒内是否获取到登录元素
WebDriverWait(driver,10,0.5).until(lambda driver:driver.find_element_by_id(login))
driver.find_element_by_id(login).click() #点击立即登录
# time.sleep(5)
Elements=driver.find_elements_by_id(\'com.hiapk.marketpho:id/edt_text\')
#点击立即登录之后,获取下一页页面的元素
WebDriverWait(driver,10,0.5).until(lambda driver:driver.find_element_by_xpath(\'//*[@text="手机/邮箱/通行证"]\'))
Elements[0].set_text(\'17700000000\')  #因为账号输入和密码输入id相同,所以需要用到elements,之前有介绍过
Elements[1].set_text(\'123456\')
driver.find_element_by_id(\'com.hiapk.marketpho:id/btn_login\').click()
#因为这个toast提示时间出来的有点晚,所以等待时间稍微加那么一丢丢
# try:
#     Element = ("xpath", "//*[@text=\'网络连接异常,请重试\']")
#     WebDriverWait(driver,60, 0.5).until(EC.presence_of_element_located(Element))
#     print(\'获取到toast提示:网络连接异常,请重试\')
# except:
#     print(\'凉了,兄碟\')
try:
    Element = "//*[@text=\'网络连接异常,请重试\']"
    WebDriverWait(driver,60, 0.5).until(lambda driver:driver.find_element_by_xpath(Element))
    print(\'获取到toast提示:网络连接异常,请重试\')
except:
    print(\'凉了,兄碟\')

 

基本上原理都是大同小异....理解了之后,可以写的花里胡哨的!!!!!

 

以上是关于9.0 toast定位+WebDriverWait显示等待的主要内容,如果未能解决你的问题,请参考以下文章

appium获取Toast内容的方法

python appium 封装获取toast方法

定位及处理Web页面toast弹框

10-appium-toast定位

appium for mac怎么定位toast

Appium获取Toast消息