toast介绍
1.背景
在安卓设备里面,使用各种手机应用程序的时候,需要先进行登录操作。如果登录成功,手机下方会弹出一个“登录成功”的消息提示,一个简单的提醒,同时又不会打扰到用户,这个就是toast。
2.简介
toast,简单的消息提示框。
2.1 为了给当前视图显示一个浮动的显示块,与dialog不同,它永远不会获取焦点。
2.2 Toast类的思想:尽可能不引人注意,同时还向用户显示信息希望他们看到
2.3 Toast显示的时间有限,Toast会根据用户设置的显示时间后自动消失。
2.4 Toast本身是个系统级别的控件,它归属于系统settings,当一个app发送消息的时候,不是自己造出来的这个弹框,它是发给系统,由系统统一进行弹框。这类的控件不在app内,需要特殊的控件识别方法。
toast定位
1.appium使用uiautomator底层的机制来分析抓取toast,并且把toast放到控件树里面,但是本身并不属于控件。
2.automationName:uiautomator2
3.getPageSource是无法找到的
4.必须使用xpath查找
//*[class='android.widget.Toast']
//*[contains(@text,'xxxx')]
关键代码
def test_toast(self):
print(self.driver.find_element(MobileBy.XPATH, "//*[@class='android.widget.Toast']").text
也可以通过text属性进行定位:
def test_toast(self):
print(self.driver.find_element(MobileBy.XPATH, "//*[contains(@text, 'cliean up')]").text)
如何去定位一个toast属性?
首先应该在desired capability里添加一个属性:
desired_caps['automationName'] = 'uiautomator2'
uiautomator2是Android的默认工作引擎,在安卓设备里面,加不加这段代码都可以。
登录成功的断言
def test_toast(self):
login_success = self.driver.find_element(MobileBy.XPATH, "//*[contains(@text, 'cliean up')]").text
assert login_success == '登录成功'
完整代码
class TestToast():
def setup(self):
desired_caps = {}
desired_caps['platformName'] = 'android'
desired_caps['platformVersion'] = '6.0'
desired_caps['deviceName'] = 'emulator-5554'
desired_caps['appActivity'] = 'io.appium.android.apis.view.Poppuu'
desired_caps['appPackage'] = 'io.appium.android.apis'
desired_caps['automationName'] = 'uiautomator2'
desired_caps['dontStopAppOnReset'] = 'true'
desired_caps['noReset'] = 'true'
desired_caps['skipDeviceInitialization'] = 'true'
self.driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_toast(self):
login_success = self.driver.find_element(MobileBy.XPATH, "//*[contains(@text, '登录成功')]").text
assert login_success == '登录成功'