一.簡介:
Appium採用CS架構,客戶端測試用例可採用多種語言編程,跟服務端建立一個session,服務端解析後發送指令到手機進行交互。
支持Native app(通過本地的控件訪問),Web app(使用移動瀏覽器訪問的應用)Hybrid app(本地app內嵌webview加載網頁內容),通過context切換上下文。
appium類庫封裝了標準Selenium客戶端類庫,實際對手機的操作使用android的Uiautomator或IOS的Uiautomation。因此Uiautomator有的毛病appium有,Uiautomator沒有的毛病appium也可能有。總之坑深而路遠啊。
二.環境搭建:
JDK
SDK:配置ANDROID_HOME
node_js:(非必須,安裝後可使用cmd啓動appium服務端)
Appium server: node-modle的bin目錄放進path
以上配置完成後,使用appium-doctor檢查所需要的環境是否配置成功
客戶端Java工程依賴jar包:jdk版本和selenium有不兼容的情況,我採用jdk1.7,其餘版本如下。其中java-client在appium官網下載,selenium*在selenium官網下載。
三.編寫測試用例
舉例一個最基本的登錄操作
在啓動session時必須提供Desired Capabilities, Desired Capabilities本質上是以 key value 字典的方式存放,客戶端將這些鍵值對發給服務端,告訴服務端我們想要怎麼測試,可寫在setup中。
teardown中斷開session
用例中執行相關操作以及斷言。
public class AppiumTestJunit {
AndroidDriver driver;
@Before
public void setUp() throws Exception {
DesiredCapabilities cap=new DesiredCapabilities();
//設備 adb devices查看
cap.setCapability("deviceName","127.0.0.1:62001");
//手機系統版本
cap.setCapability("platformVersion", "5.0");
//測試引擎,默認Appium,API-level<17的情況下設置爲selendriod
cap.setCapability("automationName", "Appium");
//必填,測試平臺,iOS,Android,Firefox OS
cap.setCapability("platformName", "Android");
//apk文件路徑,appium運行時會先嚐試安裝再開始測試,如果沒有的話,會根據appActivity和appPackage去目標機器查找目標app
//cap.setCapability("app", "C:\\Users\\Administrator\\Desktop\\apks\\vcm-release-2.6.0(6).apk");
//安卓必填 被測應用程序的包名
cap.setCapability("appPackage", "com.checheyun.vcm");
//被測應用程序啓動的Activity的名稱
cap.setCapability("appActivity", ".MainActivity");
//appium服務端超過設置的時間沒有收到消息時認爲客戶端退出,默認60
cap.setCapability("newCommandTimeout", 60);
//等待測試設備ready的超時時間
cap.setCapability("devicereadyTimeout", 30);
//是否啓用支持unicode的鍵盤
cap.setCapability("unicodeKeyboard", true);
//session結束後是否重置鍵盤
cap.setCapability("resetKeyboard", true);
driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), cap);
//設置全局隱式等待30S
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@After
public void tearDown() throws Exception {
driver.quit();
}
@Test
public void test() {
WebElement username=driver.findElementByXPath("//android.widget.EditText[@text=\"請輸入手機號\"]");
username.sendKeys("xxxxxx");
WebElement passwd=driver.findElementByXPath("//android.widget.ScrollView/android.view.View/android.view.View[2]/android.widget.EditText");
passwd.sendKeys("123456");
driver.findElementByAndroidUIAutomator("new UiSelector().description(\"login_btn\")").click();
//driver.findElementByAccessibilityId("login_btn").click();
WebElement me=driver.findElementByXPath("//*[contains(@content-desc,\"bottom_icon\")]/android.view.View[5]/android.widget.TextView");
String me_cont=me.getText();
assertTrue("mebtn not exist",me_cont.equals("我的"));
}
}