Appium 在 Mac 上配置 Appium 问题收集

恒温 · 2013年12月23日 · 最后由 haha269 回复于 2020年12月24日 · 4522 次阅读
本帖已被设为精华帖!

在这之前,请先阅读 在 Mac OS X 上使用 Appium

在 Mac 上配置 Appium

需求

按照官方的说法:

  • iOS

    • Mac OSX 10.7+
    • XCode 4.5+ 和 Command Line Tools
  • Android

    • Mac OSX 10.7+
    • JAVA 1.6+
    • Android SDK ≥ 16 (SDK < 16 in Selendroid mode)
    • ant
    • maven

按照我的尝试:

  1. Mac OSX 10.7+ 是必备的。 推荐使用最新的 10.9.x, 我基本都是在最新的系统上实验的。

  2. XCode 是必备的。XCode 和 Command Line Tools 其实提供了一些列的开发环境,不仅 iOS 需要, Android 也会用到。所以建议安装最新的 XCode 5.0.2。在最新的 XCode 上, Command Line Tools 的安装方式变了。大家可以直接在命令行运行 xcode-select --install,会弹出安装界面来。

  3. JAVA Android 开发必备。 Mac OSX 上一直觉得 JAVA 不安全,所以不默认安装。需要自己安装配置 JAVA 环境。

  4. nodejs —— appium 是用 nodejs 写的,如果要从源代码运行的话,nodejs 还真少不了。另外 appium 也是 nodejs 的一个 module。 我们可以并推荐通过 npm 安装 appium。

    很多人在用 npm install 的时候会遇到坑。

    • 比如 https 连不上。 这个就需要配置下 (Registry)[https://npmjs.org/doc/registry.html]
    • 使用 sudo 安装,在某个版本的 appium 里面,如果你使用 sudo npm install -g appium 安装的话,那么你必须找到这个安装的目录,并赋予其他用户读写权限,否则会出错。
    • -g 很多人问 -g 这个选项, -g 的意思是全局安装,装好之后,你可以直接在命令行调用。
    • 更新升级 appium —— sudo npm update -g appium
    • 安装某个版本的 appium —— sudo npm install -g appium@0.12

以上软件的安装,我默认大家都会。我自己的环境是使用 (homebrew)[http://brew.sh/] 配合管理软件的。比如 ant 安装:brew install ant。 非常的方便。

安装 Appium

Mac 下面一般有三种安装方法:

  1. 直接下载 dmg 文件。地址在 https://bitbucket.org/appium/appium.app/downloads/。有可能会被墙, *** 自备。
  2. 用 nodejs 的 npm 安装。强烈推荐。
  3. 从源代码执行。

Doctor

在软件都安装好之后,需要配置各种环境。在以前,需要运行起 Appium 的测试代码,发现一个环境的坑,填一个。现在 Appium 请了一个医生 —— appium-doctor。

在我们使用 npm 安装好 Appium 好之后,大家可以运行下 appium-doctor。


➜  ~  appium-doctor
Running iOS Checks
✔ Xcode is installed at /Applications/Xcode.app/Contents/Developer
✔ Xcode Command Line Tools are installed.
✔ DevToolsSecurity is enabled.
✔ The Authorization DB is set up properly.
✔ Node binary found at /usr/local/bin/node
✔ iOS Checks were successful.

Running Android Checks
✔ ANDROID_HOME is set to "/Applications/adt-bundle-mac-x86_64-20131030/sdk"
✔ JAVA_HOME is set to "/System/Library/Frameworks/JavaVM.framework/Home."
✔ ADB exists at /Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb
✔ Android exists at /Applications/adt-bundle-mac-x86_64-20131030/sdk/tools/android
✔ Emulator exists at /Applications/adt-bundle-mac-x86_64-20131030/sdk/tools/emulator
✔ Android Checks were successful.

可以看到,我的系统的环境都配置好了。 我们来试试看,填错一个环境变量,比如 ANDROID_HOME

➜  ~  appium-doctor
Running iOS Checks
✔ Xcode is installed at /Applications/Xcode.app/Contents/Developer
✔ Xcode Command Line Tools are installed.
✔ DevToolsSecurity is enabled.
✔ The Authorization DB is set up properly.
✔ Node binary found at /usr/local/bin/node
✔ iOS Checks were successful.

Running Android Checks
✖ ANDROID_HOME is set but does not exist on the file system at "/Axpplications/adt-bundle-mac-x86_64-20131030/sdk"
Appium-Doctor detected problems. Please fix and rerun Appium-Doctor.

Appium-Doctor 会帮助你定位环境配置问题。 其实使用 GUI 的 appium 在启动的时候,也会执行一遍 Appium-doctor 以确保环境的正确。

iOS

必备:

  • iOS 开发证书

    一年 99 美元免不了。xCode 5 之后,苹果把开发证书,发布证书,真机调试这一套东西都自动化了。只需要在 Preferences => Accounts 里面输入你注册的开发者账号。

  • 真机

    iPhone, iPad, iTouch 随便搞一台。

  • 模拟器

iOS 应用测试

Appium 在 iOS 上的实现底层调用的 instruments 的 UIAutomation。有兴趣的同学可以研究下,推荐书籍 Test iOS Apps with UI Automation。

对于一个应用,我们首先要把它 build 成一个 app。 xcode 提供了 xcodebuild 命令。详见 xcodebuild 文档

然后对于模拟器来说,只需在 cap 里指定 app 地址就可以了。比如:

File appDir = new File(System.getProperty("user.dir"), "../../../apps/TestApp/build/Release-iphonesimulator");
File app = new File(appDir, "TestApp.app");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability(CapabilityType.VERSION, "6.0");
capabilities.setCapability(CapabilityType.PLATFORM, "Mac");
capabilities.setCapability("device", "iPhone Simulator");
capabilities.setCapability("app", app.getAbsolutePath());
driver = new SwipeableWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

对于真机,那你需要 build 能在你设备上运行的 app 并把它烧到真机上去。你可以直接在 xcode 里选择真机运行或者使用 fruitstrap (未试用过) 推送到真机上。

之后,启动 Appium 时候,需要指定真机 UDID 和 app 的 bundle id。例如:appium -U 45f082689dbaebb0ffa3620b3ae22ad9faff9a30 --app io.appium

iOS web 测试

对于普通的 Webdriver 代码,Appium 也可以充当一个 Selenium Server。

在模拟器上,只要配置下 cap 的 app 参数就可以了。

{
  app: 'safari'
  , device: 'iPhone Simulator'
  , version: '7.0'
}

p.s 注意自己的版本号。

在真机上,Appium 还不能直接调用启动 Safari。我想其根本原因应该是和苹果的封闭性有关,之前 Webdriver 上的 SafariDriver 也是破费周折。苹果不允许你对他的产品有任何倾入行为。

不过英雄们还是有很多解决方法,坊间流传两个曲线救国的方法,可以参见 http://testerhome.com/topics/313

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 33 条回复 时间 点赞

总结的真不错啊

我的环境:
iOS:
Mac OSX 10.9.1
Xcode:5.0.2
运行正常

homebrew 真是居家旅行必备啊

Finish : 10.8.5 Appium0.11.3 Xcode 4.6.3
Appium0.12.3 Xcode 4.6.3
Appium0.11.3 Xcode 5.0.0
Appium0.12.3 Xcode 5.0.0

很不错,学习😄

恒温 #29 · 2014年01月09日 Author

#5 楼 @jimneylee 你做 ios 开发 还来研究测试哇?

#6 楼 @lihuazhang 恩,其实测试开发在一定程度上需要互相了解,这样出了问题沟通应该会更方便。况且对于我目前的公司,没有专门自动化测试组,学习这个更尤为必要。哈哈,先简单了解通过什么工具能做到自动化测试。

恒温 #27 · 2014年01月09日 Author

#7 楼 @jimneylee 嗯,公寓上期即必先伤其己。。。 以后论坛里有 iOS 移动开发测试的问题,多多指教

这篇总结的真不错哦 ,刚看到,上午搞了一上午终于运行起来公司的 app 了,就是是不是启动真机必须需要付费和需要。。id 等,我不是很懂

能不能先在 mac 上启动一个模拟器,然后直接调用里面的 app,不是每次运行都起一个模拟器完事后关闭,这样很烦。。。。。

#8 楼 @lihuazhang 真机下 app 和 web 测试的 capabilities 参数如何填写?

恒温 #23 · 2014年02月20日 Author

#9 楼 @oscar 真机肯定要钱。应该不行。 其实他是调用 instruments 的。 instruments 就是每次都会启动一个模拟器。

@ifelix 文章里写了吧? 另外可以看看 sample-code 里面的代码。

#12 楼 @lihuazhang Appium 可以测试 IOS 系统上的 Wifi 设置/拨号等系统原生非应用的功能吗?

恒温 #21 · 2014年02月21日 Author

#13 楼 @ifelix instruments 不行。 所以 Appium 也不行。

#12 楼 @lihuazhang 那真的很悲剧,没跑一条 case 就启动一次,如果用真机呢,申请 id 付费,可不可以 不用每次都启动关闭模拟器呢?

@oscar 其实这个问题很简单,你可以考虑下把所有的 case,放到一个@test中去,然后在@test,中去进行你的用例管理和逻辑设计.

回头好好看看这个帖子,配置个 mac 上的 Android 环境

 你好,在配置 appium 过程中遇到这样的问题:
通过http://nodejs.org/node 和 npm安装
安装 appium 的命令为 sudo npm install -g appium

解决方法:安装 node 时使用的是 pkg 包,现在想卸载 node,卸载命令如下:
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
/usr/local/lib/node_modules \
/var/db/receipts/org.nodejs.*
卸载后,想通过 brew 安装 node,报错:Warning: node-0.10.35 already installed, it's just not linked
请问该怎么操作呢?

恒温 #19 · 2014年12月31日 Author

#18 楼 @xiyue 需要删除干净,另外不要用 sudo 安装任何 appium 的东西。

我卸载的命令有错误吗?一直提示我 node 已经安装,查看 node 版本时,又说 node 不存在。不知道还有哪里没有删除干净。

楼主,我这卡死在 npm install -g appium 了,有没有最新的 Registry?上面那个 404 了,感谢

恒温 #13 · 2015年10月14日 Author

#21 楼 @lbwlh 你搜索下呗。资料总会过期的。

@lihuazhang 请教一个启动 iOS simulator 的问题(appium 为当前最新版本,xcode7):

代码如下(直接从某处拿的 demo)

import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;


public class apdemo {
    public static void main(String[] args){

        DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
        desiredCapabilities.setCapability("platformName","iOS");
        desiredCapabilities.setCapability("deviceName", "iPhone Simulator");
        desiredCapabilities.setCapability("platformVersion", "9.0"); 
        desiredCapabilities.setCapability("browserName", "safari");
        URL url = null;
        try {
            url = new URL("http://127.0.0.1:4723/wd/hub");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        WebDriver remoteWebDriver = new RemoteWebDriver(url,desiredCapabilities);
        remoteWebDriver.get("http://www.google.com");
        WebElement ele = remoteWebDriver.findElement(By.name("q"));
        ele.click();
        ele.sendKeys("Packt Publishing");
        WebElement searchButton = remoteWebDriver.findElement(By.name("btnG"));
        System.out.println(searchButton.getSize());
        searchButton.click();
        remoteWebDriver.quit();
    }
}

错误信息如下:

info: [debug] Responding to client with error: {"status":33,"value":{"message":"A new session could not be created. (Original error: Could not find a device to launch. You requested 'iPhone (9.0 Simulator)', but the available devices were: [\"iPad 2 (8.4) [DA17B207-15F0-4EC8-92C6-6C2AB01E1DD1]\",\"iPad 2 (9.0) [7CB77955-BDF2-4848-8C12-6C828C3B9062]\",\"iPad Air (8.4) [B599C66B-3978-483F-9179-C381E43B72E1]\",\"iPad Air (9.0) [F044398E-84FB-4D9B-BC13-9B899BDCC3FA]\",\

iOS setting On appium 大致为:

设置了 app path 和 force device ,以及 platform 手动填入了 9.0

不明白为何会出现这个错误,我尝试用 xcode 界面启动了或不启动相应 demo,仍然有问题
由于个人对 ios 开发环境不了解(当下没时间优先准备这类知识),看了 demo 代码和 appium 很多资料,但是没有详细到任何人都能直接操作的地步,那么能否详细对一个菜鸟进行清晰的讲解呢?
不胜感激!

恒温 #11 · 2015年10月17日 Author

#23 楼 @32191163 比对下, You requested 'iPhone (9.0 Simulator)', but the available devices were: [\"iPad 2 (8.4) [DA17B207-15F0-4EC8-92C6-6C2AB01E1DD1]\",\"iPad 2 (9.0) [7CB77955-BDF2-4848-8C12-6C828C3B9062]\",\"iPad Air (8.4) [B599C66B-3978-483F-9179-C381E43B72E1]\",\"iPad Air (9.0) [F044398E-84FB-4D9B-BC13-9B899BDCC3FA]\",\

你的 deviceName 错了。

恒温 #10 · 2015年10月18日 Author

#23 楼 @32191163 光写 9.0 是不够的。

#25 楼 @lihuazhang 我有尝试修改"deviceName","iPhone 6"; 但是仍然为相同报错;
另外 “光写 9.0” 是不够的,是指什么意思呢

#26 楼 @32191163 看下 appium 源码对于设备名字的拼接。

#27 楼 @lihuazhang 看了 appium-client-jar 和 类似的一篇http://blog.csdn.net/achang21/article/details/43531251iOS.js 文件的字段定义才可以呢?,是否我也需要修改 从 appium server 的报错信息看到,我请求的是模拟器,都是返回中都没有 simulator 那个拼接字。

#28 楼 @32191163 自己做一个模拟器出来,名字一致就可以了。

我也要开始 ios 了,没接触过这个东西,一直跟 Android 打交道,谢谢楼主分享,希望一切顺利

@Lihuazhang 我也遇到这个问题了:::应该是 iPhone 5 (8.4),但是现在是 iPhone (8.4 Simulator) 这种样式的,请问该怎么解决啊

请问,我的环境是:macOS10.12.4,appium 版本是:1.6.4,Xcode 版本是:8.3.2,启动 appium,运行 Python 脚本,提示:
求大神指教,谢谢!

dabao 回复

# 打开模拟器

xcrun simctl boot xxx

# 延时 10 秒
sleep 10

# 在这个模拟器安装路径下的 APP

xcrun simctl install xxx $ 应用路径.app

# 关闭模拟器
#xcrun simctl shutdown xxx

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册