环境搭建
安装JDK
1. Java Downloads | Oracle 下载JDK安装包,按照默认方式无脑按照即可
2. 设置系统环境变量,系统环境变量添加JAVA_HOME, 路劲是jdk安装路径
3. 系统Path变量添加jdk和jre的bin目录
安装nodejs
Node.js 中文网 下载安装包,默认方式安装即可
下载adb
1. 下载adb
方法一:安装Android Studio, 通过其所带的SDK manager 下载adb.
Android Studio 官方地址Download Android Studio & App Tools - Android Developers
安装成功后打开sdk manager并设置sdk路径,然后下载tool,这个路径等下要设置到ANDROID_HOME系统变量。在此路径下会有platform_tools里面就有需要的adb.exe。
方法二: 直接下载SDK manager 包
我通过方法一,将SDK manager下载到目录 C:\Users\Public\Android,在其platform-tools目录下就有所需的adb.exe。
2. 设置环境变量,系统环境变量添加ANDROID_HOME
3. 系统Path变量添加adb.exe所在路径
安装模拟器
1. 下载安装模拟器
夜神模拟器要替换其自带的nox_adb.exe。
nox_adb.exe在夜神模拟器安装目录的bin目录下,我这是C:\Program Files (x86)\Nox\bin。把上面下载的adb.exe复制到nox_adb.exe所在目录并重命名成nox_adb,替换到原来的nox_adb.exe。
安装appium server
下载地址 https://github.com/appium/appium-desktop/releases/
亲测最新1.22.0的版本启动后会报找不到/Session路径的错误,用1.21.0的版本正常。
Appium 连接模拟器
1. 启动模拟器后,中通过命令 nox_adb.exe connect 127.0.0.1:$模拟器端口$ 连接模拟器
模拟器 | 端口号 |
夜神模拟器 | 62001、52001 |
逍遥模拟器 | 21503 |
海马玩模拟器 | 26944 |
mumu模拟器 | 7555 |
天天模拟器 | 6555 |
Genymotion | 5555 |
雷神模拟器 | 5555 |
蓝叠模拟器 | 每次启动不一样,可以到设置->高级->Android调试(ADB)查看 |
2. 启动Appium
直接通过desktop程序运行,或者命令行启动appium。
3. 打开Appium inspector工具,并填入以下信息,点击start session按钮即可连接,然后可以通过inspector工具查看元素的信息。
除了这三个信息,如果指定测试app,还可以提供和appActivity。这两个属性的获取方式如下:
方法一:
在上面提到的android sdk路径下,build_tool/$sdk_版本号$/ 路径里有aapt.exe, 使用以下命令:
aapt.exe dump badging $电脑上apk文件路径$
输出的信息中,package: name就是appPackage, launchable-activity就是appActivity
方法二:
adb shell dumpsys activity activities | findstr $app名$
以Chrom浏览器为例,通过命令可以得到输出intent={cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.chrome/org.chromium.chrome.browser.ChromeTabbedActivity}
其中cmp=里com.android.chrome是appPackage,org.chromium.chrome.browser.ChromeTabbedActivity是appActivity
4. python连接appium server, 并操Chrome浏览器
import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver import Remote
from appium.webdriver.webelement import WebElement as MobileWebElement
class AppiumClient:
def __init__(self, os_name: str, os_version: str, device_name: str):
self.caps = dict()
self.caps['platformName'] = os_name
self.caps['platformVersion'] = os_version
self.caps['deviceName'] = device_name
self.caps['resetKeyboard'] = True
self.driver: Remote = None
def __del__(self):
if self.driver:
self.driver.quit()
def launch_app(self, package: tuple = None, app_path=''):
"""
:param package: tuple (appPackage, appActivity)
:param app_path: apk path in PC
:return:
"""
try:
if app_path:
self.caps['app'] = app_path
if package:
self.caps['appPackage'] = package[0]
self.caps['appActivity'] = package[1]
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", self.caps)
return True
except Exception as e:
print(str(e))
return False
def find_element(self, who: str, by: str):
print('look for %s by %s' % (who, by))
element: MobileWebElement = self.driver.find_element(by, who)
return element
def click(self, who: str, by=AppiumBy.ID):
element = self.find_element(who, by)
if element:
print('click %s' % element)
element.click()
return True
else:
return False
def input(self, text: str, who: str, by=AppiumBy.ID):
element = self.find_element(who, by)
if element:
print("send text %s" % text)
element.click()
element.send_keys(text)
return True
else:
return False
def back(self):
print('back')
self.driver.back()
def wait_element(self, who: str, by=AppiumBy.ID, time_out=30):
for i in range(time_out):
element = self.find_element(who, by)
if element:
return True
else:
print('sleep 1s wait for %s' % who)
time.sleep(1)
print('wait %s more than %ds' % (who, time_out))
return False
def get_attributes(self, who: str, by=AppiumBy.ID):
element = self.find_element(who, by)
if element:
attributes = dict()
attributes['checkable'] = element.get_attribute('checkable')
attributes['long-clickable'] = element.get_attribute('long-clickable')
attributes['clickable'] = element.get_attribute('clickable')
attributes['checked'] = element.get_attribute('checked')
attributes['selected'] = element.get_attribute('selected')
attributes['text'] = element.get_attribute('text')
attributes['focused'] = element.get_attribute('focused')
return attributes
else:
return None
def print_all_element(self):
print(self.driver.page_source)
if __name__ == "__main__":
client = AppiumClient('Android', '7.1.2', 'OnePlus5')
client.launch_app(('com.android.chrome', 'org.chromium.chrome.browser.ChromeTabbedActivity'))
client.wait_element('com.android.chrome:id/url_bar') # 通过inspctor获得ID
print(client.get_attributes('com.android.chrome:id/url_bar'))
print(client.get_all_element())
input()