=
小结:
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));
=
=
=
相关推荐
在编写测试脚本时,可以使用Appium提供的API来操作应用元素,如查找屏幕上的按钮、输入框等,然后模拟用户行为。测试框架如Jest可以配合Appium编写断言,验证应用行为是否符合预期。例如,测试登录功能时,可以模拟...
例如,你可以先使用`find_element_by_accessibility_id`找到一个元素,然后通过`tap`方法点击它,接着切换上下文到Webview,再使用`find_element_by_css_selector`在H5页面上查找并操作元素。最后,可能还需要使用`...
- **Appium Inspector**:这是一个强大的工具,可以帮助测试人员轻松地找到页面元素的定位器,从而更高效地编写测试脚本。 #### 六、同步测试 - **章节6:如何同步测试** - **Appium Driver**:解释Appium Driver...
21. 坐标操作:Appium允许精确的坐标定位,例如获取屏幕宽度和高度,元素的坐标和大小等,用于执行精确的点击、滑动等手势操作。 以上就是Appium基础代码中涉及的一些核心功能及其用途,它们共同构建了Appium强大的...
1. 测试脚本:包含使用Python编写的Appium测试脚本,这些脚本将定义测试用例,如启动应用、导航到特定页面、执行用户操作等。 2. 配置文件:可能包括`.appiumrc`或类似配置文件,用于设置Appium服务器的地址、端口、...
nativescript-dev-appium 一个用于编写和执行e2e 测试的软件包。 产品特点 跨平台 查找策略: findElementByText , findElementByClassName , findElementByAccessibilityId , findElementByXPath 操作:点击,...
混合本机应用程序则指的是那些结合了原生和Web技术的应用,如React Native或Cordova开发的应用,这类应用需要特别的处理来确保所有功能都能被正确地测试到。 这个项目以Java作为主要编程语言,意味着所有的测试脚本...
通过创建代表页面或屏幕的类,我们可以将交互逻辑和定位器集中管理。 3. **Mock服务**:在自动化测试中,为了避免因依赖外部API或网络状况导致的不稳定,可以使用Mock服务模拟服务器响应。这使得测试更加可控,提高...
3. **JNI/NDK编程**:对于更底层的控制,开发者还可以通过Java Native Interface (JNI) 或者 Native Development Kit (NDK) 来编写C/C++代码,直接与硬件交互,模拟触摸屏的电容信号,但这通常需要对硬件有更深入的...
在实际应用中,开发者可能会结合 Cordova 或 React Native 等框架来创建混合应用,这些框架允许开发者使用JavaScript编写应用的主要逻辑,并在Android平台上构建原生应用。此外,还有像Appium这样的开源自动化测试...
例如,React Native允许开发者使用JavaScript来构建原生安卓应用,利用JavaScript的灵活性和丰富的库资源,同时享受到安卓平台的性能和用户体验。另一框架Cordova则让开发者使用HTML、CSS和JavaScript创建跨平台的...
它提供了丰富的关键字,可以用来操作UI元素,如点击按钮、滑动屏幕、输入文本等,还能进行网络请求的监控,甚至包括设备状态的检查,如电池电量、网络连接等。此外,它还支持使用Appium后端进行更深入的自动化测试,...
这通常涉及到使用像React Native、Flutter或Ionic这样的框架,它们允许开发者用JavaScript、Dart或TypeScript等单一语言编写代码,然后编译成原生应用。这些框架提供了跨平台兼容性,降低了维护多套代码的成本。 2....