pip install Appium-Python-Client -i https://pypi.douban.com/simple
pip install selenium -U
# 确保selenium和appium版本匹配
下载地址1:https://github.com/appium/appium-desktop/releases/latest
下载地址2:https://bitbucket.org/appium/appium.app/downloads/
下载 jdk 地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html
检查电脑是否有安装过jdk或是否安装成功:cmd窗口----输入 java -version
检查是否已配置环境变量:cmd窗口----输入 javac
配置环境变量:
1、变量名:JAVA_HOME 变量值:C:/Program Files/Java/jdk1.8.0_151(注意这里是安装jdk的路径,最好是英文路径)
2、变量名:PATH 变量值:C:/Program Files/Java/jdk1.8.0_151/bin;C:/Program Files/Java/jdk1.8.0_151/bin;(注意这里是两个路径,用分号隔开)
3、变量名:CLASSPATH 变量值:C:/Program Files/Java/jdk1.8.0_151/lib/dt.jar;C:/Program Files/Java/jdk1.8.0_151/lib/Tools.jar;(可不配置)
配置完后重启cmd窗口,输入javac验证是否配置成功
下载sdk地址1: http://developer.android.com/studio/installing/index.html(划到下面“Command line Tools only”下载即可)
下载sdk地址2: https://developer.android.google.cn/studio/(官网)
配置环境变量:
1、变量名:ANDROID_HOME
变量值:D:/Android-SDK-Windows
(注意这里是安装sdk的路径,最好是英文路径)
2、变量名:PATH
变量值:D:/Android-SDK-Windows/Tools;D:/Android-SDK-Windows/platform-Tools
(注意这里是安装sdk的路径,最好是英文路径)
配置完后启动cmd窗口,输入adb --version
,验证是否配置成功(出现版本号则为成功)
下载nodejs地址:http://nodejs.cn/download/
验证是否安装成功,打开cmd窗口,输入node -v
(如果出现了版本号则为成功)
1、用数据线连接,注意有的数据线只能用来充电
2、手机必须开启开发者模式
3、有的手机必须安装驱动才能连接
4、以上步骤确认无误后,在电脑cmd窗口输入:adb devices 连接手机
1 adb devices 查看已连接的设备与模拟器 devices/offline/no devices/unauthorized
2. adb connect ip port—连接设备
3. adb disconnect ip port----取消连接
4. adb version----查看adb的版本
5. adb start-server----启动adb服务
6. adb kill-server----杀掉adb服务
7. adb install 绝对路径 (必须是英文)----安装程序
8. adb uninstall 包名-----卸载程序
9. adb shell pm list packages -3 -----输出系统用户安装的第三方app包名
10. adb shell pm list packages -s ------输出系统自带的包名
11. adb pull /data/anr/traces.txt D:/log -----把手机端的文件拷贝到电脑端
12. adb push D:/log/traces.txt /data/anr ------把电脑端的文件拷贝到手机端
1、windows命令:adb shell dumpsys window windows | findstr mFocusedApp
#获取当前打开应用的包名和当前页面启动名
windows命令:adb shell dumpsys activity recents | findstr "intent={"
#该命令获取最近的活动程序,通常是第一行的;
windows命令:aapt.exe dump badging 存放apk的目录
(针对没有安装app的情况)
2、Linux命令:adb shell dumpsys window windows | grep mFocusApp
获取系统版本号:adb shell getprop ro.build.version.release
获取手机webview版本:adb shell am start -a android.intent.action.VIEW -d https://liulanmi.com/labs/core.html
获取App的启动时间:adb shell am start -W 包名/启动名
1、TotalTime:app自身启动时间
2、WaitTime:系统启动app时间
from appium import webdriver # 后续操作依赖于这个库
desired_caps = {
'platformName': 'Android', # 设备类型;
'platformVersion': '6', # 设备的类型的版本号,如果是安卓,填写大的版本号即可,小数不用填;
'deviceName': 'MI9', # 设备的名称,这个和后续的测试没有多大关系;
'appPackage': 'io.momo.reve', # 需要测试的app包名;
'appActivity': 'io.momo.reve', # 需要测试的app启动名;
'unicodeKeyboard': True, # 如果指定了UI2作为驱动,不需要配置;
'resetKeyboard': True, # 重置自动化时设置的键盘;
'chromedriverExecutableDir': '路径', # 启动webview的webdriver驱动
'noReset': True, # 防止每次启动app时候都初始化所有数据;
'newCommandTimeout': 6000, # 代码向appiumserver发送命令的延迟时间,单位是秒,不设置默认一分钟;
'automationName': 'uiautomator2', # 这个并不是所有应用都适配的,1.15.1以前默认是UI1,之后是默认UI2;
'autoGrantPermissions': "True", # 自动跳过授权
'skipServerInstallation': 'True',
'skipDeviceInitialization': 'True', # 跳过安装AppiumSetting
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # /wd/hub 路径是固定的,desired_caps是初始化设置的字典;
driver.implicitly_wait(10) # 隐式等待和selenium的用法是一样的;
driver.find_elements_by_id(“username”) # 根据id定位,即 resource-id 的值;
driver.find_element_by_accessibility_id(‘unique name’) # 根据唯一id定位,即 contend-desc 的值;
driver.find_element_by_class_name(“android.btn”) # 根据类名定位,即 class 的值;
driver.find_element_by_xpath(“//元素类型[@属性=‘value’]”) # 根据xpath定位,即 xpath 的值;
driver.tap([(1, 2), (3, 4)]) # 模拟手指点击坐标,tap里面最多有5个坐标,
target_size = driver.get_window_size() # 获取手机屏幕的尺寸
height = target_size[“height”] # 获取手机屏幕 x 坐标
width = target_size[“width”] # 获取手机屏幕 y 坐标
driver.tap([(height / 2, width / 8)]) # 点击指定百分比坐标的位置
一般在 /SDK/Tools/bin/uiautomatorviewer.bat 目录下,有的也会直接放在 /SDK/Tools/uiautomatorviewer.bat 目录下;
高版本的安卓可能有兼容性问题,经常出现连接不上的问题,需要多次重启工具和adb;
index:元素的下标,在结构树上能看到;
text:文本信息,不是每个元素都有;
resource-id:元素的id,但这个id有可能不是唯一的(格式:“包名:id”);
class:元素属于的类,安卓是java开发的,所以每个元素都有class,;
package:app的包名;
content-desc:这个可以唯一定位元素,通常开发都不会写;
bounds:坐标值,通常有两个list,一个是左上角一个是右下角,如: [x1,y1][x2,y2]
new UiSelector().resourceId("string id")
#此方法是java用法,能在appium定位工具里验证(括号里是一个参数)
new UiSelector().className("string classname")
#此方法是java用法,能在appium定位工具里验证(括号里是一个参数)
new UiSelector().description("string id")
#此方法是java用法,能在appium定位工具里验证(括号里是一个参数)
注意:new 后面的空格只能是一个,否则会报错;
new UiSelector().resourceId("string id").childSelector(new UiSelector().className("string classname"))
注意这个并非固定用法,.childSelector() 前的可以是任何appium定位方法,括号里的也是可以任何的appium定位方法;
如用选择xpath定位后的第 n 个元素:
new UiSelector().resourceId("string id").childSelector(new UiSelector().className("string classname").instance(n))
注意:这里的 n 是从 0 开始的,0 既是第一个元素;
new UiSelector().resourceIdMatches("id/digit\d")
#注意这里的 \d 是正则表达式;
new UiSelector().text("text")
new UiSelector().textMatches("text\d")
#注意这里的 \d 是正则表达式;
driver.find_element_by_android_uiautomator('''new UiSelector().resourceId("string id")''')
# 单数形式
driver.find_element_by_android_uiautomator('''new UiSelesctor().resourceId("string id")''')
# 复数形式
banner = driver.find_element_by_id(“”) # 先定位到需要获取尺寸的目标元素
banSize = banner.size # 返回:{“height”: size[“height”], “width”: size[“width”]}
eleHeight, eleWidth = banSize[“height”], banSize[“width”] # 获取元素的高度和宽度
loc = banner.location # 获取元素的左上角坐标,返回:{“x”: round(old_loc[‘x’]), “y”: round(old_loc[‘y’])}
startX, startY = loc + eleWidth * 0.2, loc + eleHeight * 0.5 # 获取起始坐标
endX, endY = loc + eleWidth * 0.8, startY # 获取终点坐标
driver.swipe(startX, startY, endX, endY, duration=None) # 滑动方法,duration是滑动消耗时间
driver.swipe() # 通过滑动屏幕实现—从顶端向下滑动
driver.open_notifications() # 固定用法,通过调用api来实现
driver.swipe() # 通过滑动屏幕实现—从底部向上滑动
driver.press_keycode() # 括号里面填写相对应的按钮编码,短按操作
driver.keyevent() # 相当于继承了selenium的方法,短按操作
driver.long_press_keycode() # 长按按钮操作,括号里的输入对应按钮的编码
driver.press_keycode(5) # 拨号键
driver.press_keycode(220) # 调节屏幕亮度的键
driver.press_keycode(221) # 调节屏幕亮度的键
driver.press_keycode(3) # home 键
driver.press_keycode(82) # 菜单键
driver.press_keycode(4) # 返回键
driver.press_keycode(27) # 拍照键
driver.press_keycode(26) # 电源键,点击一下相当于锁屏,长按相当于关机操作
driver.press_keycode(91) # 话筒静音键
driver.press_keycode(24) # 电源键,点击一下相当于锁屏,长按相当于关机操作
driver.press_keycode(25) # 音量增加键
driver.press_keycode(26) # 音量减小键
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", {"deviceName": "iPhone X"}) # 注意模拟的手机设备类型是浏览器里有的;
bro = webdriver.Chrome(desired_capabilities=chrome_options.to_capabilities()) # 启动webdriver添加配置项;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView myWebView = (WebView) findViewById(R.id.jcywebview);
myWebView.setWebContentsDebuggingEnabled(true);
}
通过chrome的远程调试功能—电脑需要
打开chrome浏览器,地址栏输入:chrome://inspect
Android 4.4(KitKat)或更高的版本
driver.contexts # 查看你当前有那些context,返回的是一个列表;
driver.current_context # 查看 driver 当前处于哪个 context;
contextname = driver.contexts[0]
driver.switch_to.context(contextname) # 切入 context 里面去;