我想在我的Android设备上自动化Facebook应用程序。
我试图像这样启动一个驱动程序:
private AppiumDriver driver;
@Before
public void setUp() throws Exception {
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "../../../data/app/ ");
File app = new File(appDir, "Facebook.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("platformName","Android");
capabilities.setCapability("app", app.getAbsolutePath());
// capabilities.setCapability("appPackage", "com.example.android.apis");
// capabilities.setCapability("appActivity", ".ApiDemos");
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}
我得到了:
info: --> POST /wd/hub/session {"desiredCapabilities":{"app":"/Users/eladb/WorkspaceQa/myAppiumExm/../../../data/app/ /Facebook.apk","platformVersion":"4.4","browserName":"","platformName":"Android","deviceName":"Android Emulator"}}
info: Client User-Agent string: Apache-HttpClient/4.3.4 (java 1.5)
error: Failed to start an Appium session, err was: Error: Bad app: /Users/data/app/ /Facebook.apk. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: Error locating the app: ENOENT, stat '/Users/data/app/ /Facebook.apk'
info: [debug] No appActivity desired capability or server param. Parsing from apk.
info: [debug] No appPackage desired capability or server param. Parsing from apk.
info: [debug] Using local app from desired caps: /Users/data/app/ /Facebook.apk
info: [debug] Got configuration error, not starting session
info: [debug] Cleaning up appium session
info: [debug] Error: Bad app: /Users/data/app/ /Facebook.apk. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: Error locating the app: ENOENT, stat '/Users/data/app/ /Facebook.apk'
at null.<anonymous> (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/devices/android/android-common.js:56:13)
at /Applications/Appium.app/Contents/Resources/node_modules/appium/lib/devices/device.js:81:16
at FSReqWrap.oncomplete (fs.js:99:15)
info: [debug] Responding to client with error: {"status":33,"value":{"message":"A new session could not be created. (Original error: Bad app: /Users/data/app/ /Facebook.apk. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: Error locating the app: ENOENT, stat '/Users/data/app/ /Facebook.apk')","origValue":"Bad app: /Users/data/app/ /Facebook.apk. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: Error locating the app: ENOENT, stat '/Users/data/app/ /Facebook.apk'"},"sessionId":null}
info: <-- POST /wd/hub/session 500 8.318 ms - 628
我试过了:
capabilities.setCapability("app", "Facebook.apk");
我得到了:
error: Failed to start an Appium session, err was: Error: Bad app: null. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: You passed in an app package as the 'app' capability, but didn't include appActivity. We need to know that too in order to start your app
info: [debug] No appActivity desired capability or server param. Parsing from apk.
info: [debug] No appPackage desired capability or server param. Parsing from apk.
info: [debug] Got configuration error, not starting session
info: [debug] Cleaning up appium session
info: [debug] Error: Bad app: null. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: You passed in an app package as the 'app' capability, but didn't include appActivity. We need to know that too in order to start your app
at null.<anonymous> (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/devices/android/android-common.js:56:13)
at androidCommon.configureApp (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/devices/android/android-common.js:69:14)
at androidCommon.configure (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/devices/android/android-common.js:37:10)
at Appium.configure (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/appium.js:250:15)
at null.<anonymous> (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/appium.js:118:10)
at Appium.start (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/appium.js:129:5)
at Object.exports.createSession [as handle] (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/server/controller.js:182:16)
at next_layer (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/router/route.js:113:13)
at Route.dispatch (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/router/route.js:117:5)
at /Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/router/index.js:222:24
info: [debug] Responding to client with error: {"status":33,"value":{"message":"A new session could not be created. (Original error: Bad app: null. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: You passed in an app package as the 'app' capability, but didn't include appActivity. We need to know that too in order to start your app)","origValue":"Bad app: null. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: You passed in an app package as the 'app' capability, but didn't include appActivity. We need to know that too in order to start your app"},"sessionId":null}
info: <-- POST /wd/hub/session 500 9.616 ms - 712
error: Unexpected error: Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
at ServerResponse.res.set.res.header (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/response.js:561:10)
at ServerResponse.res.send (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/response.js:133:12)
at ServerResponse.res.json (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/response.js:210:15)
at ServerResponse.res.send (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/response.js:121:21)
at /Applications/Appium.app/Contents/Resources/node_modules/appium/lib/server/helpers.js:42:9
at safely (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/server/helpers.js:306:5)
at Layer.module.exports.catchAllHandler [as handle] (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/server/helpers.js:41:3)
at trim_prefix (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/router/index.js:261:17)
at /Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/express/lib/router/index.js:225:9 context: [POST /wd/hub/session {"desiredCapabilities":{"app":"Facebook.apk","platformVersion":"4.4","browserName":"","platformName":"Android","deviceName":"Android Emulator"}}]
TypeError: Cannot set property 'onResetTimeout' of null
at Appium.configure (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/appium.js:252:30)
at null.<anonymous> (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/appium.js:118:10)
at Appium.start (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/appium.js:129:5)
我怎样才能让它发挥作用?
更新
我试过了:
@Before
public void setUp() throws Exception {
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "../../../data/app/");
File app = new File(appDir, "Facebook.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("platformName","Android");
capabilities.setCapability("app", app.getCanonicalPath());
// capabilities.setCapability("appPackage", "com.example.android.apis");
// capabilities.setCapability("appActivity", ".ApiDemos");
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
得到了:
org.openqa.selenium.SessionNotCreatedException: A new session could not be created. (Original error: Bad app: /Users/data/app/Facebook.apk. App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name. cause: Error: Error locating the app: ENOENT, stat '/Users/data/app/Facebook.apk') (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 900 milliseconds
Build info: version: '2.43.1', revision: '5163bceef1bc36d43f3dc0b83c88998168a363a0', time: '2014-09-10 09:43:55'
System info: host: 'eladb-macbookpro.roam.corp.google.com', ip: '10.0.0.2', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.5', java.version: '1.8.0_25'
答案 0 :(得分:1)
我现在无法验证它,但我的猜测是你有一个空白区域产生一些问题:
1. private AppiumDriver driver;
2.
3. @Before
4. public void setUp() throws Exception {
5. File classpathRoot = new File(System.getProperty("user.dir"));
6. File appDir = new File(classpathRoot, "../../../data/app/ "); // <== HERE
7. File app = new File(appDir, "Facebook.apk");
8. ...
Appium日志告诉您生成的路径是:
"app":"/Users/eladb/WorkspaceQa/myAppiumExm/../../../data/app/ /Facebook.apk"
"app/ "
第6行中的空格导致最终路径为"/Users/eladb/WorkspaceQa/myAppiumExm/../../../data/app/ /Facebook.apk"
。我会像这样重写第6行:
File appDir = new File(classpathRoot, "../../../data/app/");
而不是"app/ "
,请使用"...app/"
我还没有使用Java一段时间,所以我不记得IO API是如何工作的,但是你应该找到一种更好的方法来获取appfile的绝对路径,因为你有一个使用它的最终地址父文件夹模式../
来访问资源......这不是最好的。最终的路径应该是:
"app":"/Users/data/app/Facebook.apk"
我是对的吗?在this answer中,您可以看到可能应该使用getCanonicalPath
而不是getAbsolutePath
。
如果我的猜测正确,则以下代码应该有效:
public void setUp() throws Exception {
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "../../../data/app/");
File app = new File(appDir, "Facebook.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("platformName","Android");
capabilities.setCapability("app", app.getCanonicalPath());
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}
看起来您可能想要自动化现有应用,Android的功能集如下:
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("platformName","Android");
capabilities.setCapability("appPackage", "<java-package-name-of-the-app>");
capabilities.setCapability("appActivity", "<android-app-activity-name>");
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}
如果您检查设置,可以在您应用的媒体资源中找到这些新功能:appPackage
和appActivity
。
答案 1 :(得分:0)
我什么都没做,只是清理了Mac中的空间,它起作用了。!