`
fantaxy025025
  • 浏览: 1311450 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Appium+Native滑动到元素或滑动到页面底部

 
阅读更多

=

小结:

webview可以find到不在view内的元素。

但是Appium的native_view不能find到不在view内的元素。这就造成了想swipe到某个元素的方案,有问题。

 

webview可以运行js来滑动。

native_view不能用js。

=

参考:

http://www.cnblogs.com/tobecrazy/p/4612133.html

http://blog.csdn.net/JuniorKang/article/details/52880458?locationNum=4&fps=1

http://blog.sina.com.cn/s/blog_bd6a57440102wm1x.html

=

代码:

driver(就是把appiudriver对象传进来)

during(这里是填写毫秒数,这里的 毫秒数越小 滑动的速度越快~ 一般设定在500~1000,如果你想快速滑动 那就可以设置的更加小)

num(是只滑动的次数,本人在做相册 翻页测试什么的 滑动  或者滑动到列表底部。就直接输入次数就行了)

    /**
     * 上滑
     *
     * @param driver
     * @param during
     * @param swipeCount
     */
    public static void swipeToUp(AppiumDriver driver,int during, int swipeCount) {
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        for (int i = 0; i < swipeCount; i++) {
            driver.swipe(width / 2, height * 3 / 4, width / 2, height / 4, during);
            CommonUtil.sleep(1000, "swipeToUp sleep when swipeCount > 0, now swipeCount=" + swipeCount + ",");
        }
    }

    /**
     * 下拉
     *
     * @param driver
     * @param during
     * @param swipeCount
     */
    public static void swipeToDown(AppiumDriver driver,int during, int swipeCount) {
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        System.out.println(width);
        System.out.println(height);
        for (int i = 0; i < swipeCount; i++) {
            driver.swipe(width / 2, height / 4, width / 2, height * 3 / 4, during);
            CommonUtil.sleep(1000, "swipeToDown sleep when swipeCount > 0, now swipeCount=" + swipeCount + ",");
        }
    }

    /**
     * 向左滑动
     *
     * @param driver
     * @param during
     * @param swipeCount
     */
    public static void swipeToLeft(AppiumDriver driver,int during, int swipeCount) {
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        for (int i = 0; i < swipeCount; i++) {
            driver.swipe(width * 3 / 4, height / 2, width / 4, height / 2, during);
            CommonUtil.sleep(1000, "swipeToLeft sleep when swipeCount > 0, now swipeCount=" + swipeCount + ",");
        }
    }

    /**
     * 向右滑动
     *
     * @param driver
     * @param during
     * @param swipeCount
     */
    public static void swipeToRight(AppiumDriver driver, int during, int swipeCount) {
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        for (int i = 0; i < swipeCount; i++) {
            driver.swipe(width / 4, height / 2, width * 3 / 4, height / 2, during);
            CommonUtil.sleep(1000, "swipeToRight sleep when swipeCount > 0, now swipeCount=" + swipeCount + ",");
        }
    }

 

 

=

from:http://blog.sina.com.cn/s/blog_bd6a57440102wm1x.html

在web上滑动到页面底部、滑动到xxx元素我们可以很简单的用js就可以实现,但是到了Native app会发现不管我们是做scrollToElement操作还是要对listview最后一条记录做断言的时候都不好操作,
第一、简单的swipe操作很难适用于动态的数据或者想做通用平台的app自动化。因为我们不能确定要执行多少次滑动操作。
第二、swipe操作并不自带断言功能,当网络不好的时候页面不能滑动的时候swipe也是默然成功的。
我在查找解决方式的时候发现有的童鞋是获取listview的最后一个元素,在滑动之后再次获取最后一个元素然后用string的等于匹配第一次获取的文本来判断是否滑动到了底部。这种方式可能在一些特定的场景还是可用的但是对于不是listview或者不能通过getsize()-1来获取最后一个元素的组件这种方式显得很无力,这里我还是把这种方式的代码贴一下但是真心用处不多:
    // 第一次滑动前,获取最后一个元素
        List infolists1 = driver.findElementsById("resourceId");
        String originalinfo = infolists1.get(infolists1.size() - 1).getAttribute("text");
        System.out.println(originalinfo);
        Thread.sleep(1000);
        boolean isSwipe = true;
        String currentinfo;
        // 滑动
        while (isSwipe) {
            swipeToUp(1000);
            List infolists2 = driver.findElementsById("resourceId");
            currentinfo= infolists2.get(infolists2.size() - 1).getAttribute("text");
            if (!currentinfo.equals(originalinfo))
                originalinfo= currentinfo;
            else {
                isSwipe = false;
                System.out.println(currentinfo);
                System.out.println("This is the buttom");
            }
        }
还有一个更通用的解决方式是用appium自带的getPageSource方法来判断页面是否滑动到了底部或者是否滑动成功。非常好用,可以封装成通用的方法用于各类native app。
对于webview的话也可以加一个if分支做个context切换然后用js实现也非常简单。
下面给两个代码片段用于解决appium测试swipe滑动是否成功和判断是否滑动到页面底部
1、判断是否滑动成功:
 //获取当前手机的分辨率
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
 boolean Swiped;
String   beforeswipe=androidDriver.getPageSource(); androidDriver.swipe(width / 2, height / 4, width / 2, height * 3/ 4, 1000);
 String afterswipe=androidDriver.getPageSource();
Swiped=beforeswipe.equals(afterswipe)?true:false;
  iTestAssert.assertFalse(Swiped,String.format(resourceBundle.getString("swipe_to_fail")));
 androidUtils.takesScreenshot(String.format(resourceBundle.getString("after_swipe"), direction));
2、判断是否滑动到底部:
//获取当前手机的分辨率
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
String str1;String str2;
//  do while 循环
do{   
//滑动前获取pagesource
 str1=driver.getPageSource();  
  driver.swipe(width / 2, height * 3 / 4, width / 2, height / 4, 1000);    
Thread.sleep(2000);  
//滑动后获取pagesource
  str2=driver.getPageSource(); }while (!str1.equals(str2));

 

 

=

=

=

 

分享到:
评论

相关推荐

    react-native-appium-test:带Appium测试的简单React Native应用程序

    在编写测试脚本时,可以使用Appium提供的API来操作应用元素,如查找屏幕上的按钮、输入框等,然后模拟用户行为。测试框架如Jest可以配合Appium编写断言,验证应用行为是否符合预期。例如,测试登录功能时,可以模拟...

    appium的api

    例如,你可以先使用`find_element_by_accessibility_id`找到一个元素,然后通过`tap`方法点击它,接着切换上下文到Webview,再使用`find_element_by_css_selector`在H5页面上查找并操作元素。最后,可能还需要使用`...

    Packt.Mobile.Test.Automation.with.Appium.pdf

    - **Appium Inspector**:这是一个强大的工具,可以帮助测试人员轻松地找到页面元素的定位器,从而更高效地编写测试脚本。 #### 六、同步测试 - **章节6:如何同步测试** - **Appium Driver**:解释Appium Driver...

    appium代码.docx

    21. 坐标操作:Appium允许精确的坐标定位,例如获取屏幕宽度和高度,元素的坐标和大小等,用于执行精确的点击、滑动等手势操作。 以上就是Appium基础代码中涉及的一些核心功能及其用途,它们共同构建了Appium强大的...

    appium-rn-app

    1. 测试脚本:包含使用Python编写的Appium测试脚本,这些脚本将定义测试用例,如启动应用、导航到特定页面、执行用户操作等。 2. 配置文件:可能包括`.appiumrc`或类似配置文件,用于设置Appium服务器的地址、端口、...

    nativescript-dev-appium:一个软件包,可帮助编写和执行NativeScript应用程序中的e2e Appium测试

    nativescript-dev-appium 一个用于编写和执行e2e 测试的软件包。 产品特点 跨平台 查找策略: findElementByText , findElementByClassName , findElementByAccessibilityId , findElementByXPath 操作:点击,...

    AppiumDemos:此存储库用于 appium 的示例代码和演示

    混合本机应用程序则指的是那些结合了原生和Web技术的应用,如React Native或Cordova开发的应用,这类应用需要特别的处理来确保所有功能都能被正确地测试到。 这个项目以Java作为主要编程语言,意味着所有的测试脚本...

    移动端Ui自动化上的正经奇技淫巧Havefun

    通过创建代表页面或屏幕的类,我们可以将交互逻辑和定位器集中管理。 3. **Mock服务**:在自动化测试中,为了避免因依赖外部API或网络状况导致的不稳定,可以使用Mock服务模拟服务器响应。这使得测试更加可控,提高...

    Android模拟点击

    3. **JNI/NDK编程**:对于更底层的控制,开发者还可以通过Java Native Interface (JNI) 或者 Native Development Kit (NDK) 来编写C/C++代码,直接与硬件交互,模拟触摸屏的电容信号,但这通常需要对硬件有更深入的...

    在Android上运行Javascript。截图,触摸,..._JavaScript_HTML_下载.zip

    在实际应用中,开发者可能会结合 Cordova 或 React Native 等框架来创建混合应用,这些框架允许开发者使用JavaScript编写应用的主要逻辑,并在Android平台上构建原生应用。此外,还有像Appium这样的开源自动化测试...

    (安卓平台上的JavaScript自动化工具).zip

    例如,React Native允许开发者使用JavaScript来构建原生安卓应用,利用JavaScript的灵活性和丰富的库资源,同时享受到安卓平台的性能和用户体验。另一框架Cordova则让开发者使用HTML、CSS和JavaScript创建跨平台的...

    PyPI 官网下载 | robotframework-ioslibrary-0.1.23.tar.gz

    它提供了丰富的关键字,可以用来操作UI元素,如点击按钮、滑动屏幕、输入文本等,还能进行网络请求的监控,甚至包括设备状态的检查,如电池电量、网络连接等。此外,它还支持使用Appium后端进行更深入的自动化测试,...

    旅行:移动前端开发经验指南

    这通常涉及到使用像React Native、Flutter或Ionic这样的框架,它们允许开发者用JavaScript、Dart或TypeScript等单一语言编写代码,然后编译成原生应用。这些框架提供了跨平台兼容性,降低了维护多套代码的成本。 2....

Global site tag (gtag.js) - Google Analytics