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
  • 相关阅读:
    ASP.NET编程的十大技巧
    C#学习心得(转)
    POJ 1177 Picture (线段树)
    POJ 3067 Japan (树状数组)
    POJ 2828 Buy Tickets (线段树)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4235 Flowers (线段树)
    POJ 2886 Who Gets the Most Candies? (线段树)
    POJ 2418 Cows (树状数组)
    HDU 4339 Query (线段树)
  • 原文地址:https://www.cnblogs.com/zdx20/p/14942794.html
Copyright © 2011-2022 走看看