iOS 使用 Appium 进行网络测试
iOS Web Testing w/ Appium
- 我使用的是真实设备
- 我正在尝试基于网络的测试
- 我有一个完全可用的 TestNG 套件 Android
我不知道如何在 iOS 上执行相同的测试。
我得到的错误是:
org.openqa.selenium.SessionNotCreatedException: A new session could not be created. (Original error: Command failed: /bin/sh -c ideviceinstaller -u A7BD67F34FA1B94651C832041B4DEE720DC2CBC1 -i /var/folders/0x/z8gpmw7923d8gw9k14rdj0gh3qx1yt/T/115105-3319-10zvjv1/SafariLauncher.app
No iOS device found, is it plugged in?)
我使用 appium --nodeconfig /path/to/config.json -p 4623 --safari
和 JSON 配置启动我的 selenium 网格节点:
{
"capabilities":
[
{
"browserName":"Safari",
"deviceName": "iPod 5",
"udid":"A7BD67F34FA1B94651C832041B4DEE720DC2CBC1",
"version":"8.4.1",
"maxInstances": 5,
"platform":"MAC",
"platformName": "iOS"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":10000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://0.0.0.0:4623/wd/hub",
"maxSession": 5,
"port": 4623,
"host": "0.0.0.0",
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
我的 java 创建 IOSDriver 是:
public static IOSDriver getIOSDriver(String udid) throws MalformedURLException{
String SELENIUM_HUB_URL = "http://localhost:4444/wd/hub";
ThreadLocal<IOSDriver> driver = null;
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "iPod 5");
capabilities.setCapability("udid", udid);
capabilities.setPlatform(Platform.MAC);
capabilities.setCapability("verison", "8.4.1");
capabilities.setCapability("platfromName", "iOS");
capabilities.setCapability("browserName", "Safari");
try {
driver = new ThreadLocal<IOSDriver>();
driver.set(new IOSDriver(new URL(SELENIUM_HUB_URL),
capabilities));
} catch (MalformedURLException e) {
System.out.println("Tackle Issue with RemoteDriverSetup");
}
driver.get().manage().timeouts()
.pageLoadTimeout(20L, TimeUnit.SECONDS);
driver.get().manage().timeouts()
.implicitlyWait(20L, TimeUnit.SECONDS);
return driver.get();
}
澄清一下,设备 已插入 ,safariLauncher 已从 xCode 部署,可以找到该设备。
我是不是漏掉了一些基本的东西?
感谢您的帮助,
利亚姆
您无需提供捆绑 ID-
capabilities.setCapability("bundleID", "com.safariLauncher.safariLauncher");
Safari 启动器在设备中自动启动,然后重定向到真实设备中的本机 Safari 应用程序。此外,您不需要从 xcode 构建 safari 启动器。 Safari 启动器与 appium 设置本身打包在一起(您需要 apple dev 证书并将其作为参数提供给 reset.sh 脚本)。Appium 文档解释了执行此操作的所有步骤。我建议您阅读 appium 文档。
所以我找到了解决这个问题的方法。 iTunes 为设备提供的设备 UDID 为 A7BD67F34FA1B94651C832041B4DEE720DC2CBC1
:
但是 xCode UDID 是 a7bd67f34fa1b94651c832041b4dee720dc2cbc1
(相同但全部小写):
问题已通过使用 xCode 版本的 UDID 解决。这是在 xCode 中使用 ctrl+shift+2
找到的。
因此功能如下所示:
{
"capabilities":
[
{
"browserName":"Safari",
"deviceName": "iPod 5",
"udid":"a7bd67f34fa1b94651c832041b4dee720dc2cbc1",
"version":"8.4.1",
"maxInstances": 5,
"platform":"MAC",
"platformName": "iOS"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":10000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://0.0.0.0:4623/wd/hub",
"maxSession": 5,
"port": 4623,
"host": "0.0.0.0",
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
}
而 testNG.xml 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="tests" thread-count="2">
<test name="Nexus 7">
<parameter name="udid" value="08da76c1" />
<classes>
<class name="testNG.TestOne"/>
</classes>
</test> <!-- Test -->
<test name="HTC desrire">
<parameter name="udid" value="SH48CWT00563" />
<classes>
<class name="testNG.TestOne"/>
</classes>
</test> <!-- Test -->
<test name="iPod Touch">
<parameter name="udid" value="a7bd67f34fa1b94651c832041b4dee720dc2cbc1" />
<classes>
<class name="testNG.TestTwo"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
我觉得这很奇怪,但它似乎有效。
利亚姆
- 我使用的是真实设备
- 我正在尝试基于网络的测试
- 我有一个完全可用的 TestNG 套件 Android
我不知道如何在 iOS 上执行相同的测试。
我得到的错误是:
org.openqa.selenium.SessionNotCreatedException: A new session could not be created. (Original error: Command failed: /bin/sh -c ideviceinstaller -u A7BD67F34FA1B94651C832041B4DEE720DC2CBC1 -i /var/folders/0x/z8gpmw7923d8gw9k14rdj0gh3qx1yt/T/115105-3319-10zvjv1/SafariLauncher.app
No iOS device found, is it plugged in?)
我使用 appium --nodeconfig /path/to/config.json -p 4623 --safari
和 JSON 配置启动我的 selenium 网格节点:
{
"capabilities":
[
{
"browserName":"Safari",
"deviceName": "iPod 5",
"udid":"A7BD67F34FA1B94651C832041B4DEE720DC2CBC1",
"version":"8.4.1",
"maxInstances": 5,
"platform":"MAC",
"platformName": "iOS"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":10000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://0.0.0.0:4623/wd/hub",
"maxSession": 5,
"port": 4623,
"host": "0.0.0.0",
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
我的 java 创建 IOSDriver 是:
public static IOSDriver getIOSDriver(String udid) throws MalformedURLException{
String SELENIUM_HUB_URL = "http://localhost:4444/wd/hub";
ThreadLocal<IOSDriver> driver = null;
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "iPod 5");
capabilities.setCapability("udid", udid);
capabilities.setPlatform(Platform.MAC);
capabilities.setCapability("verison", "8.4.1");
capabilities.setCapability("platfromName", "iOS");
capabilities.setCapability("browserName", "Safari");
try {
driver = new ThreadLocal<IOSDriver>();
driver.set(new IOSDriver(new URL(SELENIUM_HUB_URL),
capabilities));
} catch (MalformedURLException e) {
System.out.println("Tackle Issue with RemoteDriverSetup");
}
driver.get().manage().timeouts()
.pageLoadTimeout(20L, TimeUnit.SECONDS);
driver.get().manage().timeouts()
.implicitlyWait(20L, TimeUnit.SECONDS);
return driver.get();
}
澄清一下,设备 已插入 ,safariLauncher 已从 xCode 部署,可以找到该设备。
我是不是漏掉了一些基本的东西?
感谢您的帮助,
利亚姆
您无需提供捆绑 ID- capabilities.setCapability("bundleID", "com.safariLauncher.safariLauncher");
Safari 启动器在设备中自动启动,然后重定向到真实设备中的本机 Safari 应用程序。此外,您不需要从 xcode 构建 safari 启动器。 Safari 启动器与 appium 设置本身打包在一起(您需要 apple dev 证书并将其作为参数提供给 reset.sh 脚本)。Appium 文档解释了执行此操作的所有步骤。我建议您阅读 appium 文档。
所以我找到了解决这个问题的方法。 iTunes 为设备提供的设备 UDID 为 A7BD67F34FA1B94651C832041B4DEE720DC2CBC1
:
但是 xCode UDID 是 a7bd67f34fa1b94651c832041b4dee720dc2cbc1
(相同但全部小写):
问题已通过使用 xCode 版本的 UDID 解决。这是在 xCode 中使用 ctrl+shift+2
找到的。
因此功能如下所示:
{
"capabilities":
[
{
"browserName":"Safari",
"deviceName": "iPod 5",
"udid":"a7bd67f34fa1b94651c832041b4dee720dc2cbc1",
"version":"8.4.1",
"maxInstances": 5,
"platform":"MAC",
"platformName": "iOS"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":10000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://0.0.0.0:4623/wd/hub",
"maxSession": 5,
"port": 4623,
"host": "0.0.0.0",
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
}
而 testNG.xml 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="tests" thread-count="2">
<test name="Nexus 7">
<parameter name="udid" value="08da76c1" />
<classes>
<class name="testNG.TestOne"/>
</classes>
</test> <!-- Test -->
<test name="HTC desrire">
<parameter name="udid" value="SH48CWT00563" />
<classes>
<class name="testNG.TestOne"/>
</classes>
</test> <!-- Test -->
<test name="iPod Touch">
<parameter name="udid" value="a7bd67f34fa1b94651c832041b4dee720dc2cbc1" />
<classes>
<class name="testNG.TestTwo"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
我觉得这很奇怪,但它似乎有效。
利亚姆