Python+Appium自动化测试(13)-toast定位

简介: 在app自动化测试的过程中经常会遇到需要对toast进行定位,最常见的就是定位toast或者获取toast的文案进行断言,如下图,通过定位"登录成功"的toast就可以断言今日头条登录用例是否通过。但toast区别于控件元素,无法获取焦点,不能通过uiautomatorviewer.bat、appium、weditor等工具定位,因此我们就需要通过别的方法来定位。

一,前言


在app自动化测试的过程中经常会遇到需要对toast进行定位,最常见的就是定位toast或者获取toast的文案进行断言,如下图,通过定位"登录成功"的toast就可以断言今日头条登录用例是否通过。但toast区别于控件元素,无法获取焦点,不能通过uiautomatorviewer.bat、appium、weditor等工具定位,因此我们就需要通过别的方法来定位。

微信图片_20220424161803.png


二,环境


  • windows 10
  • Android 10
  • appium 1.18.0 (desktop)
  • selenium 3.141.0
  • jdk 1.8


三,toast定位准备与定位方法


1,准备

注意:网上大量的博客都说定位toast需要使用uiautomator2,且需要安装appium-uiautomator2-driver。但我在以上环境定位toast时是不需要uiautomator2,也无需安装appium-uiautomator2-driver,且能定位成功!!!大家可以尝试,如果报错的话就老实按照下面步骤进行吧。


1.1,在Capablity里新增参数使用uiautomator2:

desired_caps['automationName'] = 'uiautomator2',


1.2,再安装appium-uiautomator2-driver,命令如下:

cnpm install appium-uiautomator2-driver

安装成功后在C:\Users\xxx\node_modules会出现如下文件:

_appium-uiautomator2-driver@1.12.0@appium-uiautomator2-driver
_appium-uiautomator2-server@1.10.0@appium-uiautomator2-server


2,定位方法

toast需使用xpath的方式进行定位


2.1,根据toast的文本内容定位toast


driver.find_element_by_xpath('//*[@text="xxxxxx"]')

这种方式一般用于判断或断言是否出现文本为"xxxxxx"的toast,因此我们可以封装如下:

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait
from appium.webdriver.common.mobileby import MobileBy as By
def is_toast_exist(driver, text, timeout=20, poll_frequency=0.1):
    '''
    判断toast是否存在,是则返回True,否则返回False
    :param driver: driver实例对象
    :param text: toast文本
    :param timeout: 定位超时时间
    :param poll_frequency: 查询频率
    :return: True or False
    '''
    try:
        toast_loc = (By.XPATH, ".//*[contains(@text, %s)]" % text)
        WebDriverWait(driver, timeout, poll_frequency).until(
            ec.presence_of_element_located(toast_loc)
        )
        return True
    except:
        return False


2.2,根据toast的属性className定位toast


toast的className值为:android.widget.Toast

driver.find_element_by_xpath('//*[@class="android.widget.Toast"]')

这种方式一般用于获取toast的文本内容,封装如下:

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
def get_toast_text(driver, timeout=20, poll_frequency=0.1):
    '''
    定位toast元素,获取text属性
    :param driver: driver实例对象
    :param timeout: 元素定位超时时间
    :param poll_frequency: 查询频率
    :return: toast文本内容
    '''
    toast_loc = (By.XPATH, '//*[@class="android.widget.Toast"]')
    try:
        toast = WebDriverWait(driver, timeout, poll_frequency).until(
            ec.presence_of_element_located(toast_loc)
        )
        toast_text = toast.get_attribute('text')
        return toast_text
    except Exception as e:
        return e


注意

  • 等待方式只能用presence_of_element_located(),即只能等待其存在,而不能等待其可见。
  • 如果初始化构造driver时已经使用了隐式等待implicitly_wait(),则timeout参数可以不写。


四,示例代码


定位今日头条app账号密码登录成功后的 "登录成功"toast

注意:我这里是将desired_caps里的Uiautomator2参数注释掉了,且未安装appium-uiautomator2-driver,也同样能定位到,大家可在与我相同的环境下进行尝试。

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
from appium import webdriver
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait
from appium.webdriver.common.mobileby import MobileBy as By
def android_driver():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        # "automationName": "UiAutomator2",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": True,
    }
    # 启动app
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    return driver
def is_toast_exist(driver, text, timeout=20, poll_frequency=0.1):
    '''
    判断toast是否存在,是则返回True,否则返回False
    '''
    try:
        toast_loc = (By.XPATH, ".//*[contains(@text, %s)]" % text)
        WebDriverWait(driver, timeout, poll_frequency).until(
            ec.presence_of_element_located(toast_loc)
        )
        return True
    except:
        return False
def get_toast_text(driver, timeout=20, poll_frequency=0.1):
    '''
    定位toast元素,获取text属性
    '''
    toast_loc = (By.XPATH, '//*[@class="android.widget.Toast"]')
    try:
        toast = WebDriverWait(driver, timeout, poll_frequency).until(
            ec.presence_of_element_located(toast_loc)
        )
        toast_text = toast.get_attribute('text')
        return toast_text
    except Exception as e:
        return e
def login_opera(driver):
    '''登录今日头条操作'''
    try:
        # driver.find_element_by_id("com.ss.android.article.news:id/cji").click()  # 点击【同意】
        driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 点击【我知道了】
        driver.find_element_by_id("android:id/button1").click() # 点击权限管理-确定按钮
        driver.find_element_by_xpath("//android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 点击未登录
        driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登录页点击登录按钮
        driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登录页点击“。。。”
        driver.find_element_by_xpath("//android.widget.LinearLayout[@index=4]").click() # 选择密码登录
        driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("xxxxxxxx")   # 输入账号
        driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xxxxxxxx")   # 输入密码
        driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 点击登录
    except Exception as e:
        print("登录错误,原因为:{}".format(e))
        # 报错时截图
        driver.get_screenshot_as_file(r'E:\blog\blog_script\images\test_login_error_01.png')
    else:
        toast_text = get_toast_text(driver)
        print(toast_text)
        toast_el = is_toast_exist(driver, "登录成功")
        print(toast_el)
if __name__ == '__main__':
    driver = android_driver()
    login_opera(driver)

运行结果如下,说明定位该toast成功:

C:\Users\xiaoqq\AppData\Local\Programs\Python\Python37\python.exe E:/blog/blog_script/login_jrtt.py
登录成功
True
Process finished with exit code 0
相关文章
|
11天前
|
Web App开发 测试技术 持续交付
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
23 3
|
23天前
|
安全 JavaScript 前端开发
自动化测试的魔法:如何用Python编写你的第一个测试脚本
【8月更文挑战第41天】在软件的世界里,质量是王道。而自动化测试,就像是维护这个王国的骑士,确保我们的软件产品坚不可摧。本文将引导你进入自动化测试的奇妙世界,教你如何使用Python这把强大的魔法杖,编写出能够守护你代码安全的第一道防护咒语。让我们一起开启这场魔法之旅吧!
|
19天前
|
敏捷开发 Java 测试技术
探索自动化测试的奥秘:从Selenium到Appium
【9月更文挑战第14天】软件测试,这个看似枯燥乏味却至关重要的领域,正经历着一场革命。随着技术的进步,自动化测试工具如Selenium和Appium已成为质量保证的利器。本文将带你一探这些工具的神秘面纱,了解它们如何简化测试流程、提升效率,并确保软件产品的质量。准备好,我们将深入自动化测试的世界,解锁其背后的原理和实践技巧。
|
28天前
|
测试技术 API Python
python在自动化测试中的经典例子
python在自动化测试中的经典例子
28 12
|
1月前
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
【9月更文挑战第3天】随着软件行业的迅速发展,代码质量和开发效率变得至关重要。本文探讨了Python在自动化及单元测试中的应用,介绍了Selenium、Appium、pytest等自动化测试框架,以及Python标准库中的unittest单元测试框架。通过详细阐述各框架的特点与使用方法,本文旨在帮助开发者掌握编写高效测试用例的技巧,提升代码质量与开发效率。同时,文章还提出了制定测试计划、持续集成与测试等实践建议,助力项目成功。
53 5
|
20天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:如何用Selenium和Python打造高效测试脚本
【9月更文挑战第13天】在软件开发的海洋中,自动化测试是那抹不可或缺的亮色。它不仅提升了测试效率,还保障了产品质量。本文将带你领略使用Selenium和Python构建自动化测试脚本的魅力所在,从环境的搭建到脚本的编写,再到问题的排查,每一步都是对软件质量把控的深刻理解和实践。让我们开始这段探索之旅,解锁自动化测试的秘密吧!
14 0
|
20天前
|
jenkins 测试技术 持续交付
自动化测试的高效之路:如何利用Python进行Web应用测试
【9月更文挑战第13天】在软件开发的快节奏中,自动化测试是确保质量和效率的关键。本文将引导你了解如何使用Python语言及其强大的测试框架来提升Web应用的测试效率。我们将一起探索编写简洁而强大的测试脚本的技巧,以及如何通过持续集成(CI)实现自动化测试流程。准备好让你的测试工作飞一般的感觉!
|
2月前
|
Web App开发 测试技术 持续交付
探索自动化测试:以Selenium和Python为例
【8月更文挑战第31天】自动化测试在现代软件开发中扮演着不可或缺的角色。本文将通过一个简化的示例,展示如何使用Selenium和Python进行Web应用的自动化测试。我们将从安装必要的工具开始,逐步构建一个简单的测试脚本,并执行它来验证其功能。通过这个过程,我们旨在揭示自动化测试的价值,并激励读者深入探索这一领域。
|
2月前
|
Java 测试技术 API
探索自动化测试的奥秘:从Selenium到Appium
【8月更文挑战第31天】本文旨在引导读者理解自动化测试的重要性,并逐步深入介绍如何利用Selenium和Appium这两个强大的工具来提升测试效率和质量。文章不仅分享理论知识,还通过具体代码示例,展示如何在Web应用和移动应用测试中实施自动化策略。
|
2月前
|
Web App开发 安全 测试技术
自动化测试中的Python魔法:使用Selenium和pytest框架
【8月更文挑战第31天】 在软件开发的海洋中,自动化测试是确保航行安全的灯塔。本文将带你探索如何利用Python语言结合Selenium和pytest框架,搭建一套高效的自动化测试体系。我们将从基础设置讲起,逐步深入到编写测试用例,最后通过一个实战案例来展示如何在实际项目中运用这些工具。文章旨在为读者提供一套清晰的自动化测试解决方案,让你的开发之旅更加顺畅。
下一篇
无影云桌面