一、基本环境搭建
1、下载Windows Python可执行安装包,链接如下:https://www.python.org/downloads/windows/
选中安装包进行下载,我这里选中的是3.6.7,倾向于稳定的安装包,云盘也有。
2、下载好启动执行文件,这里我选中默认安装(install now),安装之前勾选下方选项,Python环境自动搭建
3、安装成功后打开cmd,输入python,显示内容如下即安装成功。你可以在当前页面输入python代码
你也可以在启动栏中查看python自带的ide,并编写代码
二、安装常用的开发工具pycharm
1、官网链接如下:https://www.jetbrains.com/pycharm/,点击下载即可
选择默认安装,傻瓜式安装即可,注意选中64bit
三、创建python项目
1、打开pycharm,选择左上角file,选中new project,创建项目,再创建一个python file即可。跟java的类似。
注意:创建项目时选中编译版本
2、在编辑页面中敲入代码,鼠标右击,选择run+项目,编译运行。右上角点击运行也可以。
四、利用Appium+python对安卓手机进行操作
1、这里利用百度导航进行试验,appium的安装以及录制参照
https://blog.csdn.net/Eayonz/article/details/106015720
此文章。
2、此次试验用的是夜神模拟器,系统版本5.1.1,机型是127.0.0.1:62001,试验内容是重新安装软件,并进行地名搜索,并截图存放至D盘
3、代码如下:
# This sample code uses the Appium python client
# pip install Appium-Python-Client
# Then you can paste this into a file and simply run with Python
from time import sleep
from appium import webdriver
caps = {}
caps["platformName"] = "Android"
caps["platformVersion"] = "5.1.1"
caps["deviceName"] = "127.0.0.1:62001"
caps["appPackage"] = "com.baidu.BaiduMap"
caps["appActivity"] = "com.baidu.baidumaps.MapsActivity"
caps["unicodeKeyboard"] = True
caps["resetKeyBoard"] = True
caps["noReset"]="true"
caps["fullReset"]="false"
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
sleep(2)#等待2秒,防止运行太快程序退出
el1 = driver.find_element_by_id("com.baidu.BaiduMap:id/ok_btn")
el1.click()
el2 = driver.find_element_by_id("android:id/button1")
el2.click()
el3 = driver.find_element_by_id("com.baidu.BaiduMap:id/btn_enter_map")
el3.click()
el4 = driver.find_element_by_id("com.baidu.BaiduMap:id/guide_close")
el4.click()
el5 = driver.find_element_by_accessibility_id("搜索地点、公交和路线")
el5.click()
el6 = driver.find_element_by_id("com.baidu.BaiduMap:id/tvSearchBoxInput")
el6.click()
el6.send_keys("北京")
sleep(2)
driver.save_screenshot('D:/foo.png')#截图存放至D盘
el7 = driver.find_element_by_id("com.baidu.BaiduMap:id/tvSearchButton")
el7.click()
driver.quit()
4、如果没有from appium import webdriver,webdriver会报错,此时光标移至报错处,点击导入文件,pycharm会自动下载需要的包并给你导入,不像java的还要自己手动导入jar包,此处python比java方便多了。
5、当运行时driver报错,而代码中pycharm没有报错,此时abd检查设备是否接入。
adb devices
6、while循环执行
要注意n=1与while n<10下方的代码要有缩进,否则会报错。
n=1
while n<10:
caps = {}
caps["platformName"] = "Android"
caps["platformVersion"] = "5.1.1"
caps["deviceName"] = "127.0.0.1:62001"
XXXX
XXXX
XXXX
n+=1
7、appium中文字符输入
caps["unicodeKeyboard"] = True
caps["resetKeyBoard"] = True
网上一大堆True这边加了双引号,报错resetKeyBoard、unicodeKeyboard需要布尔类型,后来发现caps[“unicodeKeyboard”] = True
caps[“resetKeyBoard”] = True
大写True这边是不需要加上双引号的,小写true的时候才需要加上双引号
caps[“unicodeKeyboard”] = “true”
caps[“resetKeyBoard”] = "true"
8、设备不每次重新安装启动
caps["noReset"]="true"
caps["fullReset"]="false"
五、appium控制多台设备进行操作
1、在appium中进行下图的设置,advanced中设置Server Port以及Bootstrap Port,写好后点击右下角的save进行保存,一般端口累加比较好记。接下来在presets中查看保存信息并可执行server。
注意:开了几台设备就要对应开几个服务器界面。如果你安装了命令版本的可以直接在命令窗口启动服务,命令为:
appium -p 4723 -U 127.0.0.1:62001 -bp 4724
appium -p 4725 -U 127.0.0.1:62025 -bp 4726
夜神模拟器第一个模拟器udid一般为:127.0.0.1:62001,对应端口4723,4724;第二个模拟器udid一般为:127.0.0.1:62025,对应端口4725,4726
2、在代码中要有多线程
threads = []
t1 = threading.Thread(target=task2)
threads.append(t1)
t2 = threading.Thread(target=task1)
threads.append(t2)
if __name__ == '__main__':
for t in threads:
t.start()
其中开启多台设备必须指定udid参数,caps[‘udid’] = “127.0.0.1:62001”,udid参数即是adb devices中显示出来的设备id
如下代码主要是实现app注册人员:定位到主页面,点击注册按钮,点击上传图片,输入姓名,输入有效期,选择分组,点击提交。完整代码如下:
import threading
import time
from time import sleep
from appium import webdriver
caps = {}
caps["noReset"] = "true"
caps["fullReset"] = "false"
caps["unicodeKeyboard"] = "true"
caps["resetKeyBoard"] = "true"
caps["platformName"] = "Android"
caps["platformVersion"] = "5.1.1"
caps["deviceName"] = "127.0.0.1:62001"
caps['udid'] = "127.0.0.1:62001"
caps["appPackage"] = "com.xx.xx"
caps["appActivity"] = "com.xx.xx.main.view.MainActivity"
caps1 = {}
caps1["noReset"] = "true"
caps1["fullReset"] = "false"
caps1["unicodeKeyboard"] = "true"
caps1["resetKeyBoard"] = "true"
caps1["platformName"] = "Android"
caps1["platformVersion"] = "5.1.1"
caps1["deviceName"] = "127.0.0.1:62025"
caps1['udid'] = "127.0.0.1:62025"
caps1["appPackage"] = "com.xx.xx"
caps1["appActivity"] = "com.xx.xx.main.view.MainActivity"
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
def task1():
el1 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.view.View/android.widget.ScrollView/android.widget.RelativeLayout/android.widget.RelativeLayout[2]/android.widget.LinearLayout[3]/android.widget.ImageView")
el1.click()
# i = 1963
# while i < 5000:
el1 = driver.find_element_by_id("com.xx.xx:id/tv_picture")
el1.click()
el2 = driver.find_element_by_id("com.xx.xx:id/tv_select_album")
el2.click()
el3 = driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.GridView/android.widget.FrameLayout[1]/android.widget.ImageView")
el3.click()
el4 = driver.find_element_by_id("com.xx.xx/btn_crop_confirm")
el4.click()
el5 = driver.find_element_by_id("com.xx.xx/tv_name")
el5.click()
el6 = driver.find_element_by_id("com.xx.xx/et_data")
el6.click()
# el6.send_keys("A注册%d" % i)
el6.send_keys("双机测试00000")
el6.click()
el7 = driver.find_element_by_id("com.xx.xx/btn_right")
el7.click()
el8 = driver.find_element_by_id("com.xx.xx/tv_valid_period")
el8.click()
el9 = driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.View/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.TextView")
el9.click()
el1 = driver.find_element_by_id("com.xx.xx/tv_group")
el1.click()
sleep(1)
el2 = driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.View[2]/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.TextView[1]")
el2.click()
el13 = driver.find_element_by_id("com.xx.xx/tv_save")
el13.click()
sleep(15)
el14 = driver.find_element_by_id("com.xx.xx/tv_positive")
el14.click()
# print("循环执行%d" % i)
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))#时间输出
# i += 1
driver2 = webdriver.Remote("http://localhost:4725/wd/hub", caps1)
def task2():
el1 = driver2.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.view.View/android.widget.ScrollView/android.widget.RelativeLayout/android.widget.RelativeLayout[2]/android.widget.LinearLayout[3]/android.widget.ImageView")
el1.click()
# i = 526
# while i < 5000:
el1 = driver2.find_element_by_id("com.xx.xx/tv_picture")
el1.click()
el2 = driver2.find_element_by_id("com.xx.xx/tv_select_album")
el2.click()
el3 = driver2.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.GridView/android.widget.FrameLayout[1]/android.widget.ImageView")
el3.click()
el4 = driver2.find_element_by_id("com.xx.xx/btn_crop_confirm")
el4.click()
el5 = driver2.find_element_by_id("com.xx.xx/tv_name")
el5.click()
el6 = driver2.find_element_by_id("com.xx.xx/et_data")
el6.click()
el6.send_keys("双机测试11111")
el6.click()
el7 = driver2.find_element_by_id("com.xx.xx/btn_right")
el7.click()
el8 = driver2.find_element_by_id("com.xx.xx/tv_valid_period")
el8.click()
el9 = driver2.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.View/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.TextView")
el9.click()
el1 = driver2.find_element_by_id("com.xx.xx/tv_group")
el1.click()
sleep(1)
el2 = driver2.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.View[2]/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.TextView[1]")
el2.click()
el13 = driver2.find_element_by_id("com.xx.xx/tv_save")
el13.click()
sleep(15)
el14 = driver2.find_element_by_id("com.xx.xx/tv_positive")
el14.click()
# print("循环执行%d" % i)
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))#时间输出
# i += 1
threads = []
t1 = threading.Thread(target=task2)
threads.append(t1)
t2 = threading.Thread(target=task1)
threads.append(t2)
if __name__ == '__main__':
for t in threads:
t.start()
# driver.quit()