appium入门计算器+java+Maven+eclipse

appium入门计算器

Java代码

import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

public class App 
{
    public static void main(String[] args) throws MalformedURLException, InterruptedException {

        DesiredCapabilities capabilities = new DesiredCapabilities();
        //手机类型或模拟器类型
        capabilities.setCapability("deviceName", "127.0.0.1:62001");
        //自动化测试引擎
        capabilities.setCapability("automationName", "Appium");
        //手机操作系统iOS, Android, or FirefoxOS
        capabilities.setCapability("platformName", "Android");
        //手机操作系统版本号
        capabilities.setCapability("platformVersion", "5.0");
        //app包名
        capabilities.setCapability("appPackage", "com.youdao.calculator");
        //app中启动的 Activity名称
        capabilities.setCapability("appActivity", "com.youdao.calculator.activities.MainActivity");
        
        capabilities.setCapability("appWaitActivity","com.youdao.calculator.activities.MainActivity");
        //每次启动时覆盖session,否则第二次后运行会报错不能新建session
        capabilities.setCapability("sessionOverride", true);
        //appium提供的一种可以穿中文的方式
        capabilities.setCapability("unicodeKeyboard", "True");
        //程序结束时重置原来的输入法
        capabilities.setCapability("resetKetboard", "True");
        //不初始化APP信息
       // capabilities.setCapability("noReset", "True");

        AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

        List<WebElement> elementName = driver.findElements(By.id("com.youdao.calculator:id/iv_icon"));
        
        elementName.get(11).click();
        elementName.get(14).click();
        elementName.get(18).click();
        
        Thread.sleep(1000);

        //String result = driver.findElement(By.id("com.android.calculator2:id/formula")).getText();
        //System.out.println(result);

        driver.quit();
    }
}
//TouchAction action = new TouchAction(driver);
        //action.press(PointOption.point(589,406)).perform();

maven依赖的pom.xml:

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
	    <!-- https://mvnrepository.com/artifact/io.appium/java-client -->
	<dependency>
	    <groupId>io.appium</groupId>
	    <artifactId>java-client</artifactId>
	    <version>7.0.0</version>
	</dependency>
	    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
	<dependency>
	    <groupId>org.seleniumhq.selenium</groupId>
	    <artifactId>selenium-java</artifactId>
	    <version>3.141.59</version>
	</dependency>
	    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server -->
	<dependency>
	    <groupId>org.seleniumhq.selenium</groupId>
	    <artifactId>selenium-server</artifactId>
	    <version>3.141.59</version>
	</dependency>
	    
  </dependencies>

===========================

前面我已经搭建好了appium所需要的环境,本文我以系统自带的计算器app为测试对象,进行学习。

使用夜神模拟器首先要:(使用这个首先要打开夜神模拟器)

nox_adb connect 127.0.0.1:62001

连接定位界面:

uiautomatorviewer.bat

获取包名和Activity

adb shell dumpsys window w |findstr / |findstr name=

一、将测试机与PC连接

(本人使用的是真机)通过Usb接口将真机与PC端连接起来,在安装appium搭建环境中我们已经安装了SDK,所以打开CMD命令窗口,用adb devices命令来查看是否可以检测到手机设备,如果如下图显示出设备,则证明我们可以对手机进行测试操作。(若连接不到,则需要下载各自手机的手机助手,比如华为手机助手,下载之后再进行 adb devices就可以了)

img

记下设备名,测试代码要使用。

二、打开指定测试App的指定Activity

通过上一步操作,我已经看到我的设备是可以操作的了,那究竟应该如何让appium去自动找到指定的APP和指定的Activity呢?想要打开指定的App,需要知道App的包名,同样想要打开指定Activity也需要知道其名,如何获取?
1、问公司的开发人员,一定可靠。
2、通过命令获取:adb shell dumpsys window w |findstr \/ |findstr name=(这条命令的作用是,获取当前app和当前Activity的名字,我现在手机已经打开了计算器应用)如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wn4pOgZq-1588153621163)(http://upload-images.jianshu.io/upload_images/1803308-27bbad201b5db348.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

三、打开uiautomatorviewer获取元素

接下来需要用uiautomatorviewer对测试app的元素(button、text Field)进行抓取,比如通过id、class和text等来确定具体的元素。 uiautomatorviewer是在android-sdk的一个工具,具体目录\android-sdk-windows\tools\uiautomatorviewer.bat

操作:

1、双击uiautomatorviewer.bat,打开UI Automator viewer 窗口,如图所示:

img

uiautomatorviewer.png

2、在手机与PC端连接的情况下,点击 “Device screenshot”, 连接手机应用的窗口将显示出来

3、测试“1+2=3”的用例,在uiautomatorviewer界面,点击“1”,选中该按钮,查看右边的panel来找到“text”或“resource-id” 或“class”的值,如图:

img

driver.findElements(By.id(“com.youdao.calculator:id/iv_icon”)).get(18);

这个来定位,其他的同理。

五、测试源代码

代码实现1+2= 3的自动化测试

import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

public class App 
{
    public static void main(String[] args) throws MalformedURLException, InterruptedException {

        DesiredCapabilities capabilities = new DesiredCapabilities();
        //手机类型或模拟器类型
        capabilities.setCapability("deviceName", "127.0.0.1:62001");
        //自动化测试引擎
        capabilities.setCapability("automationName", "Appium");
        //手机操作系统iOS, Android, or FirefoxOS
        capabilities.setCapability("platformName", "Android");
        //手机操作系统版本号
        capabilities.setCapability("platformVersion", "5.0");
        //app包名
        capabilities.setCapability("appPackage", "com.youdao.calculator");
        //app中启动的 Activity名称
        capabilities.setCapability("appActivity", "com.youdao.calculator.activities.MainActivity");
        
        capabilities.setCapability("appWaitActivity","com.youdao.calculator.activities.MainActivity");
        //每次启动时覆盖session,否则第二次后运行会报错不能新建session
        capabilities.setCapability("sessionOverride", true);
        //appium提供的一种可以穿中文的方式
        capabilities.setCapability("unicodeKeyboard", "True");
        //程序结束时重置原来的输入法
        capabilities.setCapability("resetKetboard", "True");
        //不初始化APP信息
       // capabilities.setCapability("noReset", "True");

        AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

        List<WebElement> elementName = driver.findElements(By.id("com.youdao.calculator:id/iv_icon"));
        
        elementName.get(11).click();
        elementName.get(14).click();
        elementName.get(18).click();
        
        Thread.sleep(1000);

        //String result = driver.findElement(By.id("com.android.calculator2:id/formula")).getText();
        //System.out.println(result);

        driver.quit();
    }
}
//TouchAction action = new TouchAction(driver);
        //action.press(PointOption.point(589,406)).perform();
六、启动Appium

手机设备连接到PC端,手机屏幕打开着。接着启动Appium,启动成功如下图:

img

Paste_Image.png

七、运行测试类

​ 点击运行

八、大功告成,注意查看运行日志和appium控制台日志

img

Paste_Image.png

img

Paste_Image.png

可以看到,手机端的计算器app,也会自动出现1+2 = 3的自动化输入测试

下面是一些相关操作

一、元素操作

找到元素后可以对元素进行的操作,例如上面讲的进一步定位元素

1.click()

//点击操作

也可以用tab实现点击操作

driver.find_element_by_id(“com.wuba.zhuanzhuan:id/ae8”).click()

2.clear()

//清空输入框内容

driver.find_element_by_id(“com.wuba.zhuanzhuan:id/ij”).clear()

3.send(xx)

//输入框内输入内容

driver.find_element_by_id(“com.wuba.zhuanzhuan:id/ij”).send_keys(“test content”)

4.text

//获得元素的text内容

print(driver.find_element_by_xpath(" //android.widget.LinearLayout[1]//xxx").text)

二、触摸操作

1.driver.tap([坐标],持续点击时间)

除了定位到元素的点击外,也可以通过tab实现坐标的点击

driver.tap(driver.tap([(216,1776)],2))

2.TouchAction(driver)

TouchAction对象包含(tab)、press(短按)、move_to(滑动到某个坐标)等方法

通过TouchAction对象,添加tap、move_to等操作,然后perform()执行,可以实现解锁屏幕等功能

规范中的可用事件有:

* 短按 (press)
* 释放 (release)
* 移动到 (moveTo)
* 点击 (tap)
* 等待 (wait)
* 长按 (longPress)
* 取消 (cancel)

* 执行 (perform)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dsh3uW7V-1588153621189)(https://images2015.cnblogs.com/blog/626983/201611/626983-20161126000055768-288916919.png)]

例如:一个多次滑屏的例子:

action=TouchAction(driver)

action.press(x=220,y=700).move_to(x=840, y=700).move_to(x=220, y=1530).move_to(x=840, y=1530).release().perform()

可以通过wait()等待操作

**3.MultiAction()//**多点触控

通过MultiAction().add()添加多个TouchAction操作,最后调用perform()一起执行这些操作

action0 = TouchAction().tap(el)

action1 = TouchAction().tap(el)

MultiAction().add(action0).add(action1).perform()

4.driver.swipe(x1, y1, x2, y2,duration)

//从坐标(x1,x2)滑动到坐标(x2,y2),duration非必填项,滑动时间

(滑动的坐标不能超过屏幕的宽高)

可以通过【driver.get_window_size()】命令获得窗口高和宽,结果为{‘width’: 1080, ‘height’: 1776}

一个鼠标向上下左右活动的例子如下:

#获得屏幕大小宽和高
def getSize(driver):
x = driver.get_window_size()[‘width’]
y = driver.get_window_size()[‘height’]
return (x, y)

#屏幕向上滑动
def swipeUp(driver,t=1000):
l = getSize(driver)
x1 = int(l[0] * 0.5) #x坐标
y1 = int(l[1] * 0.75) #起始y坐标
y2 = int(l[1] * 0.25) #终点y坐标
driver.swipe(x1, y1, x1, y2,t)

#屏幕向下滑动
def swipeDown(driver,t=1000):
l = getSize(driver)
x1 = int(l[0] * 0.5) #x坐标
y1 = int(l[1] * 0.25) #起始y坐标
y2 = int(l[1] * 0.75) #终点y坐标
driver.swipe(x1, y1, x1, y2,t)
#屏幕向左滑动
def swipLeft(driver,t):
l=getSize(driver)
x1=int(l[0]*0.75)
y1=int(l[1]*0.5)
x2=int(l[0]*0.05)
driver.swipe(x1,y1,x2,y1,t)
#屏幕向右滑动
def swipRight(driver,t=1000):
l=getSize(driver)
x1=int(l[0]*0.05)
y1=int(l[1]*0.5)
x2=int(l[0]*0.75)

driver.swipe(x1,y1,x2,y1,t)

#调用向下滑动的方法

swipeDown(driver)

三、系统按键事件

press_keycode(AndroidKeyCode)//发送按键事件

例如:点击home键,home键的KeyCode是3

driver.press_keycode(3)

键名 描述 键值
KEYCODE_CALL 拨号键 5
KEYCODE_ENDCALL 挂机键 6
KEYCODE_HOME 按键Home 3
KEYCODE_MENU 菜单键 82
KEYCODE_BACK 返回键 4
KEYCODE_SEARCH 搜索键 84
KEYCODE_CAMERA 拍照键 27
KEYCODE_FOCUS 拍照对焦键 80
KEYCODE_POWER 电源键 26
KEYCODE_NOTIFICATION 通知键 83
KEYCODE_MUTE 话筒静音键 91
KEYCODE_VOLUME_MUTE 扬声器静音键 164
KEYCODE_VOLUME_UP 音量增加键 24
KEYCODE_VOLUME_DOWN 音量减小键 25

更多KeyCode可以查看下面的博客:

http://blog.csdn.net/crisschan/article/details/50419963

四、driver的一些比较重要操作

1.reset()

//重置app

这时候driver会重置,相当于卸载重装应用。所以本地缓存会失效

driver.reset()

2.start_activity(包名,activity名)

//启动app的某一个activity

例如:driver.start_activity(“com.wuba.zhuanzhuan”,"./presentation.view.activity.LaunchActivity")

启动一个activity,这个activity必须是AndroidManifest.xml中有intent-filter的activity

这种启动activity和driver的reset()不同的是

3.contexts

//获得所有contexts

driver.contexts

结果如下:

[‘NATIVE_APP’, ‘WEBVIEW_com.android.browser’]

NATIVE_APP:native的context

WEBVIEW_com.android.browser:webview的context,存放html的容器

4.current_context

//查看当前的context

driver.current_context

5.switch_to.context(context名)

//切换context

driver.switch_to.context(“WEBVIEW_com.wuba.zhuanzhuan”)

NATIVE时不能定位WEBVIEW的内容,在WEBVIEW的context时不能定位NATIVE的内容。

所以需要切换到对应的context中去进行操作

6.setNetworkConnection(bitmask掩码)

//设置网络类型

例如:设置网络类型为只开wifi

driver.set_network_connection(2)

网络的bitmask掩码如下:

| 值 (别名) | 数据连接 | Wifi 连接 | 飞行模式 |

| ------------------ | ---- | ---- | ------------- |

| 0 (什么都没有) | 0 | 0 | 0 |

| 1 (飞行模式) | 0 | 0 | 1 |

| 2 (只有Wifi) | 0 | 1 | 0 |

| 4 (只有数据连接) | 1 | 0 | 0 |

| 6 (开启所有网络) | 1 | 1 | 0 |

7.scroll(起始元素,结束元素)

driver.scroll(origin_el,destination_el)

8.获得当前页面的所有元素

driver.page_source

这可以用来判断元素是否存在,例如**(**assert “发布成功” in driver.page_source)

五.补充一些driver启动时可能用到的项

其实这些在上一篇启动里都有介绍,但是有些可能大家没注意到的点再列一下。这些点也是我在测试中实际遇到的点

**autoLaunch :**Appium是否要自动启动或安装app,默认true

desired_caps[‘autoLaunch’] = ‘false’

有的时候我不想让appium每次都启动app,想自己去启动activity,那这个项这时就可以起作用了

**noReset:**在会话前是否重置app状态。默认是false

desired_caps[‘noReset’] = ‘true’

**newCommandTimeout:**设置未接收到新命令的超时时间,默认60s

如果60s内没有接收到新命令,appium会自动断开连接,如果我需要很长时间做driver之外的操作,可能延长接收新命令的超时时间

desired_caps[“newCommandTimeout”]=1800

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值