参考链接:安装appium:https://github.com/erduoniba/appium_ios_sample_code
中文网站:http://appium.io/slate/cn/master/?java#about-appium
1、下载或者更新Homebrew:homebrew官网 macOS 不可或缺的套件管理器
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" #下载
$ brew update #更新
$ brew -v
Homebrew 1.1.5
2、使用homebrew来安装node.js : Node.js教程 node采用C++编写,是一个JavaScript的运行环境,因为JS是脚本语言需要一个解析器才能运行,对于写在HTML页面的JS,浏览器本身就是解析器,对于需要单独运行的JS,Node.js就是解析器。
$ brew install node
$ node -v
v7.3.0
3、安装npm: NPM 使用介绍 是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。
$ brew install npm
$ npm -v
4.1.2
4、使用npm来安装appium,2017/01/03目前最新的版本是 1.6.3
,当然也可以在 Macos下bitbucket下载appium客户端,但是坑人的是最新版本是 1.5.3
支持的还只是 iOS10
以下的 UIAutomation
框架基础上测试,而 iOS10
以后苹果使用的却是基于 XCUITest
,所以只能采用npm安装咯。但是因为国内墙太高而使用npm却是从国外服务器下载,有时候使用npm需要非常长的时间,更多时候是失败,推荐使用cnpm来安装:淘宝 NPM 镜像 10分钟同步npmjs.org镜像,使用方式和npm完全一致
$ npm install cnpm -g --registry=https://registry.npm.taobao.org
使用cnpm安装appium和appium-doctor:
$ cnpm install -g appium --no-cache
$ cnpm install -g appium
$ cnpm install -g appium-doctor
若网速较好并且代理正常的话可以直接使用npm install -g appium进行安装,并安装appium-doctor
appium -v
1.6.3
6、安装wd
npm install wd
7、检查appium环境检测:
$ appium-doctor
若展示Everything looks good, bye!则安装完成,若出错请根据提示进行配置,主要是全局配置文件上的问题修改.bash_profile文件
appium在ios10 真机上的使用:参考链接:http://blog.youkuaiyun.com/wuxuehong0306/article/details/54377957
另加步骤
- 1,有一个MAC机器,或者虚拟机,能够联网,要求Xcode8+ MAC系统10.11+(我用的是Xcode8.2 , MAC系统10.12)有一个Apple ID账号
- 2,安装brew(这一步已经在之前安装appium时已经完成)
usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 3,安装libimobiledevice
brew install libimobiledevice --HEAD
- 4,安装carthage(在appium-doctor中会有这一项目的检测,若没有安装会提示carthage was not found,通过以下方式安装)
brew install carthage
- 5,安装node(这一步已经在之前安装appium时已经完成)
- 6,安装cnpm(这一步已经在之前安装appium时已经完成)(由于某种原因,直接用npm下载安装会有好多网络问题,安装淘宝的cnpm要比npm好用) https://npm.taobao.org/
- 7,安装ios-deploy
cnpm install -g ios-deploy
- 8,安装xcpretty(可能会提示没有write权限,可以在指令前加上sudo 后执行)
gem install xcpretty
- 11,安装appium-xcuitest-driver依赖(针对ios10 以上的处理) 进入WebDriverAgent安装目录。运行bootstrap
cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent (如果WebDriverAgent 所在路径和此不同,请自行查找) mkdir -p Resources/WebDriverAgent.bundle sh ./Scripts/bootstrap.sh -d
在运行sh ./Scripts/bootstrap.sh -d很可能会有因为某种原因而网络连接失败。方法就是去App store下载了一个VPN代理软件.
再次运行sh ./Scripts/bootstrap.sh -d 无报错就OK了(显示 -e Fetching dependencies)- 12,用Xcode打开WebDriverAgent,并且编译
进入WebDriverAgent 文件夹,可用如下方法
双击WebDriverAgent.xcodeproj打开此项目,这个项目由facebook开源 有兴趣的话可以研究https://github.com/facebook/WebDriverAgent/apple。在这里我们的目的就是更改一些配置,让他能够编译成功
编译WebDriverAgentLib
编译WebDriverAgentRunner
关于为什么要设置Deployment Target,苹果官方宣称XCUItest支持9.3.4以上。但实际经过我测试9.0以上是没问题的,但是如果不调低最小安装的ios版本,会面临着WebDriverAgentRunner无法安装到ios9.0的手机上去的,所以无法测试ios9。
若果编译的过程中有语法错误,应该是11步没有安装好
若编译出现,.h文件无法找到,可以尝试先用intellij idea执行测试代码,之后再用xcode编译一遍可以解决此问题
关闭Xcode,进入WebDriverAgent 文件夹
cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'id=真机的udid' test
而iphone多了一个WebDriverAgentRunner的app。手动启动那个app的时候
原因是我们手机并并没有信任这个apple id的开发者,到设置-通用-设备管理(描述文件) 信任你的apple id就可以了。再次运行上述命令,看到如下图,就成功了,
- 14,运行appium
至此mac机器上关于ios10真机的配置已经完成appium -p 4723
- 导入所需要的jar包
selenium-server-standalone-3.0.0-beta3.jar(http://docs.seleniumhq.org/download/)
下载相应的jar后,复制到项目中,并点击右键选择add as library添加到项目中
- 相关代码
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.io.File;
import java.net.URL;
import java.util.List;
public class AndroidContactsTest {
private AppiumDriver<AndroidElement> driver;
@Before
public void setUp() throws Exception {
// set up appium
File classpathRoot = new File(System.getProperty("user.dir"));
//android 相关代码
File appDir = new File(classpathRoot, "/src/test/java/apps/");//将官方apk放置到自己设置的文件夹下
File app = new File(appDir, "ContactManager.apk");//https://github.com/appium/sample-code/blob/master/sample-code/apps/ContactManager/ContactManager.apk 官方给出的测试apk
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName","SM-N9200");//设备名
capabilities.setCapability("platformVersion", "6.0.1");//设备android版本
capabilities.setCapability("app", app.getAbsolutePath());
//ios相关代码
File appDir = new File(System.getProperty("user.dir"), "/src/test/java/apps/");//将官方ipa放置到自己设置的文件夹下
File app = new File(appDir, "TestApp.app");//https://github.com/appium/sample-code/tree/master/sample-code/apps/TestApp 官方给出的测试用ios程序,笔者直接使用TestApp/build/release-iphonesimulator/TestApp.app文件无法正常使用,因此使用TestApp.xcodeproj自行编译后,采用了编译代码后的ipa包
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "10.2");//测试真机的ios版本
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone");//测试真机的name,通过xcode查看
capabilities.setCapability(MobileCapabilityType.UDID, "8dbf13a9fd894edfcc537cfc89399b8f03754182");//设备的udid
capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
capabilities.setCapability("platformName", "iOS");
capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "XCUITest");//ios10需要使用xcuitest,进行处理
uiTestApp = new TestAppScreenSimple();
driver = new IOSDriver<MobileElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
System.out.println("driver ="+driver.getPageSource());
PageFactory.initElements(new AppiumFieldDecorator(driver), uiTestApp);
driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}
@After
public void tearDown() throws Exception {
driver.quit();
}
@Test
public void addContact(){
WebElement el = driver.findElement(By.xpath(".//*[@text='Add Contact']"));
el.click();
List<AndroidElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
textFieldsList.get(0).sendKeys("Some Name");
textFieldsList.get(2).sendKeys("Some@example.com");
driver.swipe(100, 500, 100, 100, 2);
driver.findElementByXPath(".//*[@text='Save']").click();
}
}