接前面例子
一:模拟用户操作
找到页面元素来模拟用户的操作:比如抖音的这些元素,我弄了个简单的场景:点击帮助,点击反馈,输入内容,发送
可以拿这个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;
查了一下:TestNG和Maven相关的类文件之间不兼容
解决方法:卸载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???还是脚本写的有问题???
后续学习:https://blog.csdn.net/weixin_42717928/article/details/106866226