如何在iOS上使用appium查找应用程序版本

时间:2018-05-18 09:16:31

标签: java ios automated-tests appium

当我启动测试时,我需要大量的调试信息:使用的设备,操作系统和测试的应用程序版本。

我的问题是关于该应用的版本。

在Android上,我使用:

String line = "adb -s " + udid + " shell dumpsys package"; Runtime.getRuntime().exec(line);

之后,搜索包名称然后搜索versionName很容易。

但是如何在iOS上找到相同的信息?我没有找到任何有app信息的文档。 (显然,adb与iphone不兼容)

3 个答案:

答案 0 :(得分:0)

你可以试试这个。如果你正在使用* .app你可以试试这个命令:

  

或ipa" IPA / payload / NAME.app / Info.plist"

String line = "/usr/libexec/PlistBuddy -c print Downloads/Payload/NAME.app/Info.plist | grep CFBundleVersion"
Runtime.getRuntime().exec(line);

答案 1 :(得分:0)

TL; DR 查看this article以获得摘要。


对于iOS,您可以使用以下选项:

  1. 使用命令行工具,例如Mac上的defaults或Linux上的plistutil,然后使用ProcessBuilder从Java代码中调用它。
  2. 使用dd-plist Java库
  3. 使用justtestlah Java库(包装dd-plist和Android应用程序的类似库)免责声明:我是此工具的作者。

简而言之,如果您只需要iOS,我建议选项2,如果您想要Android和iOS的相同方法,我建议选项3。

广告1。

这取决于平台,因此并不理想(IMO)。如果您只针对一个平台来执行测试,或者不介意维护多个平台,也不介意安装其他工具,则效果很好。

这些是用于检索版本信息的命令。同样,您也可以从应用程序包中查询其他元数据。

Mac OS:

defaults read /path/test.app/Info CFBundleShortVersionString
defaults read /path/test.app/Info CFBundleVersion

Linux:

plistutil -i /path/test.app/Info | xmllint --xpath "//key[text()='CFBundleShortVersionString']/following-sibling::string[1]/text()" -
plistutil -i /path/test.app/Info | xmllint --xpath "//key[text()='CFBundleVersion']/following-sibling::string[1]/text()" -

这种方法对于在Shell脚本(例如在CI管道中)中使用可能最有用。

将其集成到Java程序中将如下所示(请注意,如果决定使用此功能,则可能需要添加一些其他错误处理):

String versionName = executeCommand("defaults read /path/test.app/Info CFBundleShortVersionString");

public String executeCommand(String command) {
    LOG.info("Executing command {}", command);
    String[] shellCommand = {"/bin/sh", "-c", command};
    Process process;
    try {
      process = new ProcessBuilder(shellCommand).start();
      return Stream.of(process.getErrorStream(), process.getInputStream())
          .parallel()
          .map(
              (InputStream inputStream) -> {
                try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
                  return br.readLine(); // we only care about the first line
                } catch (IOException e) {
                  throw new RuntimeException(e);
                }
              })
          .collect(Collectors.joining());
    } catch (IOException exception) {
      LOG.error(String.format("Error while executing command %s", command), exception);
    }
    return "";
  }

我为此here做了一个PoC。虽然这可以正常工作,并且具有不需要任何其他Java库的优点,但我还是建议使用其他选项之一。

广告2。

将dd-list JAR文件添加到您的类路径中。例如,对于Maven:

<properties>
  <dd.plist.version>1.21</dd.plist.version>
</properties>

<dependencies>
  <dependency>
    <groupId>com.googlecode.plist</groupId>
    <artifactId>dd-plist</artifactId>
    <version>${dd.plist.version}</version>
  </dependency>
</depdencies>

然后,运行如下代码:

String appPath = "/path/test.app";
NSDictionary dictionary = (NSDictionary) PropertyListParser.parse(path);
String versionName = dictionary.objectForKey(“CFBundleShortVersionString”).toString();
String versionCode = dictionary.objectForKey(“CFBundleVersion”).toString();

广告3。

justtestlah-mobile-tools JAR文件添加到您的类路径中。对于Maven:

<properties>
  <justtestlah.version>1.3.2</justtestlah.version>
</properties>
<dependencies>
  <dependency>
    <groupId>io.github.martinschneider</groupId>
    <artifactId>justtestlah-mobile-tools</artifactId>
    <version>${justtestlah.version}</version>
  </dependency>
</depdencies>

然后运行如下代码:

ApplicationInfo appInfo = new ApplicationInfoService().getAppInfo(appPath);
String versionName = appInfo.getVersionName();
String versionCode = appInfo.getVersionCode();
String applicationName = appInfo.getApplicationName();

最后一个附加的好处是您可以对APK,APP甚至IPA文件使用相同的代码。

答案 2 :(得分:0)

我想您可以使用此命令获取应用程序版本:

ideviceinstaller -l | grep appBundleId

但是你需要首先使用这个命令安装 ideviceinstaller:

brew install --HEAD ideviceinstaller