用例层好像没什么说的,根据自己app设计用例了,值得注意一点是driver对象必须时唯一的,因为很多地方都会用到driver对象,所以创建远程连接的时候要注意了
这里创建连接作为一个类,另外也创建一个基础测试类,其他所有用例类都继承这个基础类,方便操作和管理
上代码:.
driver类
package com.testcase;
import com.appium.api.Log;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import io.appium.java_client.android.AndroidDriver;
/**
* Created by kingwit on 2017/9/13 0013.
* 创建唯一的driver
*/
public class Utils {
public static AndroidDriver<?> driver;
public void creatDriver() {
File classpathRoot = new File(System.getProperty("user.dir"));
//app的目录
File appDir = new File(classpathRoot, "/apps");
//app的名字,对应你apps目录下的文件
// File app = new File(appDir, "36f2a88f08fae8dafff1367e2fe73fb8.apk");
//创建Capabilities
DesiredCapabilities dc = new DesiredCapabilities();
//设置app的
// dc.setCapability("app", app.getAbsolutePath());
//设置要调试的模拟器的名字
dc.setCapability("deviceName", "015d8537ca6120e9");
//support Chinese支持中文输入
dc.setCapability("unicodeKeyboard", "True");
//重置输入法为系统默认
dc.setCapability("resetKeyboard", "True");
//设置模拟器的系统版本
dc.setCapability("platformVersion", "7.1.2");
dc.setCapability("noReset", true); //不需要再次安装
//no need sign 安装时不对apk进行重签名,设置很有必要,否则有的apk在重签名之后无法正常使用
dc.setCapability("noSign", "True");
//设置app的包名
dc.setCapability("appPackage", "o--------");
dc.setCapability("sessionOverride", true);
//设置app的启动activity
dc.setCapability("appActivity", "org.stagex.danmaku.activity.SplashActivity");
//启动driver
try {
driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), dc);
Log.info("创建driver对象成功...");
} catch (Exception e) {
Log.error("创建driver对象失败...");
e.printStackTrace();
}
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
Log.info("App is launched!....");
}
}
基础测试类:
package com.testcase;
import com.appium.api.Log;
import com.basepage.object.ChannelPage;
import com.basepage.object.HomePage;
import com.basepage.object.LoginPage;
import com.basepage.object.MyPage;
import com.basepage.object.PlayerPage;
import com.basepage.object.UtilsPublicPage;
import com.datas.api.ActivityPaser;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import static com.appium.api.ThreadSleepMethod.threadSleep;
import static com.basepage.object.HomePage.PagePath;
/**
* Created by kingwit on 2017/9/18 0018.
* 测试父类,测试子类继承该类提供初始化实例
*/
public class BaseTestCase extends Utils{
static HomePage homePage ;
static PlayerPage playerPage ;
static MyPage myPage ;
static ChannelPage channelPage;
static LoginPage loginPage;
static UtilsPublicPage up;
@BeforeSuite
public void beforeSuit(){
creatDriver();
threadSleep(10000);
Log.info("初始化页面实例...");
init();
beforeClassTest();
}
@AfterSuite
public void tearDown() throws Exception {
//测试完毕,关闭driver,不关闭将会导致会话还存在,下次启动就会报错
Log.info("测试完成...退出app");
driver.quit();
}
//初始化页面实例
private void init(){
playerPage = PlayerPage.getInstance(driver);
homePage = HomePage.getInstance(driver);
myPage = MyPage.getInstance(driver);
channelPage = ChannelPage.getInstance(driver);
loginPage = LoginPage.getInstance(driver);
up = UtilsPublicPage.getInstance(driver);
}
/**
* 每次测试结束后需要回到home主页
*/
@AfterClass
public void afterClass(){
threadSleep(2000);
for(int i=0; i<4; i++) {
if (!up.getCurrentActivity().equals(ActivityPaser.HomePageActivty)) {
Log.info("当前页面不在主页,回到主页....");
homePage.goBack();
if (playerPage.isTargetAppear("exitPlay")){
playerPage.clickByButtonName("exitPlay");
}
}else{
homePage.goToAppoint(PagePath,1,"频道");
break;
}
}
}
// 开始测试前关闭广告
private void beforeClassTest(){
Log.info("判断当前主页");
try{
if(up.getCurrentActivity().equals(ActivityPaser.HomePageActivty)) {
Log.info("当前页面为home主页");
homePage.closeAD();
}
}catch (Exception e){
//加上点击一下频道按钮
Log.info("不在home主页");
threadSleep(2000);
}
}
}
给出一个具体测试用例:
package com.testcase;
import com.appium.api.Log;
import com.datas.api.ActivityPaser;
import org.assertj.core.api.Assertions;
import org.openqa.selenium.WebElement;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.List;
import static com.appium.api.ThreadSleepMethod.threadSleep;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Created by kingwit on 2017/9/18 0018.
* 搜索测试集
*/
public class SearchTestCase extends BaseTestCase{
@BeforeClass
public void beforeClass(){
}
/*
用于重复操作
*/
private void inputSearch(){
homePage.search("吴京");
}
@Test(description = "搜索测试:有搜索结果")
public void searchResult() {
Log.info("搜索测试开始...");
inputSearch();
List<WebElement> list = homePage.getSearchResult("search_title_name");
assertThat(list.get(0).getText()).contains("吴京");
}
@Test(description = "搜索测试:搜索结果跳转播放")
public void playSearchResult() {
Log.info("测试搜索结果跳转播放...");
threadSleep(2000);
inputSearch();
List<WebElement> list = homePage.getSearchResult("search_title_name");
list.get(0).click();
assertThat(playerPage.isPlayOrNot());
homePage.goBack();
}
@Test(description = "搜索测试:删除输入内容")
public void deleteInputText() {
Log.info("测试删除输入内容...");
inputSearch();
Log.info("删除前内容是:"+homePage.getEditText());
homePage.deleteEditText();
Log.info("删除后内容是:"+homePage.getEditText());
assertThat(homePage.getEditText()).contains("输入频道");
}
@Test(description = "搜索测试:云币领取")
public void getCooudCoin() {
threadSleep(5000);
}
@Test(description = "搜索测试:无搜索结果")
public void noSearchResultTest() {
Log.info("搜索测试开始...");
homePage.search("uuuuu");
threadSleep(2000);
List<WebElement> list = homePage.getSearchResult("no_search_result");
// List<WebElement> list = (List<WebElement>) driver.findElements(By.className("android.widget.TextView"));
Log.info("list 长度为 "+list.size());
assertThat(list.get(1).getText()).contains("没有搜到内容");
}
@Test(description = "搜索测试:热门推荐")
public void hotSearchTest() {
Boolean flag = false;
Log.info("热门搜索测试开始...");
homePage.search("");
List<WebElement> list = homePage.getSearchResult("hot_search");
for(int i=0; i<list.size(); i++){
if(list.get(i).getText().contains("那年花开")){
flag = true;
}
}
Assertions.assertThat(flag);
}
@Test(description = "搜索测试:热门推荐跳转播放")
public void playHotRecommended() {
Log.info("测试热门推荐跳转播放...");
homePage.search("");
List<WebElement> list = homePage.getSearchResult("hot_search");
for(int i=0; i<list.size(); i++){
if(list.get(i).getText().contains("猎场")){
list.get(i).click();
Log.info("找到热门搜索相关元素");
break;
}else{
Log.info("没有找到热门搜索相关元素");
}
}
threadSleep(3000);
List<WebElement> li = homePage.getSearchResult("search_title_name");
li.get(0).click();
assertThat(playerPage.isPlayOrNot());
homePage.goBack();
}
@Test(description = "搜索测试:搜索历史")
public void searchHistory() {
Log.info("搜索历史测试开始...");
homePage.search("洪金宝");
threadSleep(2000);
List<WebElement> list = homePage.getSearchResult("search_title_name");
list.get(0).click();
if(up.getCurrentActivity().equals(ActivityPaser.PlayPageActivty)){
Log.info("跳到播放页成功...播放15s");
threadSleep(15000);
homePage.goBack();
Log.info("返回搜索页");
}else {
Log.info("跳到播放页失败");
}
homePage.cancelSearch();
homePage.search("");
List<WebElement> ls = homePage.getSearchResult("hot_search");
assertThat(ls.get(0).getText()).contains("洪金宝");
}
@Test(description = "搜索测试:搜索历史跳转播放",dependsOnMethods = { "searchHistory" })
public void playSearchHistory() {
homePage.search("");
List<WebElement> list = homePage.getSearchResult("hot_search");
if(list.size()<1){
Log.info("找不到搜索历史,请检查");
assertThat(true).isFalse();
}else{
list.get(0).click();
List<WebElement> li = homePage.getSearchResult("search_title_name");
li.get(0).click();
assertThat(playerPage.isPlayOrNot());
}
homePage.goBack();
}
@Test(description = "搜索测试:删除搜索历史",dependsOnMethods = { "playSearchHistory" })
public void deleteHistory() {
Boolean flag = true;
homePage.search("");
homePage.deleteHistory();
if(homePage.isTargetAppear("dele_history")){
flag = false;
}
assertThat(flag);
}
@AfterClass
public void exitSearch(){
homePage.cancelSearch();
}
}