使用 Appium 测试 Android 应用程序时无法创建新的远程会话
Posted
技术标签:
【中文标题】使用 Appium 测试 Android 应用程序时无法创建新的远程会话【英文标题】:Unable to create new remote session while testing an Android application with Appium 【发布时间】:2017-06-08 07:57:12 【问题描述】:我正在尝试在带有 Appium 的 Eclipse 中运行使用 java 编码的测试脚本示例。我通过 npm 运行 Appium(我使用的是 Appium 1.6.3,我对 Appium 并不陌生,我之前在 Mac 和 Windows 上运行它没有任何问题,但这次在 Ubuntu 中它看起来有点不同,而不是使用 appium应用程序,但带有控制台)
appium --address 127.0.0.1
我正在使用
java-client-4.1.2.jar selenium-java-3.0.1.jar selenium-server-standalone-3.0.1.jar testng-6.9.10.jar我的java类是:
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
public class FirstTest
AndroidDriver<AndroidElement> driver;
File path = new File("/home/emna/Téléchargements/AutomationFiles/app-release.apk");
@BeforeClass
public void setUp() throws MalformedURLException
System.out.println("app Dir.--->" + path);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "SM-G360H");
capabilities.setCapability("version", "4.4.4");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "platform");
capabilities.setCapability("udid", "***************");
capabilities.setCapability("app", path.getAbsolutePath());
capabilities.setCapability("appPackage", "com.bulldozer.gaa");
capabilities.setCapability("appActivity",
"com.bulldozer.gaa.activities.MainActivity");
driver = new AndroidDriver<AndroidElement>(new URL("http://127.0.0.1:4723/wd/hub"),
capabilities);
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
@Test
public void Test1() throws InterruptedException
// driver.wait(10000);
System.out.println("GAA");
driver.findElement(By.id("acceptCheckbox")).click();
driver.findElement(By.id("continueBtn")).click();
@AfterClass
public void tearDown()
driver.quit();
但问题是:
[TestNG] Running:
/tmp/testng-eclipse--2049046107/testng-customsuite.xml
app Dir.--->/home/emna/Téléchargements/AutomationFiles/app-release.apk
Jan 24, 2017 1:14:44 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Attempting bi-dialect session, assuming Postel's Law holds true on the remote end
Jan 24, 2017 1:14:59 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Falling back to original OSS JSON Wire Protocol.
Jan 24, 2017 1:15:10 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Falling back to straight W3C remote end connection
FAILED CONFIGURATION: @BeforeClass setUp
org.openqa.selenium.SessionNotCreatedException: Unable to create new remote session. desired capabilities = Capabilities [app=/home/emna/Téléchargements/AutomationFiles/app-release.apk, appPackage=com.bulldozer.gaa, appActivity=com.bulldozer.gaa.activities.MainActivity, platformVersion=platform, platformName=Android, udid=*************, deviceName=SM-G360H, version=4.4.4], required capabilities = Capabilities []
Build info: version: '3.0.1', revision: '1969d75', time: '2016-10-18 09:48:19 -0700'
System info: host: 'tarek-Vostro-3902', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-59-generic', java.version: '1.8.0_91'
Driver info: driver.version: AndroidDriver
at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:91)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:141)
at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:69)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:40)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
这里是 Appium 日志文件:
[debug] [ADB] Running '/home/emna/Android/Sdk/platform-tools/adb' with args: ["-P",5037,"-s","***************","shell","am","force-stop","io.appium.unlock"]
[debug] [Logcat] Stopping logcat capture
[debug] [AndroidDriver] Not cleaning generated files. Add `clearSystemFiles` capability if wanted.
[MJSONWP] Encountered internal error running command: Error: Error occured while starting App. Original error: Permission to start activity denied.
at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
at ADB.callee$0$0$ (../../../lib/tools/apk-utils.js:80:9)
at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
at process._tickCallback (internal/process/next_tick.js:103:7)
[HTTP] <-- POST /wd/hub/session 500 11015 ms - 223
[HTTP] --> POST /wd/hub/session "capabilities":"desiredCapabilities":"app":"/home/emna/Téléchargements/AutomationFiles/app-release.apk","appPackage":"com.bulldozer.gaa","appActivity":"com.bulldozer.gaa.activities.MainActivity","platformVersion":"platform","platformName":"Android","udid":"************","deviceName":"SM-G360H","version":"4.4.4","requiredCapabilities":
[debug] [MJSONWP] Bad parameters: BadParametersError: Parameters were incorrect. We wanted "required":["desiredCapabilities"],"optional":["requiredCapabilities","capabilities","sessionId","id","sessionId","id","sessionId","id"] and you sent ["capabilities"]
[HTTP] <-- POST /wd/hub/session 400 5 ms - 205
【问题讨论】:
【参考方案1】:您忘记了最重要的功能,即 .apk 的路径:
capabilities.setCapability("app", "appPath");
另外,我建议从 RemoteWebDriver 更改为 Android 驱动程序,因为您将拥有更多功能:
driver = new AndroidDriver(....)
ps:您可以将 java-client 更新到 4.1.2 并将 testng 更新到 6.9.10
【讨论】:
谢谢@David,我会试试的。但是当我使用真实设备并且应用程序安装在那里时,不需要应用程序路径。不是吗? appPath 始终是必需的! 仍然有同样的错误:配置失败:@BeforeClass setUp org.openqa.selenium.SessionNotCreatedException:无法创建新的远程会话。所需的功能 = 功能 [app=/home/emna/Téléchargements/AutomationFiles/app-release.apk, appPackage=com.bulldozer.gaa, appActivity=com.bulldozer.gaa.activities.MainActivity, platformVersion=platform, platformName=Android , udid=*********, deviceName=SM-G360H, version=4.4.4], required capabilities = Capabilities [] Build info: version: '3.0.1', revision: '1969d75 ',时间:'2016-10-18 09:48:19 -0700' 你可以在没有--address的情况下启动appium并重试吗? 好的,我刚刚在使用您第一次提出的建议后更新了我的问题【参考方案2】:原因是您的 Appium 已经在使用 GUI 设置运行该应用程序。
同时,您正尝试从您的代码中再次运行它。
应该有什么帮助:在 Appium UI 中转到 Android 设置(基本)
应用程序面板:不要定义/启动应用程序及其活动。
功能面板:定义并选择平台名称、自动化名称、平台版本
【讨论】:
我没有使用 appium 应用程序,我只使用 npm 运行 appium,我应该更新我在控制台中点击的命令appium --address 127.0.0.1
中的任何内容吗?我正在使用 ubuntu
先尝试杀死所有appium进程。自行运行模拟器。这就是 Appium 在我的情况下的工作方式,与我的帖子 Launching Appium with command: '/Applications/Appium.app/Contents/Resources/node/bin/node' appium/build/lib/main.js --debug-log-spacing --automation-name "Appium" --platform-name "Android" --platform-version "6.0" --device-name "emulator-5554"
相关然后,应该检测到模拟器“emulator-5554”
我用的是真机而不是模拟器【参考方案3】:
问题在于 apk 文件本身,我使用了另一个 .apk file
与我使用的相同配置,它工作正常!
【讨论】:
【参考方案4】:这可能是个问题,因为据我了解,您在客户端脚本所在的同一台机器上运行 Appium,请尝试改用“http://127.0.1.1:4723/wd/hub”。这个解决方案对我有用
AndroidDriver<AndroidElement> driver = null;
driver = new AndroidDriver<>(new URL("http://127.0.1.1:4723/wd/hub"), capabilities);
【讨论】:
以上是关于使用 Appium 测试 Android 应用程序时无法创建新的远程会话的主要内容,如果未能解决你的问题,请参考以下文章
在 Appium 中使用 UIAutomatorviewer 测试 Android 应用程序时出错
如何在 Ubuntu 中使用 Appium 进行 Android 单元测试
Appium + java 实现Android app自动化测试