Python环境搭建以及appium简单实例+多台设备控制

一、基本环境搭建

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章