zoukankan      html  css  js  c++  java
  • App自动化测试:等待webview页面数据加载完成

    App自动化测试:等待webview页面数据加载完成

    一、适用场景

         App自动化测试时,经常有混合H5页面的测试场景,该场景下通过Python+Appium自动化测试时用到的方法,与Python+Selenium进行Web端自动化测试时用到的方法相同,都是继承于WebDriver。

    比如元素的三大显示等待:

        1、表示元素被加载  presence_of_element_located()

        2、表示元素可以被看见  visibility_of_element_located()

        3、等待元素可以被点击  element_to_be_clickable()

    上面三种常用的显示等待能基本满足自动化测试需要,但也有特殊场景无法满足的,如下:

       

         需求:在商品详情页点击“立即购买”,可以购买该商品成功。(该页面是App内嵌的webview页面)

         在App自动化测试过程中,当进入上面的商品详情页时,需要加载大量的详情数据。但是“立即购买”按钮先于详情数据加载完成,所以此时点击“立即购买”按钮时,页面会无任何反应或有错误提示,导致自动化测试过程中断。

         通常的解决办法是设置显示等待,查找某个元素加载完成后,再点击“立即购买”按钮。但存在一个缺陷是,不知道等待商品详情页面的哪个元素,因为详情页的元素太多,且每次加载情况还不相同。此时需要一个通用的方法,等待页面所有的数据加载完成,而不管是什么数据。

    二、解决办法

         1、封装一个等待方法

         selenium的page_source方法可以获取到页面源码,页面在加载数据时源码都是在持续更新的,当页面数据加载完成时源码就不会再更新,因此我们可以封装一个方法,在源码不再更新时执行下一步操作。

         封装的方法如下:

    def wait_data_load(self, boolean=True, wait_time=0.3):
        """
        等待webview页面数据加载完成
        :param boolean:是否需要滑屏操作,默认需要滑屏
        :param wait_time:每次查询加载状态的时间间隔
        """
        old_page = ''
       time.sleep(wait_time) new_page = self.driver.page_source while old_page != new_page: if boolean: self.swipe_up() time.sleep(wait_time) old_page = new_page new_page = self.driver.page_source my_log.info("webview页面数据加载完成") def swipe_up(self): """向上滑动屏幕""" return self.driver.swipe(self.width() * 0.5, self.height() * 0.9, self.width() * 0.5, self.height() * 0.1)

          代码中self.swipe_up() 是向上滑动手机屏幕的方法,也可以不用加该方法。在每次获取源码后加了time.sleep(wait_time)强制等待,是为了加强执行时的稳定性。如果运行的环境网络状态很好,可以将强制等待时间设置很短,甚至不设置等待。具体强制等待时间,需要根据页面加载数据量,当前网络状态去设置。

          上面的方法试用多个场景后,基本能解决webview页面加载数据量大,需要等待所有数据加载完成的问题。

          2、改进点击方法

          以文中的商品详情截图为例,如果不需要在页面进行其他的操作,只需要点击“立即购买”按钮时,可以循环去点击这个按钮直至点击成功。

          方法如下:

    def wait_click_element_success(self, locater, timeout=30, frequcy=0.5):
        """
        循环点击某个元素
        :param locater:元素定位器
        :param timeout:总超时时间
        :param frequcy:等待点击时间间隔
        """
        used_time = 0
        while used_time < timeout:
            try:
                time.sleep(frequcy)
                self.driver.find_element(*locater).click()
                return
            except:
                time.sleep(frequcy)
                used_time += frequcy
        # 截图保存, 使用单独的文件夹存储截图,截图名字加上时间戳
        self.screen_shot()
        raise
  • 相关阅读:
    JAVA类与对象(十)-----抽象类
    JAVA类与对象(九)------多态
    JAVA类与对象(八)-----重写
    JAVA类与对象(七)------继承
    Mysql与Oracle区别
    redis缓存技术学习
    关于java中B/S架构
    关于java中C/S架构,创建服务器和客户端
    JQuery 轮播图片
    Kendo中ListView 无分页控件显示和有分页控件显示
  • 原文地址:https://www.cnblogs.com/zdx20/p/14942794.html
Copyright © 2011-2022 走看看