• appium 2.5.1多进程自动化多台真机测试时候经常提示'exited with code 1'


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 pangyou123456 2024-04-08 17:52 采纳率: 25% 浏览 13 首页/ 运维 / appium 2.5.1多进程自动化多台真机测试时候经常提示'exited with code 1' 自动化 appium 2.5.1多进程自动化多台真机测试时候经常提示Stacktrace:UnknownError: An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command '/usr/local/android-sdk-linux/platform-tools/adb -P 5037 -s 8TAQOVSKOFHY4L4D forward tcp:8201 tcp:6790' exited with code 1'; Command output: adb: error: more than one device/emulator大概看了下,大致意思连接了不只一个手机或模拟器,但有时重启手机和电脑又可正常,不太明白为什么有时可以有时不正常。 def appium_App(self, port, device_name, platform_version,product_brand,network_mode, voice_mode,sim_slot,sim1_num,sim2_num,file_name,file_path): self.desired_caps = { # 平台名称 "platformName": "Android", # 系统版本 "platformVersion": platform_version, # 设备的名称 "deviceName": device_name, "udid": device_name, # 设置使用 Unicode 编码方式发送字符串到设备的键盘 "unicodeKeyboard": "true", # 设置重置设备的软键盘状态并隐藏键盘 "restKeyboard": "true", "noReset": True, # 不要重置App "settings[waitForIdleTimeout]": 100, "newCommandTimeout": 60000, } # 加载测试的配置选项和参数(Capabilities配置) self.options = UiAutomator2Options().load_capabilities(self.desired_caps) # Appium服务器地址端口,本地用http://127.0.0.1:4723 self.driver = webdriver.Remote(f"http://127.0.0.1:{port}", options=self.options) 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • GISer Liu 2024-04-08 18:20
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      问题分析: 根据报错信息和描述,问题可能是由于多台真机连接时,adb(Android 调试桥)无法正确识别要与之通信的设备,导致无法建立连接,从而抛出错误。
      解决思路:

      1. 排查连接状态 :确认多台设备是否正确连接,并且只有一个设备与电脑连接。可以通过执行adb devices命令来查看当前连接的设备列表,确保只有一个设备处于连接状态。
      2. 唯一设备标识 :对于每个设备,确保其具有唯一的标识符。在代码中使用udid字段指定设备标识,但可能存在设备标识不唯一的情况,导致adb无法正确识别设备。
      3. 动态分配端口 :在启动Appium服务器时,动态分配端口以避免端口冲突。可以通过设置port参数为0来实现动态分配端口,让Appium自动选择可用端口。
      4. 异常处理机制 :在代码中增加异常处理机制,对于连接设备出现异常的情况进行捕获和处理,可以尝试重新连接设备或者重启Appium服务器。
      5. 更新adb版本 :有时候问题可能是由于adb版本不兼容或存在bug引起的,尝试更新到最新版本的adb,或者使用其他版本来排除adb本身的问题。
        解决方案代码示例:
        pythonCopy code
        import subprocess
        class AppiumManager:
        def start_appium_server(self, port):
        # 动态分配端口
        if port == 0:
        port = self._find_available_port()
        # 启动Appium服务器
        appium_command = f"appium -p {port}"
        subprocess.Popen(appium_command, shell=True)
        return port
        def _find_available_port(self):
        # 实现动态分配端口的逻辑
        pass
        def appium_App(self, port, device_name, platform_version, product_brand, network_mode, voice_mode, sim_slot, sim1_num, sim2_num, file_name, file_path):
        self.desired_caps = {
        "platformName": "Android",
        "platformVersion": platform_version,
        "deviceName": device_name,
        "udid": device_name,
        "unicodeKeyboard": "true",
        "resetKeyboard": "true",
        "noReset": True,
        "settings[waitForIdleTimeout]": 100,
        "newCommandTimeout": 60000,
        }
        self.options = UiAutomator2Options().load_capabilities(self.desired_caps)
        # 尝试连接设备,增加异常处理
        try:
        self.driver = webdriver.Remote(f"http://127.0.0.1:{port}", options=self.options)
        except Exception as e:
        print(f"Failed to connect to device {device_name}: {str(e)}")
        # 可以尝试重新连接或者重启Appium服务器
        # self.restart_appium_server()
        # self.appium_App(port, device_name, platform_version, product_brand, network_mode, voice_mode, sim_slot, sim1_num, sim2_num, file_name, file_path)
        def restart_appium_server(self):
        # 实现重启Appium服务器的逻辑
        pass
        # 示例用法
        appium_manager = AppiumManager()
        port = appium_manager.start_appium_server(0)
        appium_manager.appium_App(port, device_name, platform_version, product_brand, network_mode, voice_mode, sim_slot, sim1_num, sim2_num, file_name, file_path)
        
        这些解决方案的实施应该能够帮助您解决多台真机测试时经常出现的连接问题。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
      pangyou123456 2024-04-08 18:47

      端口是动态分配,udid也确认过没有重复的,应为平台允许上传代码有限,没有上传部分代码

      回复
      GISer Liu 2024-04-08 18:51

      根据您提供的历史对话,问题似乎出现在使用Appium进行多台真机测试时,经常出现连接问题,报错为"exited with code
      1"。这个问题可能是由于adb(Android 调试桥)无法正确识别要与之通信的设备导致的。以下是我对该问题的解决思路和解决方案:

      解决思路:

      1. 排查连接状态 :确认多台设备是否正确连接,并且只有一个设备与电脑连接。可以通过执行 adb devices 命令来查看当前连接的设备列表,确保只有一个设备处于连接状态。
      2. 唯一设备标识 :对于每个设备,确保其具有唯一的标识符。在代码中使用 udid 字段指定设备标识,但可能存在设备标识不唯一的情况,导致adb无法正确识别设备。
      3. 动态分配端口 :在启动Appium服务器时,动态分配端口以避免端口冲突。可以通过设置 port 参数为0来实现动态分配端口,让Appium自动选择可用端口。
      4. 异常处理机制 :在代码中增加异常处理机制,对于连接设备出现异常的情况进行捕获和处理,可以尝试重新连接设备或者重启Appium服务器。
      5. 更新adb版本 :有时候问题可能是由于adb版本不兼容或存在bug引起的,尝试更新到最新版本的adb,或者使用其他版本来排除adb本身的问题。

        解决方案代码示例:

        pythonCopy code
        import subprocess
        class AppiumManager:
        def start_appium_server(self, port):
        # 动态分配端口
        if port == 0:
        port = self._find_available_port()
        # 启动Appium服务器
        appium_command = f"appium -p {port}"
        subprocess.Popen(appium_command, shell=True)
        return port
        def _find_available_port(self):
        # 实现动态分配端口的逻辑
        pass
        def appium_App(self, port, device_name, platform_version, product_brand, network_mode, voice_mode, sim_slot, sim1_num, sim2_num, file_name, file_path):
        self.desired_caps = {
        "platformName": "Android",
        "platformVersion": platform_version,
        "deviceName": device_name,
        "udid": device_name,
        "unicodeKeyboard": "true",
        "resetKeyboard": "true",
        "noReset": True,
        "settings[waitForIdleTimeout]": 100,
        "newCommandTimeout": 60000,
        }
        self.options = UiAutomator2Options().load_capabilities(self.desired_caps)
        # 尝试连接设备,增加异常处理
        try:
        self.driver = webdriver.Remote(f"http://127.0.0.1:{port}", options=self.options)
        except Exception as e:
        print(f"Failed to connect to device {device_name}: {str(e)}")
        # 可以尝试重新连接或者重启Appium服务器
        # self.restart_appium_server()
        # self.appium_App(port, device_name, platform_version, product_brand, network_mode, voice_mode, sim_slot, sim1_num, sim2_num, file_name, file_path)
        def restart_appium_server(self):
        # 实现重启Appium服务器的逻辑
        pass
        # 示例用法
        appium_manager = AppiumManager()
        port = appium_manager.start_appium_server(0)
        appium_manager.appium_App(port, device_name, platform_version, product_brand, network_mode, voice_mode, sim_slot, sim1_num, sim2_num, file_name, file_path)
        
        以上解决方案代码示例中,我使用了Python来实现Appium服务器的启动、设备连接的异常处理等功能。您可以根据实际情况进行调整和扩展。希望能帮助您解决多台真机测试时经常出现的连接问题。

      回复
      pangyou123456 回复 GISer Liu 2024-04-09 09:13

      经过分析,问题还是出在adb
      angyou@pangyou-HP-EliteDesk-880-G1-TWR:$ /usr/bin/adb -P 5037 -s 7de66316 forward tcp:8202 tcp:6790
      8202
      pangyou@pangyou-HP-EliteDesk-880-G1-TWR:
      $ /usr/local/android-sdk-linux/platform-tools/adb -P 5037 -s 7de66316 forward tcp:8202 tcp:6790
      adb: error: more than one device/emulator
      将usr/bin/adb拷贝到/usr/local/android-sdk-linux/platform-tools/adb 后解决该问题。
      pangyou@pangyou-HP-EliteDesk-880-G1-TWR:/usr/bin$ cp adb /usr/local/android-sdk-linux/platform-tools

      回复
      展开全部4条评论
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-08 17:52
      关注

      引自免费微信小程序:皆我百晓生

      非常抱歉给您带来了不便,我会尽力解决您的问题。根据您提供的信息,这可能是由于您的环境设置、应用程序配置或其他因素导致的。

      首先,确保您的APP国际化设置是开启的。您可以尝试将ǔdId值更改为中文,看看是否解决了问题。

      接下来,检查您的设备是否存在两个或多个单独的设备,或者模拟器上是否有其他未连接的应用程序。

      此外,您可以尝试删除应用程序或停止使用其中某些功能,然后重新启动设备,看看是否能解决问题。

      另外,如果您的设备没有在应用商店中,那么这个错误可能与设备的问题有关。在这种情况下,建议您联系手机制造商或设备提供商,提供相关信息和证据。

      如果你需要进一步的帮助,比如绘制图形或编写代码,请随时告诉我,我会尽我所能为您提供支持。

      如果这是应用程序内的错误,您可能需要重新安装应用程序。

      如果以上方法都无法解决问题,建议您向您的团队或者厂商求助。

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-08 17:52
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      问题描述:当使用appium 2.5.1的多进程自动化多台真机测试时,经常会提示'exited with code 1',错误信息为'UnknownError: An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command '/usr/local/android-sdk-linux/platform-tools/adb -P 5037 -s 8TAQOVSKOFHY4L4D forward tcp:8201 tcp:6790' exited with code 1'; Command output: adb: error: more than one device/emulator'。看起来是连接了不止一个手机或模拟器。

      解决方案:

      1. 确定连接的设备
      • 使用命令行命令 adb devices 来查看连接的设备以及它们的 ID 号。
      • 确保连接的设备只有一个,如果有多个则需要先通过命令 adb -s 设备号 kill-server 来关闭所有连接设备,然后再通过命令 adb -s 设备号 start-server 重新连接设备进行测试。
      1. 检查 appium 启动参数

      检查 appium 启动参数是否正确,如 platformVersion、deviceName、udid 等。如果使用 udid 参数,则要确保每个设备的 udid 号都不同。

      1. 检查 Appium 配置
      • 确认 Appium 的adb地址和环境变量设置没有错误
      • 检查 Appium 是否已正确安装
      • 检查是否使用了正确的 Appium 版本

      修改后的代码:

      def appium_App(self, port, device_name, platform_version,product_brand,network_mode, voice_mode,sim_slot,sim1_num,sim2_num,file_name,file_path): self.desired_caps = { # 平台名称 "platformName": "Android", # 系统版本 "platformVersion": platform_version, # 设备的名称 "deviceName": device_name, "udid": device_name, # 确保每个设备的udid号都不同 # 设置使用 Unicode 编码方式发送字符串到设备的键盘 "unicodeKeyboard": "true", # 设置重置设备的软键盘状态并隐藏键盘 "restKeyboard": "true", "noReset": True, # 不要重置App "settings[waitForIdleTimeout]": 100, "newCommandTimeout": 60000, } # 加载测试的配置选项和参数(Capabilities配置) self.options = UiAutomator2Options().load_capabilities(self.desired_caps) # Appium服务器地址端口,本地用http://127.0.0.1:4723 self.driver = webdriver.Remote(f"http://127.0.0.1:{port}", options=self.options)

      展开全部

      评论 编辑记录
    • pangyou123456 2024-04-08 18:03
      关注

      参数应该没有问题的,不同的设备通过udid进行了区分,手机也是一样的,有时候正常,有时候不正常。

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    捕获php中的错误与异常
    一文吃透 Go 内置 RPC 原理
    87.有效的完全平方数(力扣)
    解决logstash插件logstash-outputs-mongodb一条数据失败后一直重复尝试
    论文笔记:Time-LLM: Time Series Forecasting by Reprogramming Large Language Models
    neo4j 删除从一个node开始的所有数据。
    大数据平台架构及规划
    【FAQ】【Push Kit】 华为怎么设置角标
    Redis主从集群
    【万字长文】使用 LSM-Tree 思想基于.Net 6.0 C# 实现 KV 数据库(案例版)
  • 原文地址:https://ask.csdn.net/questions/8085212