appium基础-3 Capability配置与启动App

本文介绍了Appium的基础知识,包括Appium在设备上的守护应用、webdriber模块的区别以及desired capabilities的概念。重点讲解了如何配置和启动Appium session,包括平台、版本、设备名等常见capability的设置,并提供了启用夜神模拟器进行测试的参数示例。此外,还提到了通过Desired Capabilities和JSON Representation设置键值对的方法。

知识点

1、首次启动Appium会在设备上安装2个守护app,Appium Settings和Unlock 部分设备系统由于权限的问题(如:三星S6 edge+)需要用户手动确认安装,否则不安装守护App会导致脚本运行失败,安装好后不要随意卸载这两个App。
• Unlock :用于解锁手机弹窗提示
• Appium Setting:Appium守护app
2、from appium import webdriver 中的webdriber模块和selenium中的webdriver模块不一样!

Capability-session

desired capability的功能是配置Appium会话。是一组设置的键值对的集合,其中键对应设置的名称,而值对应设置的值。(如:“platformName”: “Android”)Desired Capabilities主要用于通知Appium服务器建立需要的Session。

  • Session:Appium的客户端和服务端之间进行通信都必须在一个Session的上下文中进行。
    1、客户端在发起通信的时候首先会发送一个叫作“Desired Capabilities”的JSON对象给服务器。
    2、服务器收到该数据后,会创建一个session并将session的ID返回到客户端。
    3、之后客户端可以用该session的ID发送后续的命令。

Capability常见配置

主要分成了三部分:公共部分、ios部分、android部分。标红为常用键值。

  • 公用Capability
    在这里插入图片描述
    在这里插入图片描述
  • android Capability
    在这里插入图片描述
  • IOS Capability![
    在这里插入图片描述

Capability启动App演示

1、运行appium-desktop-Setup-1.5.0-ia32
2、配置appium,点击【启动】,根据实际环境可以通过【Adanced】进行相关配置
在这里插入图片描述
3、配置session
在这里插入图片描述
在这里插入图片描述• Automatic Server 本地AppiumServer服务
• Custom Server:例如,如果要针对运行在网络中另一台计算机上的Appium服务器启动Inspector会话,这很有用。
• Sauce Labs:如果您无法访问机器上的iOS模拟器,则可以利用Sauce Labs帐户在云中启动Appium会话。
• TestObject:您还可以利用TestObject的真实设备云来进行真机测试。
• headspin:使用远程设备来创建会话。

4、desired capability参数Josin
{
“platformName”: “Android”,
“platformVersion”: “4.4.2”,
“deviceName”: “127.0.0.1:62001”,
“appPackage”: “com.tal.kaoyan”,
“appActivity”: “com.tal.kaoyan.ui.activity.SplashActivity”,
“noReset”: true
}
【说明】启用夜神模拟器,查看相关配置参数

  • 通过【设置】-【关于平板电脑】查看对应版本
    “platformName”: “Android”,
    “platformVersion”: “4.4.2”,
  • cmd运行,查看设备名称 adb devices,得到相应设备名称,如下:
    在这里插入图片描述
    “deviceName”: “127.0.0.1:62001”,
  • 通过aapt命令得到Package、Activity名
    在这里插入图片描述
    “appPackage”: “com.tal.kaoyan”,
    “appActivity”: “com.tal.kaoyan.ui.activity.SplashActivity”,
  • “noReset”: true 当前session下不会重置应用状态,默认False。
    5、设置键值对有两种方法:
    • 通过【Desired Capabilities】左侧,一 一对应设置键值对
    • 通过【JSON Representation】编辑脚本,点击【保存】,自动同步至左侧键值对
      在这里插入图片描述
      6、点击【Start Session】
      在这里插入图片描述
[info] [Appium] Welcome to Appium v1.20.2 [info] [Appium] Non-default server args: [info] [Appium] relaxedSecurityEnabled: true [info] [Appium] allowInsecure: { [info] [Appium] } [info] [Appium] denyInsecure: { [info] [Appium] } [info] [Appium] Appium REST http interface listener started on 0.0.0.0:4723[info] [HTTP] --> GET /wd/hub/sessions [info] [HTTP] {} [debug] [GENERIC] Calling AppiumDriver.getSessions() with args: [] [debug] [GENERIC] Responding to client with driver.getSessions() result: [] [info] [HTTP] <-- GET /wd/hub/sessions 200 5 ms - 40 [info] [HTTP] [info] [HTTP] --> POST /wd/hub/session [info] [HTTP] {"desiredCapabilities":{"platformName\"":"Android","newCommandTimeout":0,"connectHardwareKeyboard":true}} [debug] [MJSONWP] Calling AppiumDriver.createSession() with args: [{"platformName\"":"Android","newCommandTimeout":0,"connectHardwareKeyboard":true},null,null] [debug] [BaseDriver] Event &#39;newSessionRequested&#39; logged at 1750921438941 (15:03:58 GMT+0800 (中国标准时间)) [debug] [BaseDriver] Event &#39;newSessionStarted&#39; logged at 1750921438942 (15:03:58 GMT+0800 (中国标准时间)) [debug] [MJSONWP] Encountered internal error running command: Error: You must include a platformName capability [debug] [MJSONWP] at AppiumDriver.getDriverAndVersionForCaps (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\lib\appium.js:216:13) [debug] [MJSONWP] at AppiumDriver.createSession (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\lib\appium.js:324:66) [debug] [MJSONWP] at commandExecutor (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-base-driver\lib\basedriver\driver.js:334:9) [debug] [MJSONWP] at AppiumDriver.executeCommand (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-base-driver\lib\basedriver\driver.js:348:15) [debug] [MJSONWP] at AppiumDriver.executeCommand (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\lib\appium.js:533:26) [debug] [MJSONWP] at asyncHandler (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-base-driver\lib\protocol\protocol.js:297:34) [debug] [MJSONWP] at D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-base-driver\lib\protocol\protocol.js:423:15 [debug] [MJSONWP] at Layer.handle [as handle_request] (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\layer.js:95:5) [debug] [MJSONWP] at next (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\route.js:137:13) [debug] [MJSONWP] at Route.dispatch (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\route.js:112:3) [debug] [MJSONWP] at Layer.handle [as handle_request] (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\layer.js:95:5) [debug] [MJSONWP] at D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\index.js:281:22 [debug] [MJSONWP] at Function.process_params (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\index.js:335:12) [debug] [MJSONWP] at next (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\index.js:275:10) [debug] [MJSONWP] at logger (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\morgan\index.js:144:5) [debug] [MJSONWP] at Layer.handle [as handle_request] (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\layer.js:95:5) [debug] [MJSONWP] at trim_prefix (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\index.js:317:13) [debug] [MJSONWP] at D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\index.js:284:7 [debug] [MJSONWP] at Function.process_params (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\index.js:335:12) [debug] [MJSONWP] at next (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\express\lib\router\index.js:275:10) [debug] [MJSONWP] at D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\body-parser\lib\read.js:130:5 [debug] [MJSONWP] at invokeCallback (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\raw-body\index.js:224:16) [debug] [MJSONWP] at done (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\raw-body\index.js:213:7) [debug] [MJSONWP] at IncomingMessage.onEnd (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\raw-body\index.js:273:7) [debug] [MJSONWP] at IncomingMessage.emit (events.js:208:15) [debug] [MJSONWP] at endReadableNT (_stream_readable.js:1168:12) [debug] [MJSONWP] at processTicksAndRejections (internal/process/task_queues.js:77:11) [info] [HTTP] <-- POST /wd/hub/session 500 27 ms - 179 [info] [HTTP]  [info] [HTTP] --> DELETE /wd/hub/session [info] [HTTP] {} [debug] [HTTP] No route found for /wd/hub/session [info] [HTTP] <-- DELETE /wd/hub/session 404 5 ms - 211 [info] [HTTP] [info] [HTTP] --> POST /wd/hub/session [info] [HTTP] {"desiredCapabilities":{"ensureWebviewsHavePages":true,"platformName":"Android","newCommandTimeout":0,"connectHardwareKeyboard":true}} [debug] [MJSONWP] Calling AppiumDriver.createSession() with args: [{"ensureWebviewsHavePages":true,"platformName":"Android","newCommandTimeout":0,"connectHardwareKeyboard":true},null,null] [debug] [BaseDriver] Event &#39;newSessionRequested&#39; logged at 1750921458583 (15:04:18 GMT+0800 (中国标准时间)) [warn] [Appium] [warn] [Appium] ====================================================================== [warn] [Appium] DEPRECATION WARNING: [warn] [Appium] [warn] [Appium] The &#39;automationName&#39; capability was not provided in the desired [warn] [Appium] capabilities for this Android session [warn] [Appium] [warn] [Appium] Setting &#39;automationName=UiAutomator2&#39; by default and using the [warn] [Appium] UiAutomator2 Driver [warn] [Appium] [warn] [Appium] The next major version of Appium (2.x) will **require** the [warn] [Appium] &#39;automationName&#39; capability to be set for all sessions on all [warn] [Appium] platforms [warn] [Appium] [warn] [Appium] In previous versions (Appium <= 1.13.x), the default was [warn] [Appium] &#39;automationName=UiAutomator1&#39; [warn] [Appium] [warn] [Appium] If you wish to use that automation instead of UiAutomator2, please [warn] [Appium] add &#39;automationName=UiAutomator1&#39; to your desired capabilities [warn] [Appium] [warn] [Appium] For more information about drivers, please visit [warn] [Appium] http://appium.io/docs/en/about-appium/intro/ and explore the [warn] [Appium] &#39;Drivers&#39; menu [warn] [Appium] [warn] [Appium] ====================================================================== [warn] [Appium] [info] [Appium] Appium v1.20.2 creating new AndroidUiautomator2Driver (v1.61.2) session [info] [Appium] Applying relaxed security to &#39;AndroidUiautomator2Driver&#39; as per server command line argument. All insecure features will be enabled unless explicitly disabled by --deny-insecure [debug] [BaseDriver] Creating session with MJSONWP desired capabilities: { [debug] [BaseDriver] "ensureWebviewsHavePages": true, [debug] [BaseDriver] "platformName": "Android", [debug] [BaseDriver] "newCommandTimeout": 0, [debug] [BaseDriver] "connectHardwareKeyboard": true [debug] [BaseDriver] } [warn] [BaseDriver] The following capabilities were provided, but are not recognized by Appium: [warn] [BaseDriver] connectHardwareKeyboard [info] [BaseDriver] Session created with session id: a7def776-063b-41be-b908-d8c598571316 [info] [UiAutomator2] Neither &#39;app&#39; nor &#39;appPackage&#39; was set. Starting UiAutomator2 without the target application[debug] [UiAutomator2] Deleting UiAutomator2 session [debug] [BaseDriver] Event &#39;newSessionStarted&#39; logged at 1750921458808 (15:04:18 GMT+0800 (中国标准时间)) [debug] [MJSONWP] Encountered internal error running command: Error: Could not find &#39;adb.exe&#39; in ["D:\\android-sdk-windows\\platform-tools\\adb.exe","D:\\android-sdk-windows\\emulator\\adb.exe","D:\\android-sdk-windows\\cmdline-tools\\latest\\bin\\adb.exe","D:\\android-sdk-windows\\tools\\adb.exe","D:\\android-sdk-windows\\tools\\bin\\adb.exe","D:\\android-sdk-windows\\adb.exe"]. Do you have Android Build Tools installed at &#39;D:\android-sdk-windows&#39;? [debug] [MJSONWP] at ADB.getBinaryFromSdkRoot (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-adb\lib\tools\system-calls.js:125:11) [debug] [MJSONWP] at ADB.getSdkBinaryPath (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-adb\lib\tools\system-calls.js:44:10) [debug] [MJSONWP] at ADB.getAdbWithCorrectAdbPath (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-adb\lib\tools\adb-commands.js:89:26) [debug] [MJSONWP] at Function.createADB (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-adb\lib\adb.js:56:3) [debug] [MJSONWP] at Object.createBaseADB (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-android-driver\lib\android-helpers.js:108:10) [debug] [MJSONWP] at Object.getDeviceInfoFromCaps (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-android-driver\lib\android-helpers.js:193:15) [debug] [MJSONWP] at AndroidUiautomator2Driver.startUiAutomator2Session (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-uiautomator2-driver\lib\driver.js:327:26) [debug] [MJSONWP] at AndroidUiautomator2Driver.createSession (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\node_modules\appium-uiautomator2-driver\lib\driver.js:224:7) [debug] [MJSONWP] at AppiumDriver.createSession (D:\Appium-windows-1.20.2\resources\app\node_modules\appium\lib\appium.js:371:35) [info] [HTTP] <-- POST /wd/hub/session 500 258 ms - 574 [info] [HTTP]  [info] [HTTP] --> DELETE /wd/hub/session [info] [HTTP] {} [debug] [HTTP] No route found for /wd/hub/session [info] [HTTP] <-- DELETE /wd/hub/session 404 0 ms - 211 [info] [HTTP] 
最新发布
06-27
<think>我们正在解决Appium启动Android会话时因缺少platformName能力或相关配置错误导致的500内部错误。根据错误日志,我们看到一个500错误发生在创建会话时,同时后续有一个404错误(因为会话未创建成功,所以删除会话时找不到路由)。用户明确提到错误信息:"Error:YoumustincludeaplatformNamecapabilitywhenstartingAndroidsession"这意味着在创建会话时,desiredcapabilities中没有包含必需的platformName。然而,从用户提供的引用[2]中,我们可以看到在调用createSession时,实际上是包含了platformName的:"platformName":"Android"因此,问题可能不是缺少platformName,而是其他原因导致Appium服务器在解析capabilities时出现问题,或者环境配置问题。结合引用[1]中提到的卸载uiautomator2相关包的方法,我们推测可能是设备上残留的旧版本Appium服务导致冲突。解决方案步骤:1.检查desiredcapabilities:确保在代码中正确设置platformName,并且值正确(注意大小写,通常首字母大写,如"Android"或"iOS")。例如,在Java中:DesiredCapabilitiescaps=newDesiredCapabilities();caps.setCapability("platformName","Android");2.清理设备上的Appium残留:使用以下命令卸载设备上可能存在的旧版本Appium服务:adbuninstallio.appium.uiautomator2.serveradbuninstallio.appium.uiautomator2.server.testadbuninstallio.appium.uiautomator2adbuninstallio.appium.settings#这个也可能需要3.重启Appium服务器:清理后重新启动Appium服务器,并再次运行测试。4.如果问题依旧,尝试更新或降级Appium版本:升级:npminstall-gappium@latest降级:npminstall-gappium@1.19.1#选择一个稳定版本5.检查环境:运行`appium-doctor`来检查环境配置是否正确,特别是AndroidSDK的环境变量。6.确保设备连接正常:使用`adbdevices`确认设备已连接。7.如果使用真机,确保USB调试已开启,并且电脑已授权。8.如果使用模拟器,确保模拟器已启动。9.查看Appium日志:在启动Appium时添加日志参数(例如`appium--logappium.log`),然后运行测试,查看详细的错误信息。10.尝试在capabilities中明确指定automationName为UiAutomator2(对于Android5.0以上):caps.setCapability("automationName","UiAutomator2");由于用户使用的是Appium1.20.2,该版本默认使用UiAutomator2,但有时需要显式指定。根据上述分析,我们给出具体步骤:步骤1:清理设备上的Appium残留在命令行中执行:adbuninstallio.appium.uiautomator2.serveradbuninstallio.appium.uiautomator2.server.testadbuninstallio.appium.uiautomator2adbuninstallio.appium.settings如果这些包不存在,会提示失败,忽略即可。步骤2:在capabilities中显式指定automationName例如:"platformName":"Android","automationName":"UiAutomator2",...其他能力...步骤3:重启设备(有时需要重启设备使卸载生效)步骤4:重启Appium服务器和测试脚本如果问题解决,则完成;否则,继续以下步骤:步骤5:检查platformName的拼写和大小写确保没有拼写错误,例如"platformname"(小写)是不行的,必须是"platformName"。步骤6:使用appium-doctor检查环境安装appium-doctor:npminstall-gappium-doctor运行:appium-doctor--android步骤7:查看Appium日志在启动Appium时,使用`appium--logappium.log`,然后运行测试,查看appium.log中的错误堆栈。如果以上步骤都无法解决,考虑升级或降级Appium版本。示例代码(Java):DesiredCapabilitiescapabilities=newDesiredCapabilities();capabilities.setCapability("platformName","Android");capabilities.setCapability("automationName","UiAutomator2");capabilities.setCapability("deviceName","your_device_name");capabilities.setCapability("app","/path/to/app.apk");//其他必要的能力driver=newAndroidDriver(newURL("http://127.0.0.1:4723/wd/hub"),capabilities);注意:URL中的路径必须是`/wd/hub`。最后,根据用户提供的引用[1]中的经验,卸载设备上的残留Appium服务包通常能解决类似问题[^1]。§§相关问题§§1.如何解决Appium中UiAutomator2的安装失败问题?2.如何正确配置Appium所需的Android环境变量?3.Appium的desiredcapabilities中哪些是必需的?</think>### 解决 Appium 启动 Android 会话时的 `500` 错误:缺少 `platformName` 能力问题 #### 错误分析 您遇到的 `500` 内部错误和 `Error: You must include a platformName capability` 提示表明: 1. **核心问题**:Appium 在创建会话时未检测到必需的 `platformName` 能力(即使日志显示已包含) 2. **深层原因**: - Appium 服务端未正确解析客户端传递的 capabilities(常见于版本兼容性问题) - 设备残留旧版本 Appium 组件导致冲突(如 `uiautomator2` 服务包)[^1] - 能力参数格式错误(如大小写不一致、值类型错误) #### 完整解决方案(逐步操作) ##### 步骤 1:验证并修复 capabilities 配置 ```python # 正确示例(Python) desired_caps = { &#39;platformName&#39;: &#39;Android&#39;, # 必须首字母大写 &#39;platformVersion&#39;: &#39;7.0&#39;, # 字符串类型 &#39;deviceName&#39;: &#39;PBV7N16C29005298&#39;, &#39;appPackage&#39;: &#39;com.xiaochang.easylive&#39;, &#39;appActivity&#39;: &#39;com.xiaochang.easylive.pages.main.activitys.WelcomeActivity&#39;, &#39;automationName&#39;: &#39;UiAutomator2&#39; # 显式指定引擎 } driver = webdriver.Remote(&#39;http://localhost:4723/wd/hub&#39;, desired_caps) ``` **关键检查点**: - `platformName` 值必须为 **`Android`**(首字母大写) - 所有键名使用**小写蛇形命名**(如 `appPackage` 而非 `appPackageName`) - 数值类型参数(如 `platformVersion`)需转为**字符串** ##### 步骤 2:清理设备残留组件(解决冲突) 执行以下 ADB 命令卸载冲突包: ```bash adb uninstall io.appium.uiautomator2.server adb uninstall io.appium.uiautomator2.server.test adb uninstall io.appium.settings adb uninstall io.appium.uiautomator2 ``` 重启设备后重试会话创建,Appium 会自动安装新版组件[^1]。 ##### 步骤 3:显式指定自动化引擎 在 capabilities 中添加: ```json { "automationName": "UiAutomator2" // 强制使用 UIA2 引擎 } ``` > **为何有效**:Appium 1.20.2 默认引擎可能因设备 Android 版本切换失败,显式指定可避免路由解析错误。 ##### 步骤 4:环境验证修复 运行诊断命令: ```bash appium-doctor --android ``` 修复所有 ❌ 项,重点关注: 1. `ANDROID_HOME` 环境变量是否指向 SDK 路径 2. `adb` 工具是否在系统 PATH 中 3. Java JDK 版本 ≥ 8 ##### 步骤 5:版本兼容性处理 若问题持续,尝试: ```bash # 降级到稳定版本 npm uninstall -g appium npm install -g appium@1.19.1 # 或升级到新版 npm install -g appium@latest ``` #### 验证成功的日志特征 成功会话会显示: ``` [Appium] Creating new AndroidUiautomator2Driver session [BaseDriver] Session created with session id: 3a1b2c3d-4e5f-6a7b-8c9d0e1f2a3b ``` #### 预防措施 1. 每次测试前清理设备残留:`adb shell pm list packages | grep appium | xargs -n1 adb uninstall` 2. 在 capabilities 中始终包含: ```json { "platformName": "Android", "automationName": "UiAutomator2" } ``` 3. 使用 `appium:capabilities` 前缀避免歧义: ```python caps = { &#39;appium:platformName&#39;: &#39;Android&#39;, &#39;appium:appPackage&#39;: &#39;com.example.app&#39; } ``` 通过以上步骤,可解决因 `platformName` 解析失败导致的 500 错误。若问题依旧,请提供 `appium --log` 的完整输出进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值