原创python:windows解决genymotion appium adb 的问题。
首先请安装好genymotion 与并用其下载好要用的安卓版本。
(其中Oracle VM VirtualBox可以自己单独安装也可以在下载genymotion时选择包含vbox的)
参考https://www.cnblogs.com/whycxb/p/6850454.html
出现安装好安卓rom后没办法启动的,一般要在vbox的文件夹drivers\vboxdrv找到vboxdrv.inf 右键安装。不行,请自行百度。
主要是你要有adb应用程序,我这里选择的是原生安卓sdk附带的。(要设置环境变量)用genymotion的adb的话,在cmd启动adb前也是要把其路径加入环境变量。方法不赘述。
cmd > adb devices
可能会出现各种问题。 如果是找不到设备的。我网上查了好多方法都不行。
因为geny启动安卓模拟系统会启动adb ,很多人觉得应该是5037端口被占用了,你只要保证geny启用的adb与你cmd环境变量的adb是同一个就没有问题。
(假如你是被其他手机助手占用,请关闭手机助手,并结束adb)
taskkill /im adb.exe /f
主要你要做以下cmd命令
adb kill-server adb start-server adb devices
正常的话会出现设备了:
安装 appium
1。安装 appium-desktop (可视化的appium)
下载地址:https://github.com/appium/appium-desktop/releases/latest
说明下:找到相应的版本安装。这个没有必要设置环境变量。弄个桌面快捷方式就好了。
如果你不是为了ui界面来查找元素
2。你还可以选择无界面的命令行版appium。
jdk ->nodejs -> andriod sdk -> 安装appium -> appium-python-client
特别说明下安装appium时候可能会出错ctrl+c终止在重试,多试几次,很耗时。看你要选择npm国内镜像还是国外的。我建议网速还行的选择国外,安装完成比较不会出错。
npm install appium -g 安装好的appium不是exe格式,而是命令文件appium.cmd,路径:C:\Users\Administrator\AppData\Roaming\npm 你可以考虑加入环境变量。但是我用 appium -p 4723 -bp 4783启动是却出现了appium-desk的可视化版。所以推荐用python代码用
1 testlog=open(r'test.log','w',encoding='utf-8') 2 subprocess.Popen("C:\\Users\\Administrator\\AppData\\Roaming\\npm\\appium.cmd -p 4723 -bp 4783",stdout=testlog,shell=True)
最后放段小代码,大家参考下python3.6.
1 #coding=utf-8 2 #author='Shichao-Dong' 3 from appium import webdriver 4 import unittest,os 5 import time 6 import subprocess 7 #desired_caps这个要是 字典格式,value必须是字符串。不然会出错。 8 desired_caps = {} 9 desired_caps['platformName'] = 'Android' 10 desired_caps['platformVersion'] = '6.0' 11 desired_caps['deviceName'] = 'MIX 2' 12 desired_caps['appPackage'] = 'com.sqsm.aimer' 13 desired_caps['appActivity'] = 'com.sqsm.aimer.activity.ActSplash' 14 desired_caps['noReset'] = 'true' #这个解定是否重新启动。默认是false相当于彻底退出程序进去,登录过的也要重新登。true是保持现状,不用重新登录。 15 desired_caps['fullReset'] = 'false' 16 subprocess.call('adb devices') #验证是否可以获取设备 17 testlog=open(r'test.log','w',encoding='utf-8') 18 #这个是启动命令行版appium,并把输出打印在test.log文件里,不然python consols太杂了。 19 subprocess.Popen("C:\\Users\\Administrator\\AppData\\Roaming\\npm\\appium.cmd -p 4723 -bp 4783",stdout=testlog,shell=True) 20 testlog.close() 21 time.sleep(10) 22 driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) 23 time.sleep(2) 24 25 def login_func(): 26 driver.find_element_by_id('com.sqsm.aimer:id/login_login_edit_txt').send_keys('1380000000') 27 driver.find_element_by_id('com.sqsm.aimer:id/password_get_txt').click() 28 driver.find_element_by_id('com.sqsm.aimer:id/login_login_edit_txt').click() 29 # c=input("请输入你收到的验证码:") 30 c=getCodeFromSms() 31 driver.find_element_by_id('com.sqsm.aimer:id/password_login_edit_txt').send_keys(c) 32 driver.find_element_by_id('com.sqsm.aimer:id/login_btn').click() 33 time.sleep(10) 34 if driver.find_element_by_id('com.sqsm.aimer:id/aimer_img'): 35 return 1 36 else: 37 return 0 38 #用adb 截取收到的短信验证码,这个由于不是真机,所以只能手动输入。 39 def getCodeFromSms(timeout=20): 40 # os.system('adb kill-server') 41 # os.system('adb start-server') 42 # os.system('adb devices') 43 subprocess.call("adb logcat -c") 44 cmd = 'adb logcat -d |findstr D/Mms/Txn' 45 n = 0 46 print('xxxxx') 47 while n < timeout: 48 smscode = os.popen(cmd).read() 49 print(smscode) 50 if smscode != "": 51 smscode = smscode.split("验证码:")[1].split(",")[0] 52 print("code is {}:".format(smscode)) 53 return (smscode) 54 # break 55 else: 56 time.sleep(1) 57 n += 1 58 print('已等待:{}秒'.format(n)) 59 continue 60 print('短信接收失败!') 61 a=input('请输入你收到的验证码:') 62 return a 63 64 class TestUi(unittest.TestCase): 65 def setUp(self): 66 super().__init__() 67 68 def tearDown(self): 69 super().__init__() 70 driver.quit() 71 def test_login(self): 72 self.assertEqual(login_func(),1,"test result:login function is ok") 73 time.sleep(5) 74 75 76 if __name__ == '__main__': 77 try: 78 unittest.main() 79 finally: 80 os.popen("taskkill /f /im node.exe") 81 82 driver.quit() 83
知识无穷尽也。