本文使用真机测试,关于虚拟机连接方式,请自行搜索。
首先需要用到的软件:
1. pip包管理器
安装教程:Windows windows下python安装pip方法详解_python_脚本之家 (jb51.net)
MAC mac 安装pip教程_quanqxj的博客-CSDN博客_mac pip怎么安装
前提已经安装了python
2. Appium客户端
执行命令:pip install Appium-Python-Client
3. Appium Server
安装对应版本:Release 1.18.3 · appium/appium-desktop (github.com)
4. JDK
建议安装jdk8,避免出现不可预知的问题。
5. SDK
安装教程:Windows win10环境下Android SDK下载安装及配置教程----Android SDK安装_jinron10的专栏-CSDN博客
Mac 安装Homebrew MacOS-Homebrew - 简书 (jianshu.com)
SDK macOS 安装 Android SDK_mixboot-CSDN博客
设备连接
使用USB将手机连接至电脑,然后将手机打开开发者模式,站在开发者模式中启动USB调试。
查看设备连接:执行命令 adb devices -l。
注意:如果没有配置环境变量,命令执行要在sdk\platform-tools文件夹目录下执行。
测试脚本代码
测试app:开发者头条
# coding=utf-8
from appium import webdriver
import time, traceback
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '10'
desired_caps['deviceName'] = 'Redmi K20 Pro'
desired_caps['appPackage'] = 'io.manong.developerdaily'
desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
desired_caps['noReset'] = True
desired_caps['newCommandTimeout'] = 6000
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
try:
driver.implicitly_wait(10)
#根据id找到元素并点击
driver.find_element_by_id('io.manong.developerdaily:id/tab_bar_plus').click()
time.sleep(1)
ele = driver.find_element_by_xpath("//android.widget.TextView[@text='密码登录']").click()
time.sleep(1)
#输入用户名,密码
ele = driver.find_element_by_id("io.manong.developerdaily:id/edt_phone")
ele.send_keys("138********")
ele = driver.find_element_by_id("io.manong.developerdaily:id/edt_password")
ele.send_keys("123456")
time.sleep(2)
driver.find_element_by_id("io.manong.developerdaily:id/btn_login").click()
except:
print(traceback.format_exc())
input("Press to quit..")
driver.quit
注意:由于培训时老师用的是Mac,连接的url是http://0.0.0.0:4723/wd/hub,Windows要改成http://127.0.0.1:4723/wd/hub,这个问题的报错信息如下:
查看apk的包名和launch activity
如果没有配置环境变量,在sdk\build-tools\29.0.3目录下执行aapt dump badging [apk path]
注意:Windows下如果未修改编码可能会出现编码乱码,虽然不影响结果查看。解决办法:Java CMD命令行输出中文乱码问题_逍遥阁-CSDN博客_java命令行中文乱码
使用uiautomatorviewer查看apk页面元素信息
在sdk/tools目录下双击执行uiautomatorviewer.bat,然后出现下图所示页面,然后点击第三个图标(图中圈出来的)
注意:可能会出现如下错误,解决办法:Android 10不能使用uiautomatorviewer定位元素的终极解决方法 (icode9.com)
代码执行报错情况:
错误一:权限拒绝
java.lang.SecurityException: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
at com.android.providers.settings.SettingsProvider.enforceWritePermission(SettingsProvider.java:2050)
at com.android.providers.settings.SettingsProvider.mutateGlobalSetting(SettingsProvider.java:1256)
at com.android.providers.settings.SettingsProvider.deleteGlobalSetting(SettingsProvider.java:1239)
at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:476)
at android.content.ContentProvider.call(ContentProvider.java:2177)
at android.content.ContentProvider$Transport.call(ContentProvider.java:477)
at com.android.providers.settings.SettingsService$MyShellCommand.deleteForUser(SettingsService.java:399)
at com.android.providers.settings.SettingsService$MyShellCommand.onCommand(SettingsService.java:281)
at android.os.ShellCommand.exec(ShellCommand.java:104)
at com.android.providers.settings.SettingsService.onShellCommand(SettingsService.java:49)
at android.os.Binder.shellCommand(Binder.java:881)
at android.os.Binder.onTransact(Binder.java:765)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
Security exception: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
解决办法:开发者选项打开USB调试
错误二:settings_apk-debug.apk安装失败
Traceback (most recent call last):
File "c:\Users\DBC601\Desktop\logintest.py", line 15, in
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
File "C:\dbc\python\version39\lib\site-packages\appium\webdriver\webdriver.py", line 151, in __init__
super().__init__(
File "C:\dbc\python\version39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 157, in __init__
self.start_session(capabilities, browser_profile)
File "C:\dbc\python\version39\lib\site-packages\appium\webdriver\webdriver.py", line 225, in start_session
response = self.execute(RemoteCommand.NEW_SESSION, parameters)
File "C:\dbc\python\version39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\dbc\python\version39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'C:\\dbc\\python\\sdk\\platform-tools\\adb.exe -P 5037 -s 84af46ba install -g 'C:\\Program Files\\Appium\\resources\\app\\node_modules\\appium\\node_modules\\io.appium.settings\\apks\\settings_apk-debug.apk'' exited with code 1'; Stderr: 'adb: failed to install C:\Program Files\Appium\resources\app\node_modules\appium\node_modules\io.appium.settings\apks\settings_apk-debug.apk: Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]'; Code: '1'
解决办法:开发者选项打开USB安装