## 自動化測試移動端 web 應用
如果你有興趣在 iOS 系統上的 Safari 瀏覽器或者 Android 系統上的 Chrome 瀏覽器進行網頁自動化的話
,Appium可以幫到你。你只要正常地寫 WebDriver 測試,通過對 desired capabilities 進行一些特殊的設置,可以把 Appium 當成 Selenium 服務來運行。
### iOS 移動 web 自動化
Appium 可以在真實或模擬的 iOS 設備上的 Safari 瀏覽器上進行自動化。通過將 [desired capabilty](../writing-running-appium/caps.md) 中的 `browserName` 的值設置為 `"Safari"` 同時將 `app` 功能留空。
在嘗試運行 Appium 之前,你**必須**要先在設備上運行 Safari ,以確保相關參數已經被正確的設置。
然后,你就可以在移動端設備上的 Safari 瀏覽器上通過設置 desired capabilities 來運行你的測試。
```javascript
// javascript
{
platformName: 'iOS'
, platformVersion: '13.2'
, automationName: 'XCUITest'
, browserName: 'Safari'
, deviceName: 'iPhone 11'
}
```
```python
# python
{
'platformName': 'iOS',
'platformVersion': '13.2',
'automationName': 'XCUITest',
'browserName': 'Safari',
'deviceName': 'iPhone 11'
}
```
```php
// php
public static $browsers = array(
array(
'desiredCapabilities' => array(
'platformName' => 'iOS',
'platformVersion' => '13.2',
'automationName' => 'XCUITest',
'browserName' => 'Safari',
'deviceName' => 'iPhone 11'
)
)
);
```
```java
// java
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "13.2");
capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "XCUITest");
capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 11");
```
```ruby
{
platformName: 'iOS',
platformVersion: '13.2',
automationName: 'XCUITest',
deviceName: 'iPhone 11',
browserName: 'Safari'
}
```
### iOS 虛擬機上的移動端 Safari
首先,確定你的 Safari 開發者模式開啟,移動調試端口打開。
### iOS 真機上的移動端 Safari
在 [iOS 9.3 及以下版本](../drivers/ios-uiautomation.md) (pre-XCUITest)版本系統,我們借助 [SafariLauncher App](https://github.com/snevesbarros/SafariLauncher) 應用在移動端 Safari 運行測試。
這是因為Safari是蘋果公司的應用,Instruments 不能在真機上拉起 Safari。SafariLuncher 可以幫助打開 Safari 瀏覽器,瀏覽器一旦打開,Remote Debugger 會通過 [ios-webkit-debug-proxy](https://github.com/google/ios-webkit-debug-proxy) 自動連接。在 `ios-webkit-debug-proxy` 運行時,
必須在你的iOS設備測試前,對這臺設備進行授權。
指導如何安裝和運行 ios-webkit-debugger-proxy ,可以查閱 [iOS WebKit debug proxy](../writing-running-appium/web/ios-webkit-debug-proxy.md)
### 安裝
在真實上運行測試前,你需要:
* 安裝好 **ios-webkit-debug-proxy**,運行并在 27753 接口開啟監聽。(查閱 [hybrid 文檔](../writing-running-appium/web/hybrid.md#execution-against-a-real-ios-device) 作為指導)
* 在 iOS 設備上開啟 **web inspector**(設置>safari>高級)
* `XCUITest` 和 `Instruments`
* 在 iOS 設備上開啟 **web inspector**(設置>safari>高級)
* 只有 `Instruments`時
* 安裝好 **ios-webkit-debug-proxy**,運行并在 27753 接口開啟監聽。
(詳情見以下文檔 [hybrid docs](../writing-running-appium/web/hybrid.md#execution-against-an-ios-real-device) )
* 確保 `SafariLauncher` 能正常工作
(詳情見以下文檔 [SafariLauncher docs](../drivers/ios-uiautomation-safari-launcher.md) )
### 運行你的測試
在 Safari 運行你的測試,只需簡單地設置 `"browserName"` 為 `"Safari"` 。
```java
// java
//設置web driver并啟動 webview 應用。
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
URL url = new URL("http://127.0.0.1:4723/wd/hub");
AppiumDriver driver = new AppiumDriver(url, desiredCapabilities);
// 瀏覽網頁和定位頁面元素取得id。
driver.get("http://saucelabs.com/test/guinea-pig");
WebElement div = driver.findElement(By.id("i_am_an_id"));
Assert.assertEquals("I am a div", div.getText()); //檢查檢索到的文本是否與預期值匹配
driver.findElement(By.id("comments")).sendKeys("My comment"); //按 id 填充 comments 字段。
//關閉瀏覽器
driver.quit();
```
```python
# python
# 建立web driver,開啟瀏覽器app。
capabilities = { 'browserName': 'Safari', 'automationName': 'XCUITest' }
driver = webdriver.Remote('http://localhost:4723/wd/hub', capabilities)
# 瀏覽網頁和定位頁面元素取得id。
driver.get('http://saucelabs.com/test/guinea-pig');
div = driver.find_element_by_id('i_am_an_id')
# 檢查文本是否匹配值
assertEqual('I am a div', div.text)
# 通過元素id填值。
driver.find_element_by_id('comments').send_keys('My comment')
# 關閉瀏覽器。
driver.quit()
```
```php
// php
class ContextTests extends PHPUnit_Extensions_AppiumTestCase
{
public static $browsers = array(
array(
'desiredCapabilities' => array(
'platformName' => 'iOS',
'platformVersion' => '7.1',
'automationName' => 'XCUITest',
'browserName' => 'Safari',
'deviceName' => 'iPhone 11'
)
)
);
public function testThings()
{
$this->get('http://saucelabs.com/test/guinea-pig');
$div = $this->byId('i_am_an_id');
$this->assertEquals('I am a div', $div->text());
$this->byId('comments')->sendKeys('My comment');
}
}
```
### Android 移動 web 自動化
無論是在真實還是模擬的 Android 設備上,Appium 都支持 Chrome 瀏覽器的自動化。
先決條件:
*確保 Chrome 瀏覽器已經安裝在你的真實或虛擬的安卓設備上。
*需要安裝好ChromeDriver(來自 Appium 的默認版本)
并且配置好用于自動化設備上可用的特定版本的 Chrome 。點擊 [這里](../../writing-running-appium/web/chromedriver.md) 去了解更多關于兼容性的詳細信息。
然后使用 [desired capabilties](../writing-running-appium/caps.md) 像下面的例子去 Chrome 瀏覽器上運行你的測試。
```javascript
// javascript
{
platformName: 'Android'
, platformVersion: '9.0'
, deviceName: 'Android Emulator'
, automationName: 'UIAutomator2'
, browserName: 'Chrome'
};
```
```python
# python
{
'platformName': 'Android',
'platformVersion': '9.0',
'deviceName': 'Android Emulator',
'automationName': 'UIAutomator2',
'browserName': 'Chrome'
}
```
```php
// php
public static $browsers = array(
array(
'desiredCapabilities' => array(
'platformName' => 'Android',
'platformVersion' => '9.0',
'browserName' => 'Chrome',
'automationName' => 'UIAutomator2',
'deviceName' => 'Android Emulator'
)
)
);
```
```java
// java
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "9.0");
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UIAutomator2");
capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome");
```
```ruby
{
platformName: 'Android',
platformVersion: '9.0',
deviceName: 'Android Emulator',
automationName: 'UIAutomator2',
browserName: 'Chrome'
}
```
注意:在 4.4+ 版本的設備上,你也可以將 `browserName` 設置為 'Browser' 在內建的瀏覽器上運行自動化。設置瀏覽器為 'Chromium' 是在所有設備可以運行的。在所有設備上,你可以將 `browserName` 設置為 'Chromium' 來對 Chromium 的某個版本進行自動化。
#### Chromedriver 的障礙排除
如果你的測試目標要求更新的 ChromeDriver 版本時,ChromeDriver 的這一特性 [chromedriver_自動下載](../writing-running-appium/web/chromedriver.md#automatic-discovery-of-compatible-chromedriver) 會幫到你。這一特性在 Appium 1.15.0的安全性選項中已經能夠使用。你可以通過點擊文件的鏈接去學習如何使用它。
當你需要特定版本的 ChromeDriver 時,`chromedriverExecutableDir` 這一功能能幫到你。
截止 Chrome Version 33,設備不再需要被 root。在這之前,設備需要被 root,因為 ChromeDriver 設置啟動 Chrome 的命令行參數需要在 `/data/local` 目錄的寫入權限。
如果在 Chrome 低于 33 版本上測試,請確保 `adb shell` 有設備讀取/寫入 `/data/local` 權限。
```center
$ adb shell su -c chmod 777 /data/local
```
這里提及下 Chromedriver 有個功能 `showChromedriverLog`,當你將其設置為 `true`時,Appium 日志會一起寫入 Chromedriver 日志中。這對我們的調試十分有幫助。
更多 chromedriver 文檔參見(https://sites.google.com/a/chromium.org/chromedriver/getting-started/getting-started---android)
本文由 [CrazyForPoor](https://github.com/CrazyForPoor) 翻譯。
- 關于TesterHome和MTSC
- 關于Appium
- 簡介
- Appium 客戶端
- 入門指南
- 已支持的平臺
- API 文檔
- Appium驅動
- XCUITest (iOS)
- XCUITest Real Devices (iOS)
- UIAutomation (iOS)
- UIAutomation Safari Launcher (iOS)
- UIAutomator (Android)
- UIAutomator2 (Android)
- Espresso (Android)
- Windows
- Mac
- Appium命令
- Status
- Execute Mobile Command
- Session
- Create
- End
- Get Session Capabilities
- Go Back
- Screenshot
- Source
- Timeouts
- Timeouts
- Implicit Wait
- Async Script
- Orientation
- Get Orientation
- Set Orientation
- Geolocation
- Get Geolocation
- Set Geolocation
- Logs
- Get Log Types
- Get Logs
- Events
- Log event
- Get events
- Settings
- Update Settings
- Get Device Settings
- Settings
- Update Settings
- Get Device Settings
- Execute Driver Script
- Device
- Activity
- Start Activity
- Current Activity
- Current Package
- App
- Install App
- Is App Installed
- Launch App
- Background App
- Close App
- Reset App
- Remove App
- Activate App
- Terminate App
- Get App State
- Get App Strings
- End Test Coverage
- Clipboard
- Get Clipboard
- Set Clipboard
- Emulator
- Power AC
- Power Capacity
- Files
- Push File
- Pull File
- Pull Folder
- Interactions
- Shake
- Lock
- Unlock
- Is Locked
- Rotate
- Keys
- Press keycode
- Long press keycode
- Hide Keyboard
- Is Keyboard Shown
- Network
- Toggle Airplane Mode
- Toggle Data
- Toggle WiFi
- Toggle Location Services
- Send SMS
- GSM Call
- GSM Signal
- GSM Voice
- Network Speed
- Performance Data
- Get Performance Data
- Performance Data Types
- Screen Recording
- Start Screen Recording
- Stop Screen Recording
- Simulator
- Perform Touch ID
- Toggle Touch ID Enrollment
- System
- Open Notifications
- System Bars
- System Time
- Display density
- Authentication
- Finger Print
- Element
- Find Element
- Find Elements
- Actions
- Click
- Send Keys
- Clear
- Attributes
- Text
- Name
- Attribute
- Selected
- Enabled
- Displayed
- Location
- Size
- Rect
- CSS Property
- Location in View
- Other
- Submit
- Active Element
- Equals Element
- Context
- Get Context
- Get All Contexts
- Set Context
- Interactions
- Mouse
- Move To
- Click
- Double Click
- Button Down
- Button Up
- Touch
- Single Tap
- Double Tap
- Move
- Touch Down
- Touch Up
- Long Press
- Scroll
- Flick
- Multi Touch Perform
- Touch Perform
- W3C Actions
- Web
- Window
- Set Window
- Close Window
- Get Handle
- Get Handles
- Get Title
- Get Window Size
- Set Window Size
- Get Window Position
- Set Window Position
- Maximize Window
- Navigation
- Go to URL
- Get URL
- Back
- Forward
- Refresh
- Storage
- Get All Cookies
- Set Cookie
- Delete Cookie
- Delete All Cookies
- Frame
- Switch to Frame
- Switch to Parent Frame
- Execute Async
- Execute
- 編寫 & 運行Appium腳本
- Running Tests
- Desired Capabilities
- The --default-capabilities flag
- Finding Elements
- Touch Actions
- CLI Arguments
- Server Security
- Web/Web Views
- Mobile Web Testing
- Automating Hybrid Apps
- Using ios-webkit-debug-proxy
- Using Chromedriver
- Image Comparison
- iOS
- Low-Level Insights on iOS Input Events
- XCUITest Mobile Gestures
- XCUITest Mobile App Management
- iOS Pasteboard Guide
- iOS Predicate Guide
- iOS Touch ID Guide
- iOS Install Certificate
- tvOS support
- Pushing/Pulling files
- Audio Capture
- Android
- Low-Level Insights on Android Input Events
- UiSelector Guide
- Espresso Datamatcher Guide
- Android Code Coverage Guide
- Activities Startup Troubleshooting Guide
- How To Execute Shell Commands On The Remote Device
- Android Device Screen Streaming
- How To Emulate IME Actions Generation
- How To Test Android App Bundle
- Other
- Reset Strategies
- Network Connection Guide
- Using Unicode with Appium
- Troubleshooting
- Tutorial
- Swipe Tutorial
- Screen
- Element
- Partial screen
- Simple
- Multiple scroll views
- Add scroll layout
- Tricks and Tips
- Screen
- Element
- Element search
- Fast
- Slow
- Guide
- 進階概念
- 定位圖像中的元素
- 使用定位元素的插件
- 遷移到 XCUITest
- 在 Appium 中使用 Selenium Grid
- Appium Logs Filtering
- 跨域 iframes
- 使用自定義 WDA 服務器
- 使用不同版本的 Xcode 運行
- The Event Timings API
- 并行測試的設置
- The Settings API
- Memory Collection
- 向Appium項目做貢獻
- 從源代碼運行 Appium
- 開發者概述
- 標準開發命令
- Appium 風格指南
- 如何編寫文檔
- Appium 包結構
- 鳴謝