欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python Appium自动化测试 toast提示

程序员文章站 2022-07-12 21:02:31
...

Time will tell.

Python Appium自动化测试 toast提示

1、Toast简介

Android 中的Toast是一种简易的消息提示框。 当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。

Toast类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且Toast显示的时间有限,一般3秒左右就消失了。因此使用传统的元素定位工具,我们是无法定位到Toast元素的(传说中低调奢华有内涵)。

2、Appium Toast 内容获取

1.Appium 1.6.3 开始支持识别Toast内容,主要是基于UiAutomator2,因此需要在Capablity配置如下参数:

'automationName':'uiautomator2'
或者:
desired_caps['automationName']='uiautomator2'

2.安装appium-uiautomator2-driver安装命令如下:

cnpm install appium-uiautomator2-driver

Python Appium自动化测试 toast提示
安装成功后可以在 C:\Users\Administrator\node_modules看到对应的文件:

_appium-uiautomator2-aaa@qq.com1.12.0@appium-uiautomator2-driver
_appium-uiautomator2-aaa@qq.com1.10.0@appium-uiautomator2-server

Python Appium自动化测试 toast提示

3、测试环境

1.系统环境Windows 10版本 64位系统

2.jdk版本:1.8.0_181

3.appium版本:1.4.16

  • 经查询 appium1.6.3 以上才能识别toast,之前安装 appium 版本是 1.4.X, 于是重整了测试环境。

  • 更新 appium 到 1.6.3 以上,java-client版本最好是 5.x ,jdk 要用 1.8 、 selenium 要用 3.x ,其他版本不一定兼容,要自己亲测是否可用。

  • 想识别toast,官网是这么说,因此为了不必要的麻烦折腾环境最好还是卸载低版本的 appium ,然后安装版本高于 1.6.3 的 appium 。appium 有两种安装方式:

    方法一:

    使用下载地址:https://bitbucket.org/appium/appium.app/downloads/,可以下载 exe 应用,桌面程序,更适合新手,界面设置,更容易上手。如果不使用UIAUTOMATOR2等 appium 提供的新功能,不需要下载比较新的appium 。

    方法二:

    已安装了node.js,可以使用 npm 命令安装 appium ,打开 cmd ,输入npm install -g appium、回车,即可开始安装目前最新的版本,速度会比较慢,毕竟是国外的。

    如果不安装最新的使用命令:npm install -g aaa@qq.com,xxx 是版本号,如下载 appium1.6.3,命令为 npm install -g aaa@qq.com ,我是一开始使用方法一,之后发现几个功能 appium 要更新到 1.6.3 以上才支持,所以我目前版本更新到了 1.6.3+ 以上。

4.selenium:3.141.0

  • 安装selenium:

  • 输入指令 pip install selenium

  • 验证安装成功:pip show selenium

    Python Appium自动化测试 toast提示

5.测试设备:Android 5.1.1 (不能低于5.0版本)

Python Appium自动化测试 toast提示

6.Python:3.7.2

  • 命令:python -V ,回车即可。

    Python Appium自动化测试 toast提示
    7.测试App:考研帮Android app V3.1.0

8.测试场景

  • 进入登录界面输入错误的用户名或者密码,获取Toast内容:

    “用户名或密码错误,你还可以尝试4次”

    “验证失败次数过多,请15分钟后再试”

4、代码实现

步骤一:初始化

  • capability配置内部增加:desired_caps[‘uiautomationName’]=’ uiautomator2’

步骤二:定位toast元素

(1)定义toast文本内容

(2)定义路径

(3)组合文本内容和路径进行定位:用format()连接路径和文本内容

代码:

# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
# 3.导入模块

from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

desired_caps = {'platformName': 'Android',
                'platforVersion': '5.1.1',
                'automationName': 'Uiautomator2',
                'deviceName': '127.0.0.1:62001',
                'app': r'C:\Users\DELL\Downloads\kaoyanbang.apk',
                'appPackage': 'com.tal.kaoyan',
                'appActivity': 'com.tal.kaoyan.ui.activity.SplashActivity',
                'noReset': 'True'}

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.implicitly_wait(9)
try:
    driver.find_element_by_id("android:id/button2").click()
except NoSuchElementException:
    print(1)
try:
    driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
except NoSuchElementException:
    print(2)
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('bjhongge')

driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('1213213')
driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()

error_message = "用户名或密码错误,你还可以尝试3次"
limit_message = "验证失败次数过多,请15分钟后再试"

message = '//*[@text=\'{}\']'.format(error_message)
#message='//*[@text=\'{}\']'.format(limit_message)

toast_element = WebDriverWait(driver, 15).until(lambda x:x.find_element_by_xpath(message))
print(toast_element.text)

说明:

连接不同的类型的变量或内容format()

显示等待:webdriver(driver,5)

driver 是 webdriver 的驱动程序,5是超时时间,以秒为单位

WebDriverWait()一般由 until()until_not()方法配合使用,下面是until()until_not()方法的说明。

until(method, message=’’)

调用该方法提供的驱动程序作为一个参数,直到返回值不为 False

until_not(method, message=’’)

调用该方法提供的驱动程序作为一个参数,直到返回值为False

动态函数:lambda x:x+5

X是函数的参数,冒号后面是函数的返回值

5、封装 toast 判断

1.单独写一个函数来封装判断是否存在toast消息,存在返回True,不存在返回False

def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5):

'''
	is toast exist, return True or False

    :Agrs:

    - driver - 传driver

    - text   - 页面上看到的文本内容
 
    - timeout - 最大超时时间,默认30s

    - poll_frequency  - 间隔查询时间,默认0.5s查询一次

   :Usage:

    is_toast_exist(driver, "看到的内容")

'''

    try:
        toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text)
        WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc))
        return True
 
    except:
        return False

封装后代码参考:

# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
# 3.导入模块

from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

desired_caps = {'platformName': 'Android',
                'platforVersion': '5.1.1',
                'automationName': 'Uiautomator2',
                'deviceName': '127.0.0.1:62001',
                'app': r'C:\Users\DELL\Downloads\kaoyanbang.apk',
                'appPackage': 'com.tal.kaoyan',
                'appActivity': 'com.tal.kaoyan.ui.activity.SplashActivity',
                'noReset': 'True'}

def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5):

   '''
   is toast exist, return True or False

   :Agrs:

    - driver - 传driver

    - text   - 页面上看到的文本内容

    - timeout - 最大超时时间,默认30s

    - poll_frequency  - 间隔查询时间,默认0.5s查询一次

   :Usage:

    is_toast_exist(driver, "看到的内容")

   '''

   try:

       toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text)

       WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc))

       return True

   except:

       return False
if __name__ == "__main__":
      
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    driver.implicitly_wait(9)
    try:
        driver.find_element_by_id("android:id/button2").click()
    except NoSuchElementException:
        print(1)
    try:
        driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
    except NoSuchElementException:
        print(2)
    driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
	driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('bjhongge')

    driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('1213213')
	driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()

    error_message = "用户名或密码错误,你还可以尝试3次"
    limit_message = "验证失败次数过多,请15分钟后再试"

    print is_toast_exist(driver, error_message)

6、结尾

1.Toast内容为中文时,顶部必须注释# coding=utf-8否则会因为编解码导致文字识别失败。


2.用 npm 安装appium-uiautomator2-driver ,会出现错误,卡顿之后安装不成功。

Python Appium自动化测试 toast提示
解决办法:

(1)首先执行这个命令:npm install -g cnpm --registry=https://registry.npm.taobao.org 安装 cnpm 完成后如图:

Python Appium自动化测试 toast提示
Python Appium自动化测试 toast提示
(2)然后通过这个命令: cnpm install appium-uiautomator2-driver 安装uiautomator2的配置文件,如图:

Python Appium自动化测试 toast提示


3.cnpm与npm的区别:

(1)npm介绍

说明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)

(2)使用npm安装插件:命令提示符执行npm install [-g] [–save-dev]
:node插件名称。

例:npm install gulp-less –save-dev

  • g:全局安装。
    将会安装在 C:\Users\Administrator\AppData\Roaming\npm ,并且写入系统环境变量; 非全局安装:将会安装在当前定位目录; 全局安装可以通过命令行在任何地方调用它,本地安装将安装在定位目录的node_modules文件夹下,通过require()调用;

  • save:将保存配置信息至package.json(package.json是nodejs项目配置文件);

  • dev:保存至package.jsondevDependencies节点,不指定-dev将保存至dependencies节点;

    为什么要保存至package.json?因为node插件包相对来说非常庞大,所以不加入版本管理,将配置信息写入package.json并将其加入版本管理,其他开发者对应下载即可(命令提示符执行npm install,则会根据package.json下载所有需要的包)。

(3)使用 npm 卸载插件:npm uninstall [-g] [–save-dev] (不要直接删除本地插件包 )

(4)使用npm更新插件:npm update [-g] [–save-dev]

(5)更新全部插件:npm update [–save-dev]

(6)查看npm帮助:npm help

(7)查看当前目录已安装插件:npm list


解决办法:

选装 cnpm

说明:因为 npm 安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果 npm 的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。来自官网:“这是一个完整 npmjs.org镜像,你可以用此代替官方版本(只读),同步频率目前为10分钟 一次以保证尽量与官方服务同步。”

官方网址:http://npm.taobao.org

安装:命令提示符执行npm install cnpm -g –registry=https://registry.npm.taobao.org

注:安装完后最好查看其版本号 cnpm -v 或关闭命令提示符重新打开,安装完直接使用有可能会出现错误 。

注:cnpm 跟 npm 用法完全一致,只是在执行命令时将 npm 改为 cnpm 。

Python Appium自动化测试 toast提示

好了,至此,有关toast提示,就给分享到这里,如果你对更多内容、Python 自动化软件测试、面试题感兴趣的话可以加入我们175317069一起学习。群里会有各项测试学习资源发放,更有行业深潜多年的技术人分析讲解。

祝你能成为一名优秀的软件测试工程师!

欢迎【点赞】、【评论】、【关注】~

Time will tell.(时间会证明一切)