解决io.appium.settings/.UnicodeIME‘ 报错:android.permission.WRITE_SECURE_SETTINGS.

本文讲述了在使用Appium配置红米手机真机环境时,遇到的虚拟键盘权限问题及解决方案。通过设置'unicodeKeyboard'和'resetKeyboard',以及开发者选项中的‘禁止权限监控’,实现键盘功能正常运行。

appium 运行真机环境,配置虚拟键盘:

2种情况:

第一种不会报错,但是虚拟键盘调用后中能英文;

  "unicodekeyboard": true,
  "resetkeyboard": true,

我看到很多帖子写着这样写,就不会有权限报错问题。的确能正常运行,但是无法真正意义上的调用键盘模式;可以英文,但不能输入中;其实这是个不正规的写法;

第二种会报错,这是一个权限的问题:需要手动处理,一开始没想通绕了很久;

  "unicodeKeyboard": true,
  "resetKeyboard": true,

正规的写法,可以查下参数中的Key,K是要大写,而不是小写;当然会发现这么写会报错,权限错误,如下图:

如何解决这个问题呢,也是一个很简单的方式:

我是红米手机(其他型号的手机需要自己研究下了),在开发者选项里,拉到最底下有个“禁止权限监控”这个功能打开就好,打开后在运行配置环境,就能正常运行;

如图:

java.util.concurrent.ExecutionException: org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: Check https://github.com/appium/appium/issues/13802 for throubleshooting. Error executing adbExec. Original error: 'Command ''C:\Users\admin\.katalon\tools\android_sdk\platform-tools\adb.exe' -P 5037 -s 2a0b9c28 shell 'settings delete global hidden_api_policy_pre_p_apps;settings delete global hidden_api_policy_p_apps;settings delete global hidden_api_policy'' exited with code 255'; Command output: Exception occurred while executing 'delete': java.lang.SecurityException: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS at com.android.providers.settings.SettingsProvider.enforceWritePermission(SettingsProvider.java:2329) at com.android.providers.settings.SettingsProvider.mutateGlobalSetting(SettingsProvider.java:1473) at com.android.providers.settings.SettingsProvider.mutateGlobalSetting(SettingsProvider.java:1465) at com.android.providers.settings.SettingsProvider.deleteGlobalSetting(SettingsProvider.java:1436) at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:528) at android.content.ContentProvider.call(ContentProvider.java:2533) at android.content.ContentProvider$Transport.call(ContentProvider.java:530) at com.android.providers.settings.SettingsService$MyShellCommand.deleteForUser(SettingsService.java:408) at com.android.providers.settings.SettingsService$MyShellCommand.onCommand(SettingsService.java:282) at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97) at android.os.ShellCommand.exec(ShellCommand.java:38) at com.android.providers.settings.SettingsService.onShellCommand(SettingsService.java:50) at android.os.Binder.shellCommand(Binder.java:1054) at android.os.Binder.onTransact(Binder.java:882) at android.os.Binder.execTransactInternal(Binder.java:1290) at android.os.Binder.execTransact(Binder.j
10-12
C:\Users\admin\.katalon\tools\android_sdk\platform-tools>adb shell pm grant io.appium.android.apis android.permission.WRITE_SECURE_SETTINGS Exception occurred while executing 'grant': java.lang.SecurityException: grantRuntimePermission: Neither user 2000 nor current process has android.permission.GRANT_RUNTIME_PERMISSIONS. at android.app.ContextImpl.enforce(ContextImpl.java:2250) at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:2278) at com.android.server.pm.permission.PermissionManagerServiceImpl.grantRuntimePermissionInternal(PermissionManagerServiceImpl.java:1340) at com.android.server.pm.permission.PermissionManagerServiceImpl.grantRuntimePermission(PermissionManagerServiceImpl.java:1322) at com.android.server.pm.permission.PermissionManagerService.grantRuntimePermission(PermissionManagerService.java:567) at android.permission.PermissionManager.grantRuntimePermission(PermissionManager.java:597) at com.android.server.pm.PackageManagerShellCommand.runGrantRevokePermission(PackageManagerShellCommand.java:2565) at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:292) at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97) at android.os.ShellCommand.exec(ShellCommand.java:38) at com.android.server.pm.PackageManagerService$IPackageManagerImpl.onShellCommand(PackageManagerService.java:6280) at android.os.Binder.shellCommand(Binder.java:1054) at android.os.Binder.onTransact(Binder.java:882) at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:4313) at com.android.server.pm.PackageManagerService$IPackageManagerImpl.onTransact(PackageManagerService.java:6264) at android.os.Binder.execTransactInternal(Binder.java:1290) at android.os.Binder.execTransact(Binder.java:1249)
10-12
是因为调用这个方法,报的上面这个错,请帮我分析根因,方法如下: def download_AG_app(self, driver, app_name, package_name): market_package = "com.huawei.appmarket" try: for i in range(2): driver.press_keycode(187) try: driver.find_element(By.ID, 'com.huawei.android.launcher:id/clear_all_recents_image_button').click() except: pass driver.press_keycode(3) except: pass time.sleep(10) driver.activate_app(market_package) time.sleep(10) self.click_element_with_swipe(driver, target_id='com.huawei.appmarket:id/enter_button', target_text='暂不安装') self.click_element_with_swipe(driver, target_id='android:id/button2', target_text='以后再说') # self.swipe_up(driver, swipe_times=3) driver.find_element(By.ID, 'com.huawei.appmarket:id/fixed_search_view').click() time.sleep(3) src_text = driver.find_element(By.ID, "com.huawei.appmarket:id/search_src_text") src_text.set_text(app_name) time.sleep(3) driver.find_element(By.ID, 'com.huawei.appmarket:id/hwsearchview_search_text_button').click() time.sleep(3) result1 = self.click_element_with_swipe(driver, target_id='com.huawei.appmarket:id/ItemTitle',target_text=f'{app_name}', max_swipe=5) # 可以在应用市场搜索到该应用 if result1 == True: time.sleep(5) # 场景1:应用未安装 result2= self.click_element_with_swipe(driver, target_id='com.huawei.appmarket:id/hwprogressbutton_percentage_text_view',target_text='安装') if result2 == True: time.sleep(90) result3 = self.click_element_with_swipe(driver,target_id='com.huawei.appmarket:id/hwprogressbutton_percentage_text_view',target_text='打开') # 应用规定时间内安装完成 if result3 == True: time.sleep(5) self.click_element_with_swipe(driver,target_id='com.android.permissioncontroller:id/permission_allow_button',target_text='允许') else: # 应用规定时间内未安装完成,点击暂停 driver.find_element(By.ID, 'com.huawei.appmarket:id/detail_download_button').click() self.go_back(driver, times=3) # 场景2:应用已存在 else: time.sleep(30) result4 = self.click_element_with_swipe(driver,target_id='com.huawei.appmarket:id/hwprogressbutton_percentage_text_view', target_text='打开') if result4 == True: time.sleep(5) self.click_element_with_swipe(driver, target_id='com.android.permissioncontroller:id/permission_allow_button',target_text='允许') else: pass else: failure_info = { "status": "fail", "app_name": app_name, "package_name": package_name, "reason": f"应用市场未找到应用:{app_name}(包名:{package_name})" } self.go_back(driver, times=3) return failure_info
07-12
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值