首页 > 其他分享 >App测试中,强制等待和隐式等待谁更强?

App测试中,强制等待和隐式等待谁更强?

时间:2024-04-18 15:33:20浏览次数:28  
标签:appium App 元素 driver self 等待 隐式

简介

添加等待是为了确保自动化脚本在执行过程中与应用程序之间的同步和稳定性。

应用程序的响应时间是不确定的,可能存在网络延迟、加载时间、动画效果等因素。如果在执行自动化脚本时没有适当的等待机制,脚本可能会在应用程序还未完成相应操作或加载完成之前继续执行下一步,导致测试失败或产生不稳定的结果。

通过添加适当的等待操作,可以使脚本在关键操作后等待一段时间,以确保应用程序完成相关任务或操作。这可以包括显式等待(例如等待特定元素出现、消失或可点击),或隐式等待(在整个脚本执行过程中设置一个全局的等待时间)。

等待操作有助于提高脚本的稳定性,减少因应用程序响应不一致而导致的测试失败。它还能够模拟用户在与应用程序交互时的真实等待时间,提供更真实的测试场景。
因此,在编写自动化脚本时,考虑添加适当的等待操作是一个重要的实践,可以提高脚本的可靠性和稳定性,并确保脚本与应用程序之间的同步。

强制等待

  • 解决方案:在报错的元素操作之前添加等待。
  • 原理:线程休眠一定时间。
  • time.sleep(3)
import time
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class TestWait:

    def setup_class(self):
        '''
        完成 capability 设置
        初始化 driver
        :return:
        '''
        # 设置 cpability
        caps = {
            # 设置 app 安装的平台(Android,iOS)
            "platformName": "Android",
            # 设置 appium 驱动
            "appium:automationName": "uiautomator2",
            # 设置设备名称
            "appium:deviceName": "emulator-5554",
            # 设置被测 app 的包名
            "appium:appPackage": "io.appium.android.apis",
            # 设置被测 app 启动页面的 Activity
            "appium:appActivity": ".ApiDemos",
            # 不清空缓存信息
            "appium:noReset": True,
            # 首次启动的时候,不停止app
            "appium:dontStopAppOnReset": True,
            # 跳过安装,权限设置等操作
            "appium:skipDeviceInitialization": True,
        }

        # 初始化 driver
        self.driver = webdriver.Remote(
            "http://127.0.0.1:4723",
            options=UiAutomator2Options().load_capabilities(caps)
        )

    def teardown_class(self):
        '''
        关闭 driver
        :return:
        '''
        self.driver.quit()

    def test_wait(self):
        '''
        点击 OS 按钮后等待 3 秒
        输入框输入内容后等待 2 秒
        点击返回按钮后等待 2 秒
        :return:
        '''
        # 测试步骤
        # 找到 OS 元素
        el5 = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="OS")
        # 点击 OS 元素
        el5.click()
        # 等待 3 秒
        time.sleep(3)
        # 找到 Morse Code 元素
        el6 = self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Morse Code")
        el6.click()
        # 找到输入框元素
        el7 = self.driver.find_element(AppiumBy.ID, "io.appium.android.apis:id/text")
        # 在输入框中输入内容
        el7.send_keys("ceshiren.com")
        # 等待 2 秒
        time.sleep(2)
        # 点击返回按钮
        self.driver.back()
        # 等待 2 秒
        time.sleep(2)
        # 点击返回按钮
        self.driver.back()
        # 断言:判断首页中第一个元素的文本内容是 Access'ibility
        result = self.driver.find_element(
            AppiumBy.XPATH,
            "//*[@resource-id='android:id/text1'][1]"
        )
        print(result.text)
        assert result.text == "Access'ibility"

隐式等待

  • 问题:难以确定元素加载的具体等待时间。
  • 解决方案:针对于寻找元素的这个动作,使用隐式等待添加配置。
  • 演练环境:雪球 app。
  • 原理:隐式等待是一种全局的等待方式,设置一个等待时间,轮询查找(默认 0.5 秒)元素是否出现,如果没出现就抛出异常。

#设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
driver.implicitly_wait(3)

隐式等待无法解决的问题

  • 元素可以找到,使用点击等操作,出现报错。

  • 原因:

    • 页面元素加载是异步加载过程,通常 xml 会先加载完成,相应的元素属性后加载。
    • 元素存在与否是由 xml 决定,元素的交互是由属性决定。
    • 隐式等待只关注元素能不能找到,不关注元素能否点击或者进行其他的交互。
  • 解决方案:使用显式等待。

显式等待基本使用

  • 示例:WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件)。
  • 原理:在最长等待时间内,轮询,是否满足结束条件。
  • 注意:在初级时期,先关注使用。
# 显示等待 Morse Code 元素可点击
WebDriverWait(self.driver, 10).until(
    expected_conditions.element_to_be_clickable(
        (AppiumBy.ACCESSIBILITY_ID, "Morse Code")))
# 找到 Morse Code 元素
el6 = self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Morse Code")
el6.click()

总结

Appium 提供了三种等待方式,确保测试脚本在执行时与应用程序状态同步。这些等待分为强制等待、隐式等待和显式等待三种。用户可以根据不同的需求结合使用这些等待方式,以提高测试脚本的稳定性和可靠性。

标签:appium,App,元素,driver,self,等待,隐式
From: https://www.cnblogs.com/hogwarts/p/18143621

相关文章

  • web server apache tomcat11-06-Host Manager App
    前言整理这个官方翻译的系列,原因是网上大部分的tomcat版本比较旧,此版本为v11最新的版本。开源项目从零手写实现tomcatminicat别称【嗅虎】心有猛虎,轻嗅蔷薇。系列文章webserverapachetomcat11-01-官方文档入门介绍webserverapachetomcat11-02-setup启动web......
  • 实验一 球赛直播app
    墨刀、Axure、Mockplus等原型设计工具优缺点分析:一、墨刀优点:在轻量级的移动端原型制作更加迅速,展示更加方便。缺点:价格较贵,不能画流程图,相对于其他两款功能还不是很全面;应用局限性,专注于app原型设计,在后台和网页稍有乏力;归档能力不足,更倾向于链接、二维码形式输出,不能以文档输......
  • UNI-APP杂汇
    横排图标样式如下:  代码如下:<x-block><uni-sectiontitle="标题"sub-title="这是副标题"><uni-gridclass="px-2py-3":column="4":showBorder="false"squarehighlight@change=&quo......
  • 把 Maven 提交到项目?Maven Wrapper的使用与好处
    本文收录于Github.com/niumoo/JavaNotes,Java系列文档,数据结构与算法!本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗前言不知道你有没有发现,如果使用https://start.spring.io/或者使用IDEA创建一个SpringBoot项目,生成的文件列表中或有mvnw和mvnw.cmd......
  • 实验一讯飞输入法APP设计
    一、实验题目:原型设计二、实验目的:掌握产品原型设计方法和相应工具使用。三、实验要求:1.对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(1)墨刀适用领域:网页设计和移动应用界面设计快速原制作和协作设计用户体验设计和交互设计优点:界面直观,上手简......
  • 实验一原型设计——拼多多app
    一、实验题目:原型设计二、实验目的:掌握产品原型设计方法和相应工具使用。三、实验要求(1)对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(至少3条)。1.墨刀优点:云端操作,网页分享,墨刀的APP原型可以支持下载在手机里界面优美整洁。......
  • 还原美貌App-原型设计分享
    还原美貌App-原型设计分享一、实验题目:原型设计二、实验目的:掌握产品原型设计方法和相应工具使用。三、实验要求 对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(至少3条)。 1.墨刀:  ~适用领域:墨刀适用于快速原型设计和协作,特别是在移动应用和网页......
  • 打造心灵栖息地:YY日记App——原型设计分享
    YY日记App是一个专为年轻人打造的心灵日记应用,旨在提供一个私密、个性化的日记记录平台。在本篇博客中,我将分享我对YY日记App的原型设计思路和实现过程。一、用户研究  在设计YY日记App的原型之前,我进行了深入的用户研究,明确了目标用户群体为年轻人,他们希望有一个简洁易用、......
  • delphi TApplicationEvents控件,响应程序级快捷键
    在窗体中插入TApplicationEvents控件,然后设置它的onMessage事件即可 procedureTForm1.ApplicationEventsMessage(varMsg:tagMSG;varHandled:Boolean);varAktywnaForma:TForm;begin//检查是否按下CTRL键并同时按下F7键if(Msg.wParam=VK_F7)and((......
  • 实验一---原型设计---小红书app
    对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点1.墨刀优点:云端操作,网页分享,墨刀的APP原型可以支持下载在手机里界面优美整洁。简洁的界面在一定程度上有助于提高开发人员的效率。强大的演示能力。墨刀在轻量......