Appium测试安卓Launcher以滑动窗体获得目标应用

所谓Launcher,指的是安卓的桌面管理程序,所有的应用图标都放在launcher上面。其实这是一个很简单的例子,只是为了验证几点想法而已。

1.实验目的

做这个试验的目的有二

  • 尝试下窗体滑动函数swipe的使用
  • 好奇究竟能不能正常的对安卓的Launcher进行指定package和activity进行测试

2.实验背景

过程是打算使用appium来启动launcher,然后滑动窗口去获取在第三个桌面的sdk自带应用”Notes“。如下图所示

3. 试验步骤

3.1 获得launcher的package和activity两个capabilities

可以通过HierarchyViewer直接查看获得

3.2 编码实现

package majcit.com.AppiumDemo;

import io.appium.java_client.android.AndroidDriver;

import java.net.URL;
import org.junit.Test;
import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.assertThat;

/**
 * Unit test for simple App.
 */
public class LauncherTest {
    /**
     * Create the test case
     *
     * @param testName name of the test case
     */
	private AndroidDriver driver;

    @Before
    public void setUp() throws Exception {
        // set up appium
        //File classpathRoot = new File(System.getProperty("user.dir"));
        //File appDir = new File(classpathRoot, "apps");
        //File app = new File(appDir, "NotePad.apk");
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName","Android");
        //capabilities.setCapability("platformVersion", "4.2");
        //capabilities.setCapability("platformName", "Android");
        //capabilities.setCapability("app", app.getAbsolutePath());
        capabilities.setCapability("appPackage", "com.miui.home");
        capabilities.setCapability("appActivity", "com.miui.home.launcher.Launcher");
        //capabilities.setCapability("appActivity", ".NotesList");
        //capabilities.setCapability("autoLaunch", "false");
        //capabilities.setCapability("noReset", true);
        driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    } 

    @After
    public void tearDown() throws Exception {
        driver.quit();
    }

    @Test
    public void launchNotePad() throws InterruptedException{

    	WebElement el = null;
    	WebElement screen = null;
    	Point point = null;
    	Dimension size = null;

    	boolean found = false;
    	int pageCount = 3; //Assume that there are totally 3 screens to be swiped.

    	int xStart = -1;
    	int yStart = -1;
    	int xEnd = -1;
    	int yEnd = -1;

    	//Get the start and end coordinates for swipe
    	Thread.sleep(3000);
    	screen = driver.findElementById("com.miui.home:id/cell_layout");
    	point = screen.getLocation();
    	size = screen.getSize();
    	xEnd = point.getX();
    	yEnd = point.getY() + size.getHeight()/2;
    	xStart = point.getX() + size.getWidth() - 5;
    	yStart = yEnd;

    	System.out.println("starX:" + xStart +"\nstartY:" + yStart + "\nendX:" + xEnd + "\nendY:" + yEnd);

    	//本来想通过判断屏幕上的几个小圆点来判断究竟有多少个屏幕的,但发觉xPath根本不起效,父目录感觉根本起不了定位作用,只有最后的//android.widget.ImageView起效,所以一下找出75个元素。
    	/*
    	List<WebElement> pageImages = driver.findElementsByXPath("//android.view.View/android.widget.LinearLayout/android.widget.ImageView");
    	assertThat(pageImages.size(),is(3));
    	for (WebElement e: pageImages) {
    		e.click();
    	}
    	*/

    	//Swipe all screens till get the expected control
    	int currentPage = 0;
    	while (found == false && currentPage < pageCount) {
    		found = true;

    		currentPage += 1;

    		try {
        		el = driver.findElementByName("Notes");
        	}catch (NoSuchElementException e) {
        		found = false;
        		System.out.println(e);
        	}

    		if (found == true)
    			break;

    		driver.swipe(xStart, yStart, xEnd, yEnd, 100);
        	Thread.sleep(1000);
    	}

    	assertThat(found,is(true));
    	assertThat(el,notNullValue());

        el.click();

    }

}

步骤说明大概如下:

  • 准备好必须的capabilities传送给appium服务器端,注意指定app,因为我们不需要重新安装Launcher
  • 找到代表整个屏幕的控件,然后通过获取它的location和size属性来计算出滑动开始和结束的坐标。注意开始的坐标如果是屏幕的边界,需要调整下像素(例子中是减去5个像素)以防出错。
  • 通过滑动遍历每个页面直到找到目标控件为止。
时间: 2024-11-05 01:56:06

Appium测试安卓Launcher以滑动窗体获得目标应用的相关文章

【转】Appium测试安卓Launcher以滑动窗体获得目标应用

原文地址:http://blog.csdn.net/zhubaitian/article/details/39755553 所谓Launcher,指的是安卓的桌面管理程序,所有的应用图标都放在launcher上面.其实这是一个很简单的例子,只是为了验证几点想法而已. 1.实验目的 做这个试验的目的有二 尝试下窗体滑动函数swipe的使用 好奇究竟能不能正常的对安卓的Launcher进行指定package和activity进行测试 2.实验背景 过程是打算使用appium来启动launcher,然

使用appium框架测试安卓app时,获取toast弹框文字时,前一步千万不要加time.sleep等等待时间。

使用appium框架测试安卓app时,如果需要获取toast弹框的文案内容,那么再点击弹框按钮之前,一定记得千万不要加time.sleep()等待时间,否则有延迟,一直获取不到: 获取弹框的代码: message=self.driver.find_element_by_xpath("//*[contains(@text,'成功添加到购物车')]")   原文地址:https://www.cnblogs.com/zhouchuanlun/p/12687890.html

appium 测试使用的API

appium 测试使用的API: 模拟操作类 driver.runAppInBackground(5); //将当前活跃的应用放在后台运行driver.hideKeyboard(); //隐藏键盘driver.lockDevice(); //锁屏driver.openNotifications(); //打开Android的下拉通知栏driver.isAppInstalled(“com.example.android.apis”) //判断应用是否安装driver.installApp(“pat

appium 测试微信公众号 切换webview

appium测试微信公众号的时候 切换webview报找不到contextdriver.context("WEBVIEW_com.tencent.mm:tools");io.appium.java_client.NoSuchContextException: No such context found. (WARNING: The server did not provide any stacktrace information)Command duration or timeout:

【剑指Offer学习】【面试题65:滑动窗体的最大值】

题目:给定一个数组和滑动窗体的大小,请找出全部滑动窗体里的最大值. 举例说明 比如,假设输入数组{2,3,4,2,6,2,5,1}及滑动窗体的大小.那么一共存在6个滑动窗体,它们的最大值分别为{4,4,6,6,6,5}. 解题思路 假设採用蛮力法,这个问题似乎不难解决:能够扫描每个滑动窗体的全部数字并找出当中的最大值.假设滑动窗体的大小为k,须要O(k)时间才干找出滑动窗体里的最大值.对于长度为n的输入数组,这个算法总的时间复杂度是O(nk). 实际上一个滑动窗体能够看成是一个队列.当窗体滑动时

解决android SDK不能更新,appium测试混合app无法返回webview问题

问题:1.connection to the server is unsuccessful(file:///www/asset/index.html)(原因:android系统问题,需要更新)2.appium测试混合app,没有返回webview(原因:主要由于android版本问题,需要原生系统android4.4)3.android SDK不能更新package 4.android SDK中extra文件更新失败问题 解决:一.更新sdk,步骤如下:1.修改hosts文件打开c:/windo

appium之安卓7.0环境搭建

appium 在安卓7.0的手机上运行上报错---------Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.settings without first uninstalling.] 解决方法: 进入Appium安装目录,找到目录下的adb.js(D:\Program Files (x86)\Appium\node_modules\appium\node_modules\appium-adb\lib

leetcode ---双指针+滑动窗体

一:Minimum Size Subarray Sum(最小长度子数组的和O(N)) 题目: Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead. For example, given the array [2,3,1,2,4,3

【亲测】Appium测试Android混合应用时,第二次切换到WebView失败

要解决的问题:Appium测试Android混合应用时,第二次切换到WebView时失败 原因分析:在用Appium测试Android混合应用时,当程序第一次切换到WebView时,可以正常进行自动化测试.可是当程序第二次切换到WebView时,Appium会自动找到到第一次打开的Html页面,那么这时Appium就无法定位我们第二次打开的Html页面中的元素. Appium第一次切换到Html页面时,会新生成一个Chromedriver:当第二次切换到Html时,会使用已经存在的Chromed