最近在自学Appium,写了个脚本,记录一下。
附上代码
Testcase0_微博登录
public void test0_login() throws Exception {
//driver.findElementByXPath("//*[@text='退出']").click();
//微博提示获取权限
if(driver.findElementById("com.sina.weibo:id/dialogTitle").isDisplayed())
driver.findElementByXPath("//android.widget.TextView[@text=\" 开启 \"]").click();
//系统弹窗提示获取权限
while(driver.currentActivity().matches("com.android.packageinstaller.permission.ui.GrantPermissionsActivity"))
{
driver.findElementById("com.android.packageinstaller:id/permission_allow_button").click();
}
//由于每次到这里都会闪退,只能再用startActivity打开主Activity
driver.startActivity("com.sina.weibo", ".VisitorMainTabActivity");
//wait 3s
Thread.sleep(3000);
//点击登录button
driver.findElementById("com.sina.weibo:id/titleBack").click();
//选择使用用户名和密码登录
driver.findElementById("com.sina.weibo:id/tv_for_psw_login").click();;
//输入用户名和密码和登录
driver.findElementById("com.sina.weibo:id/et_pws_username").sendKeys("xxx@yeah.net");
driver.findElementById("com.sina.weibo:id/et_pwd").sendKeys("********");
driver.findElementById("com.sina.weibo:id/bn_pws_Login").click();
//由于登录需要考虑网络速度,所以wait的时间设置大一点保证case不会错误
Thread.sleep(10000);
//登录后会进入web浏览器的点击验证码
driver.findElementByXPath("//*[@content-desc='点击按钮进行验证']").click();
Thread.sleep(15000);
//断言判断当前的Activity
assertEquals(".MainTabActivity", driver.currentActivity());
Thread.sleep(3000);
//截图保存
takescreenshot(driver,"login.png");
/*if(driver.findElementByXPath("//android.widget.TextView[@text=\"V9.6.3版本更新啦!\"]").isDisplayed())
{
driver.findElementByXPath("//android.widget.TextView[@text=\"以后再说\"]").click();
}*/
}
Testcase_1点赞微博和评论
这个case的使用封装成了likeandcomment()的方法,后面方便使用
@Test
public void test1_commet() throws Exception
{
//wait 5s
Thread.sleep(5000);
//执行点击微博后->点赞->评论
likeandcomment();
}
likeandcomment()
public void likeandcomment() throws Exception {
//点击微博文字TextView
driver.findElementById("com.sina.weibo:id/contentTextView").click();
//点击点赞button
driver.findElementById("com.sina.weibo:id/detail_liked_icon").click();
//点击评论
driver.findElementById("com.sina.weibo:id/comment").click();
//输入评论
driver.findElementById("com.sina.weibo:id/edit_view").sendKeys("Test by chin");
Thread.sleep(1000);
//点击发送button
driver.findElementById("com.sina.weibo:id/tv_send").click();
Thread.sleep(3000);
//截图保存
takescreenshot(driver,"likeandcomment.png");
Thread.sleep(2000);
//退出界面
driver.findElementById("com.sina.weibo:id/detail_activity_header_left_button_text").click();
Thread.sleep(2000);
}
封装appium截图功能
appium的截图是继承webdriver selenium库的TakesScreenShot接口下的getScreenShotAs()
public static void takescreenshot(TakesScreenshot drivername, String filename)
{
//新建userPath获得当前路径
String userPath=System.getProperty("user.dir");
//调用 getScreenshotAs
File screenshotFile=drivername.getScreenshotAs(OutputType.FILE);
try {
System.out.println("save Screenshot path is:" + userPath + "/" + filename);
FileUtils.copyFile(screenshotFile, new File(userPath + "\\" + filename));
} catch (IOException e) {
System.out.println("Can't save screenshot");
e.printStackTrace();
} finally {
System.out.println("Screenshot finished, it's in " + userPath+ " folder");
}
}
需要注意的地方是每一个Case执行前都会调用setUp()方法,以至于Testcase0执行结束后,Testcase1就会重置应用app的数据,所以这个case就肯定会执行错误,为了避免这个问题,在DesiredCapabilities里设置一个参数
cap.setCapability("noReset", true);//运行case时不清除app的应用数据
Testcase运行成功
输出的截图文件
完整的代码:
Testcase.java:
public class Testcase {
AndroidDriver driver;
AndroidElement element;
@Before
public void setUp() throws Exception {
/*在setUp()方法里声明setCapabilities();
* 为了方便后面的使用,把setCapabilities封装起来一个类,直接调用setup_Capabilities.java
*/
setup_Capabilities setup=new setup_Capabilities();
driver=setup.setCapabilities();
}
@After
public void tearDown() throws Exception {
driver.quit();
}
@Test
public void test0_login() throws Exception {
//driver.findElementByXPath("//*[@text='退出']").click();
//微博提示获取权限
if(driver.findElementById("com.sina.weibo:id/dialogTitle").isDisplayed())
driver.findElementByXPath("//android.widget.TextView[@text=\" 开启 \"]").click();
//系统弹窗提示获取权限
while(driver.currentActivity().matches("com.android.packageinstaller.permission.ui.GrantPermissionsActivity"))
{ driver.findElementById("com.android.packageinstaller:id/permission_allow_button").click();
}
//由于每次到这里都会闪退,只能再用startActivity打开主Activity
driver.startActivity("com.sina.weibo", ".VisitorMainTabActivity");
//wait 3s
Thread.sleep(3000);
//点击登录button
driver.findElementById("com.sina.weibo:id/titleBack").click();
//选择使用用户名和密码登录
driver.findElementById("com.sina.weibo:id/tv_for_psw_login").click();;
//输入用户名和密码和登录
driver.findElementById("com.sina.weibo:id/et_pws_username").sendKeys("xxx@yeah.net");
driver.findElementById("com.sina.weibo:id/et_pwd").sendKeys("********");
driver.findElementById("com.sina.weibo:id/bn_pws_Login").click();
//由于登录需要考虑网络速度,所以wait的时间设置大一点保证case不会错误
Thread.sleep(10000);
//登录后会进入web浏览器的点击验证码
driver.findElementByXPath("//*[@content-desc='点击按钮进行验证']").click();
Thread.sleep(15000);
//断言判断当前的Activity
assertEquals(".MainTabActivity", driver.currentActivity());
Thread.sleep(3000);
//截图保存
takescreenshot(driver,"login.png");
/*if(driver.findElementByXPath("//android.widget.TextView[@text=\"V9.6.3版本更新啦!\"]").isDisplayed())
{
driver.findElementByXPath("//android.widget.TextView[@text=\"以后再说\"]").click();
}*/
}
@Test
public void test1_commet() throws Exception
{
//wait 5s
Thread.sleep(5000);
//执行点击微博后->点赞->评论
likeandcomment();
}
//将微博点赞评论封装成一个方法,方便后续调用
public void likeandcomment() throws Exception {
//点击微博文字TextView
driver.findElementById("com.sina.weibo:id/contentTextView").click();
//点击点赞button
driver.findElementById("com.sina.weibo:id/detail_liked_icon").click();
//点击评论
driver.findElementById("com.sina.weibo:id/comment").click();
//输入评论
driver.findElementById("com.sina.weibo:id/edit_view").sendKeys("Test by chin");
Thread.sleep(1000);
//点击发送button
driver.findElementById("com.sina.weibo:id/tv_send").click();
Thread.sleep(3000);
//截图保存
takescreenshot(driver,"likeandcomment.png");
Thread.sleep(2000);
//退出界面
driver.findElementById("com.sina.weibo:id/detail_activity_header_left_button_text").click();
Thread.sleep(2000);
}
/*封装appium截图功能
* appium的截图是继承webdriver selenium库的TakesScreenShot接口下的getScreenShotAs()
*/
public static void takescreenshot(TakesScreenshot drivername, String filename)
{
//新建userPath获得当前路径
String userPath=System.getProperty("user.dir");
//调用 getScreenshotAs
File screenshotFile=drivername.getScreenshotAs(OutputType.FILE);
try {
System.out.println("save Screenshot path is:" + userPath + "/" + filename);
FileUtils.copyFile(screenshotFile, new File(userPath + "\\" + filename));
} catch (IOException e) {
System.out.println("Can't save screenshot");
e.printStackTrace();
} finally {
System.out.println("Screenshot finished, it's in " + userPath+ " folder");
}
}
}
setup_Capabilities.java:
public class setup_Capabilities {
public AndroidDriver setCapabilities() throws Exception
{
AndroidDriver driver;
DesiredCapabilities cap=new DesiredCapabilities();
cap.setCapability("automationName", "Appium");
cap.setCapability("deviceName", "Tabs2");
cap.setCapability("platformName", "Android");
cap.setCapability("platformVersion", "6.0");
cap.setCapability("udid", "f3c01270");
cap.setCapability("appPackage", "com.sina.weibo");//app package name
cap.setCapability("appActivity", ".SplashActivity");//app Activity
cap.setCapability("unicodeKeyboard", "True"); //支持中文输入
cap.setCapability("resetKeyboard", "True"); //支持中文输入,必须两条都配置
cap.setCapability("noSign", "True"); //不重新签名apk
cap.setCapability("newCommandTimeout", "30"); //没有新命令,appium30秒退出
cap.setCapability("noReset", true);//运行case时不清除app的应用数据
driver = new AndroidDriver(new URL("http://0.0.0.0:4723/wd/hub"),cap);
return driver;
}
}