APP自动化测试(三)-appium

接前面例子

一:模拟用户操作

找到页面元素来模拟用户的操作:比如抖音的这些元素,我弄了个简单的场景:点击帮助,点击反馈,输入内容,发送

可以拿这个resource-id,如果没有也可以用其他的

比如:

ID定位(取resource-id、id、name)

class、text定位(取class、text)

xpath定位

坐标点定位

于是我使用name

测试的时候报了bug:Locator Strategy 'name' is not supported for this session就是元素找不到

原因是1.7版本不支持了,那就修改源码

C:\Users\AUSU\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-android-driver\build\lib

找到driver.js,查找 this.locatorStrategies 

一些定位方式可以参考:https://www.cnblogs.com/davieyang/p/10063549.html

package com.javaAuto;

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

import io.appium.java_client.android.AndroidDriver;

public class JavaAutoTest {
//	全局变量
	public static AndroidDriver<WebElement> androidDriver;
//	main
	public static void main(String []agrs) throws Exception{
//		创建配置对象
		DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
//		添加配置(设备、设备类型、包名、活动启动入口)
		desiredCapabilities.setCapability("deviceName", "127.0.0.1:62001");
		desiredCapabilities.setCapability("platformName", "Android");
		desiredCapabilities.setCapability("appPackage", "com.ss.android.ugc.aweme");
		desiredCapabilities.setCapability("appActivity", ".account.white.login.DYLoginActivity");
		desiredCapabilities.setCapability("automationName", "UiAutomator1");
		
//		创建驱动(appium通信地址,配置对象)
		androidDriver = new AndroidDriver<WebElement>(
				new URL("http://127.0.0.1:4723/wd/hub"),desiredCapabilities);
		
		login();
	
	}
	
	
	public static void login() throws Exception{
//		因为画面出现较慢,代码执行较快,所以会出现元素找不到的问题,可以先给个时间让它加载完
		Thread.sleep(10000);
//		找到帮助然后点击
		androidDriver.findElementById("com.ss.android.ugc.aweme:id/bn0").click();
		Thread.sleep(10000);
//		找到我的反馈然后点击
		androidDriver.findElement(By.name("我的反馈")).click();
		Thread.sleep(10000);
//		点击输入框
		androidDriver.findElementById("com.ss.android.ugc.aweme:id/hbj").click();
//		点击输入"123456789"
		androidDriver.findElementById("com.ss.android.ugc.aweme:id/a2q").sendKeys("123456789");
//		点击发送
		androidDriver.findElementById("com.ss.android.ugc.aweme:id/ekd").click();
		
		
	}

}

运行后,在最后一步提交出现toast提示“加载失败,请稍后重试”,这是bug???好吧我也不确认,留着先

还有就是我输入不了中文,好像用UiAutomator2可以,我换成2的话就报错,估计是安卓版本问题

在这里加入这个依赖

在eclipse还要安装TestNG插件(有些版本集成这些插件不用安装,我的版本低了一点)

TestNG是一个开源自动化测试框架,我用了离线的方式下载

TestNG官网地址:http://testng.org/,点击download

选了一个靠中一点的,应该稳定一点吧

将下载的zip文件,无需解压,直接放到eclipse的dropins文件夹下

在eclipse的help-安装软件里面,选中那个压缩包,填下名称testNG

后面的都确定就行了,装了很久,等到花儿都谢了,安装好了重启,在新建-其他,看到这东西就OK了

回到正题,在类那里右键-TestNG-Convert to TestNG

发现。。。没反应,试着换了个版本看看,先卸载掉

重新换了个包,发现这里是2了,应该可以了吧

好吧,还是安装失败了,心酸的故事

想了一会,是不是我eclipse版本(4.6)太低了,于是选中这种方式下载

然后又是漫长的等待

安装太久了,要睡觉然后取消了

早上起来再来安装一次,在帮助-安装软件,点击ADD,里面输入下面这些内容

Name填写testng
Location填写http://dl.bintray.com/testng-team/testng-eclipse-release/

隔了很久很久很久,弹出这些信息 

保持我的安装不变,并将正在安装的项修改为兼容
更新我的安装以与正在安装的项目兼容
显示原始错误并生成我自己的解决方案

直接就安装了,他奶奶的终于可以了

再次回到正题,在类那里右键-TestNG-Convert to TestNG

居然没有自动生成,圈住的部分只能手写

package com.javaAuto;

import java.net.URL;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import io.appium.java_client.android.AndroidDriver;

public class JavaAutoTest {
//	全局变量
	public static AndroidDriver<WebElement> androidDriver;
//	main

//	在测试前进行初始化
	@BeforeTest
	public void setUp() throws Exception{
//		创建配置对象
		DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
//		添加配置(设备、设备类型、包名、活动启动入口)
		desiredCapabilities.setCapability("deviceName", "127.0.0.1:62001");
		desiredCapabilities.setCapability("platformName", "Android");
		desiredCapabilities.setCapability("appPackage", "com.ss.android.ugc.aweme");
		desiredCapabilities.setCapability("appActivity", ".account.white.login.DYLoginActivity");
		desiredCapabilities.setCapability("automationName", "UiAutomator1");
		
//		创建驱动(appium通信地址,配置对象)
		androidDriver = new AndroidDriver<WebElement>(
				new URL("http://127.0.0.1:4723/wd/hub"),desiredCapabilities);
		
	}
	
//	测试用例
	@Test
	public void login() throws Exception{
//		因为画面出现较慢,代码执行较快,所以会出现元素找不到的问题,可以先给个时间让它加载完
		Thread.sleep(10000);
//		找到帮助然后点击
		androidDriver.findElementById("com.ss.android.ugc.aweme:id/bn0").click();
		Thread.sleep(10000);
//		找到我的反馈然后点击
		androidDriver.findElement(By.name("我的反馈")).click();
		Thread.sleep(10000);
//		点击输入框
		androidDriver.findElementById("com.ss.android.ugc.aweme:id/hbj").click();
//		点击输入"123456789"
		androidDriver.findElementById("com.ss.android.ugc.aweme:id/a2q").sendKeys("123456789");
//		点击发送
		androidDriver.findElementById("com.ss.android.ugc.aweme:id/ekd").click();
			
	}
	
//	销毁资源
	@AfterTest
	public void testDown(){
//		用例运行完毕后销毁驱动
		androidDriver.quit();
	}

}

因为没有main方法,通过这种方式运行

运行报错:org.testng.eclipse.maven.MavenTestNGLaunchConfigurationProvider.getClasspath(Lorg/eclipse/debug/core/ILaunchConfiguration;)Ljava/util/List;

查了一下:TestNGMaven相关的类文件之间不兼容

解决方法:卸载TestNG插件的可选M2E(Maven ...)部分

再次运行,成功

接下来是加断言

在提交后是进入聊天页面的,显示我提交的信息

adb shell dumpsys activity | find "mFocusedActivity"

在login方法里面加上

        Thread.sleep(10000);
//		断言
//		期望结果
		String qw = ".feedback.FeedbackActivity";
//		实际结果(这里能获得实际的活动名)
		String sj = androidDriver.currentActivity();
		org.testng.Assert.assertEquals(qw, sj);

跑完后是失败的。。难道真是个bug???还是脚本写的有问题???

猜你喜欢

转载自blog.csdn.net/weixin_42717928/article/details/106840013