最近开始接触Appium自动化测试。代码小菜鸟又开始遇到无穷无尽的问题。特此记录走过的坑。
感谢此过程秋钱大神相助和各位同事的友情tip
按以下顺序开始你的自动化之旅吧
关于Appium安装,虽然虫师的文章是2015年的,但经本小菜鸟试验过,还是很好用的。里面appium, jdk, sdk安装都有。请参考虫师的appium安装传送门
关于UIAUTOMATOR先下下下~
使用Uiautomator需要满足:
Android SDK Tools, Revision 21 or higher
Android SDK Platform, API 16 or higher
更加详细信息 Read More:参考文章
1. Eclipse: Eclipse下载
2. Ant: Ant下载
具体安装参考:
a. 安装JDK, 设置环境变量。
b. 下载Ant, 得到一个压缩包,解压以后放在一个指定的目录下。设置ANT_HOME用户变量,然后在系统变量中添加bin目录。Win10上用%ANT_HOME%有时不可行,那就用绝对路径吧。
c. cmd->ant,回车以后看到以下代表成功了。
Buildfile: build.xml does not exist
Build failed
Ant传送门
3. 开始一个java project练练手(三张图送你happy)
依赖包的添加过程:创建一个新的java项目,Project->Properties->JavaBuildPath->Libraries a.Add Library->Junit->choose Junit3->Finish; b.Add External JARs->找到sdk->platforms下的一个androidXX(我选择了android23)->添加android.jar and uiautomator.jar。SDK相关请参考上面虫师传送门。
添加好依赖包,在src右键new一个新的package,自定义你需要的class name. 图一是一个简单的demo.
将编写好的测试代码打包。python刚过来java的银儿要养成时常保存代码的好习惯。
android-sdk-windows\tools>android create uitest-project -n AutoRunner -t 1 -p 项目路径。 1 是sdk id可以通过android list来查看
到工程的bin目录下运行ant build生产jar包(有遇到报错在bin目录下执行build.xml不存在,回到工程目录下执行ant build可以正常生产jar包,并不懂为什么~~)
说明 adb shell uiautomator runtest xxx.jar -c packagename.classname
到此,你可以看到设备上在跑你的脚本了。~~撒花
不过每次代码变动都需要重新打包,push,执行,烦烦烦~~后面把公用部分抽取出来做成公用接口。
另附上python实现登录实例:python这次载在对launch app后需要先对是否已经是登录状态做判断。可能段数太低,一个小小if condition竟然搞了半天才找对方向。用True&False对是否是登录状态做出一个判断,然后执行不同的操作。
device name: adb devices
查看android app的package name 和 activity
1. 打开AndroidManifest.xml 找到包含android.intent.action.MAIN 和 android.intent.category.LAUNCHER对应的Activity
2. 有apk的情况,命令行敲 aapt dump xmltree xxx.apk AndroidManifest.xml
3. 没有apk,程序已安装时。先输入下面的命令,然后打开要查看的APP
adb logcat -c
adb logcat ActivityManager:l *:s
4. 启动要查看的APP,然后输入命令adb shell dumpsys window w | findstr // | findstr name=
# coding: utf-8
import time
import unittest
from appium import webdriver
import os
def find_element_by_id_no_except(driver,identification):
try :
driver.find_element_by_id(identification)
return True
except Exception as e:
print (Exception,':',e)
return False
class Login_Logout(unittest.TestCase):
def setUp(self):
self.desired_caps = {}
self.desired_caps["platformName"] = "Android"
self.desired_caps["platformVersion"] = "4.3"
self.desired_caps["deviceName"] = "device name"
self.desired_caps["appPackage"] = "package name"
self.desired_caps["appActivity"] = ".activity"
self.desired_caps["unicodeKeyboard"] = True #使用unicodeKeyboard的编码方式来发送字符串
self.desired_caps["resetKeyboard"] = True #将键盘给隐藏起来
self.driver = webdriver.Remote("http://localhost:4723/wd/hub", self.desired_caps)
time.sleep(5)
def tearDown(self):
self.driver.quit()
def test_run(self):
#默认开启4723端口接受webdriver请求,做一个循环保证启动APP后一定会登录一次
for i in range(0,2):
self.driver.find_element_by_name("检测").click()
time.sleep(3)
elem = find_element_by_id_no_except(self.driver, "ivAvatar")
if elem !=True:
self.driver.find_element_by_name("登录").click()
time.sleep(3)
elem = self.driver.find_element_by_id("etName")
elem.clear()
elem.send_keys("telephone_number")
elem = self.driver.find_element_by_id("etPassword")
elem.clear()
elem.send_keys("password")
# swipeToUp(self.driver, 500)
time.sleep(3)
self.driver.find_element_by_id("btnLogin").click()
time.sleep(10)
WebDriverWait(self.driver, 20).until(lambda the_driver: the_driver.find_element_by_id("ivAvatar").is_displayed())
else:
self.driver.find_element_by_id("tv_car_start_check").click()
elem = find_element_by_id_no_except(self.driver, "etMeter")
if elem !=True:
time.sleep(1)
else:
self.driver.find_element_by_id("etMeter").send_keys("1000")
self.driver.find_element_by_id("btnOk").click()
time.sleep(10)
self.driver.back()
self.driver.find_element_by_id("ivAvatar").click()
self.driver.find_element_by_id("btnLogout").click()
time.sleep(2)
self.driver.find_element_by_name("确定").click()
time.sleep(3)
if __name__ == '__main__':
unittest.main(verbosity=2)
Q&R
1. 登录手机账号,输入的手机号输入混乱重复。
解决办法:使用unicode编码方式发送字符。绕过手机软键盘输入,输入中文前面加u,如(u"中文")。注意:运行该脚本后,手动输入会无法调出软键盘。这时候需要到设置,找到输入法,恢复默认输入法便可。
self.desired_caps["unicodeKeyboard"] = True self.desired_caps["resetKeyboard"] = True
2. ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
解决办法:马大哈的错误。极可能的原因是停止了appium。重新开启吧。