## 自动化测试移动端 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 包结构
- 鸣谢