# Appium自動化測試(Java版)
# Appium自動化測試
### Appium軟件配置(僅設置圖片所展示即可)


### Appium-Inspector工具配置
**Desired Capabilities屬性值配置**
| 屬性名稱 | 類型 | 值 |
| :-: | :-: | :-: |
| deviceName | text | 127.0.0.1:62001 |
| platformName | text | Android |
| appPackage | text | com.smile.gifmaker |
| appActivity | text | com.yxcorp.gifshow.HomeActivity |
* 連接到夜神模擬器
~~~
adb connect 127.0.0.1:62001
~~~
* 檢測設備
~~~
adb devices
~~~
* 獲取包名
在build-tools文件夾下,cmd中輸入命令
~~~
aapt dump badging D:\Android\software\kuaishou.apk(軟件路徑)
~~~

* 獲取應用程序入口
在獲取包名的同時找launchable-activity的值

**配置結果**

啟動會話后,若出現下面結果,則配置成功。

### 元素探測工具
##### Appium Inspector工具

##### UIAutomatorViewer工具(SDK提供的原生元素定位工具,不需要提供啟動參數)
該工具在Android/Android-SDK/tools/bin目錄下

### 名稱解釋
**PackageName**(包名)應用程序的唯一標識
**ActivityName**(類名)一個頁面的名字
可以通過命令
~~~
adb shell dumpsys activity | find "mFocusedActivity"
~~~
查看當前聚焦頁面的包名和類名

### App類型對比

### APP頁面布局

### APP頁面控件

### ADB組件

#### adb常用命令
* 查看幫助手冊
~~~
adb help
~~~
* 檢測連接到電腦的安卓設備(注意模擬器的連接)
~~~
adb devices
~~~
* 從手機中拉取信息放到本地電腦上
~~~
adb pull<手機路徑><本機路徑>
~~~
* 從本地推送信息到手機上去
~~~
adb push<本機路徑><手機路徑>
~~~
* 登錄設備shell模式(命令行的人機界面)
~~~
adb shell
~~~
* 安裝應用
~~~
adb install xxx.apk
~~~
* 卸載應用
~~~
adb uninstall com.ss.android.ugc.aweme(應用程序包名)
~~~
* 查看前臺應用包名
~~~
adb shell dumpsys activity | find "mFocusedActivity"
~~~
* 終止adb服務
~~~
adb kill-server
~~~
* 啟動adb服務
~~~
adb start-server
~~~
* 啟動App
~~~
adb shell am start -n com.tencent.weishi(包名)/com.tencent.oscar.module.main.MainActivity(入口)
~~~
* 清除應用的數據和緩存
~~~
adb shell pm clear 包名
~~~
* 坐標點擊
~~~
adb shell input tap x軸坐標 y軸坐標
~~~
* 列出所有包名
~~~
adb shell pm list packages
~~~
* 打印日志
~~~
adb logcat (ctrl+c終止抓取)
~~~
### 初體驗
~~~java
package pers.lele;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.MalformedURLException;
import java.net.URL;
public class FirstAppium {
public static AndroidDriver<WebElement> androidDriver;
public static void main(String[] args) throws MalformedURLException, InterruptedException {
//1、創建配置對象
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
//2、添加配置
//deviceName:測試的設備
desiredCapabilities.setCapability("deviceName","127.0.0.1:62001");
//platformName
desiredCapabilities.setCapability("platformName","Android");
//appPackage:測試的App
desiredCapabilities.setCapability("appPackage","com.tencent.weishi");
//automationName:uiautomator2解決輸入框輸入不了數據
//desiredCapabilities.setCapability("automationName","uiautomator2");
//appActivity:測試App啟動入口
desiredCapabilities.setCapability("appActivity","com.tencent.oscar.module.splash.SplashActivity");
//3.創建驅動
//第一個參數:Appium通訊地址
//第二個參數:配置對象
androidDriver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"),desiredCapabilities);
searchTest();
}
public static void searchTest() throws InterruptedException {
//等待元素加載完畢
Thread.sleep(1000*10);
androidDriver.findElementById("com.tencent.weishi:id/tv_tip_close").click();
//1、找到搜索按鈕并點擊
androidDriver.findElementById("com.tencent.weishi:id/noname_base_search").click();
//2、找到搜索框,輸入路人王
androidDriver.findElementById("com.tencent.weishi:id/search_input").sendKeys("路人王");
//斷言:
/*
String expected = "";
String result androidDriver.currentActivity();
Assert.assertEquals(expected,result);
*/
//驅動銷毀
//androidDriver.quit();
}
}
~~~
### Appium元素定位
* **ID**:控件的唯一身份標識,但是可能由于app項目開發人員不嚴謹導致一個頁面有多個相同的id
### 元素等待
* 強制等待
~~~
Thread.sleep();
~~~
* 隱式等待
~~~
androidDriver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
~~~
* 顯示等待:針對某個元素設置等待時間
~~~
WebDriverWait webDriverWait = new WebDriverWait(androidDriver,10);
WebElement webElement = webDriverWait.until(new ExpectedCondition<WebElement>() {
@NullableDecl
@Override
public WebElement apply(@NullableDecl WebDriver webDriver) {
return androidDriver.findElementById("com.tencent.weishi:id/noname_base_search");
}
});
webElement.click();
~~~
### 手勢操作-滑動
~~~
TouchAction touchAction = new TouchAction(androidDriver);
PointOption startPoint = PointOption.point(476, 1326);
PointOption endPoint = PointOption.point(414, 234);
Duration duration = Duration.ofMillis(500);
WaitOptions options = WaitOptions.waitOptions(duration);
touchAction.press(startPoint).waitAction(options).moveTo(endPoint).release();
touchAction.perform();
~~~
- 第一章-測試理論
- 1.1軟件測試的概念
- 1.2測試的分類
- 1.3軟件測試的流程
- 1.4黑盒測試的方法
- 1.5AxureRP的使用
- 1.6xmind,截圖工具的使用
- 1.7測試計劃
- 1.8測試用例
- 1.9測試報告
- 2.0 正交表附錄
- 第二章-缺陷管理工具
- 2.1缺陷的內容
- 2.2書寫規范
- 2.3缺陷的優先級
- 2.4缺陷的生命周期
- 2.5缺陷管理工具簡介
- 2.6缺陷管理工具部署及使用
- 2.7軟件測試基礎面試
- 第三章-數據庫
- 3.1 SQL Server簡介及安裝
- 3.2 SQL Server示例數據庫
- 3.3 SQL Server 加載示例
- 3.3 SQL Server 中的數據類型
- 3.4 SQL Server 數據定義語言DDL
- 3.5 SQL Server 修改數據
- 3.6 SQL Server 查詢數據
- 3.7 SQL Server 連表
- 3.8 SQL Server 數據分組
- 3.9 SQL Server 子查詢
- 3.10.1 SQL Server 集合操作符
- 3.10.2 SQL Server聚合函數
- 3.10.3 SQL Server 日期函數
- 3.10.4 SQL Server 字符串函數
- 第四章-linux
- 第五章-接口測試
- 5.1 postman 接口測試簡介
- 5.2 postman 安裝
- 5.3 postman 創建請求及發送請求
- 5.4 postman 菜單及設置
- 5.5 postman New菜單功能介紹
- 5.6 postman 常用的斷言
- 5.7 請求前腳本
- 5.8 fiddler網絡基礎及fiddler簡介
- 5.9 fiddler原理及使用
- 5.10 fiddler 實例
- 5.11 Ant 介紹
- 5.12 Ant 環境搭建
- 5.13 Jmeter 簡介
- 5.14 Jmeter 環境搭建
- 5.15 jmeter 初識
- 5.16 jmeter SOAP/XML-RPC Request
- 5.17 jmeter HTTP請求
- 5.18 jmeter JDBC Request
- 5.19 jmeter元件的作用域與執行順序
- 5.20 jmeter 定時器
- 5.21 jmeter 斷言
- 5.22 jmeter 邏輯控制器
- 5.23 jmeter 常用函數
- 5.24 soapUI概述
- 5.25 SoapUI 斷言
- 5.26 soapUI數據源及參數化
- 5.27 SoapUI模擬REST MockService
- 5.28 Jenkins的部署與配置
- 5.29 Jmeter+Ant+Jenkins 搭建
- 5.30 jmeter腳本錄制
- 5.31 badboy常見的問題
- 第六章-性能測試
- 6.1 性能測試理論
- 6.2 性能測試及LoadRunner簡介
- 第七章-UI自動化
- 第八章-Maven
- 第九章-測試框架
- 第十章-移動測試
- 10.1 移動測試點及測試流程
- 10.2 移動測試分類及特點
- 10.3 ADB命令及Monkey使用
- 10.4 MonkeyRunner使用
- 10.5 appium工作原理及使用
- 10.6 Appium環境搭建(Java版)
- 10.7 Appium常用函數(Java版)
- 10.8 Appium常用函數(Python版)
- 10.9 兼容性測試