monkeyrunner进行多设备UI测试  
首先你要连接好多个手机
设置好已经连接好的手机的ip列表ipp = ['192xxx','192xxx']
杀掉之前所有appium进程subprocess.Popen('killall node',shell = True)
声明一个方法def start(ip):调用时需要把ipp传入
在方法中写for循环,循环内循环内用传入的ip来启动appium服务,注意要用不同的端口号启动,相差2以上
在循环中调用webdriver.Remote方法创建driver对象
在循环中创建脚本类的实例时,请在循环中创建,并且传入driver
8.声明多线程列表
在循环中用多线程创建该实例的方法的对象,并加入多线程列表
在main函数中,先调用start方法,填充好多线程的列表。然后再用for循环启动多线程列表。

下面上start方法代码:

def start(ip):
    for i in range(len(ip)):
    subprocess.Popen(‘/Applications/Appium.app/Contents/Resources/node/bin/node /Applications/Appium.app/Contents/Resources/node_modules/appium/build/lib/main.js –address “127.0.0.1” -p “’+str(4723+2*i)+’” –command-timeout “100” –automation-name “Appium” -U “’+ip[i]+’:’+str(5555+i)+’” >/tmp/1.txt’,shell=True)
    time.sleep(3.5)
    wzj = webdriver.Remote(‘http://localhost:’+str(4723+2*i)+’/wd/hub’, desired_caps)
    dingwei = DingWei(wzj, name)
    t = threading.Thread(target=dingwei.begin)
    tt.append(t)

上面的DingWei 是我的脚本类,其中的begin是类中的启动脚本的方法。下面上主函数的代码

if name == “main“:
    start(ipp)
    time.sleep(2)
    for i in tt:
    i.start()

下面是全套脚本:拿去用吧,自己改改。

# -*- coding:utf-8 -*-
from __future__ import division
import time
import datetime,subprocess
import unittest
import threading
from appium import webdriver
import os
import xlrd,xlwt,xlutils
from xlutils.copy import copy
import wx
from HTMLTestRunner import HTMLTestRunner
from appium.webdriver.common.touch_action import TouchAction
from appium.webdriver.common.touch_action import TouchAction

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1.1'
desired_caps['deviceName'] = 'hahaha'
desired_caps['appPackage'] = 'com.........blehunter.debug'
desired_caps['appActivity'] = 'com.........blehunter.ui.WelcomeActivity'
# desired_caps["unicodeKeyboard"] = "True"
# desired_caps["resetKeyboard"] = "True"
subprocess.Popen('killall node',shell=True)
ipp = ['192.168.0.171','192.168.0.175']
tt = []   #多线程对象
def server(ip):
    for i in range(len(ip)):
        name = "./new/"+str(ipp[i])+"*****"+time.ctime()+".xls"
        SZ = xlrd.open_workbook('./new/0.xls')
        ww = copy(SZ)
        ww.save(name)
        subprocess.Popen('/Applications/Appium.app/Contents/Resources/node/bin/node /Applications/Appium.app/Contents/Resources/node_modules/appium/build/lib/main.js --address "127.0.0.1" -p "'+str(4723+2*i)+'" --command-timeout "100"  --automation-name "Appium" -U "'+ip[i]+':'+str(5555+i)+'" >/tmp/1.txt',shell=True)
        time.sleep(3.5)
        wzj = webdriver.Remote('http://localhost:'+str(4723+2*i)+'/wd/hub', desired_caps)
        dingwei = DingWei(wzj, name)
        t = threading.Thread(target=dingwei.begin)
        tt.append(t)

class DingWei():
    def __init__(self,www,fname):
        self.wzj = www
        self.num = 0
        self.fname = fname
        self.SZ = xlrd.open_workbook(self.fname)
        self.sz = self.SZ.sheet_by_name("sheet1")
        self.ww = copy(self.SZ)
        self.nrows = self.sz.nrows
    def id(self,s):
        return self.wzj.find_element_by_id(s)
    ################
    def first_start(self):
        time.sleep(4)
        for i in range(7):
            try:
                self.wzj.swipe(1000, 1500, 180, 1500)
            except:
                self.wzj.swipe(400,706,90,706)
            time.sleep(0.2)
        time.sleep(3)
        try:
            self.wzj.find_element_by_id("com.........blehunter.debug:id/bt_guide_login").click()
        except:
            pass
        time.sleep(4)
        self.id('com.........blehunter.debug:id/et_phone').send_keys('18810437161')
        self.id('com.........blehunter.debug:id/et_phone_password').send_keys('qwerty')
        self.id('com.........blehunter.debug:id/btn_login').click()
        time.sleep(5)
    def chushihua(self):
        while 1:
            if self.m.is_enabled():
                try:
                    self.id('com.........blehunter.debug:id/tv_location_failed')
                except:
                    pass
                break
            else:
                pass
    def panduan(self,no):
        while 1:
            if self.m.is_enabled():
                try :
                    self.id('com.........blehunter.debug:id/tv_location_failed')
                    self.ww.get_sheet(0).write(no+1, 1, "failed")
                    os.remove(self.fname)
                    self.ww.save(self.fname)
                except :
                    self.ww.get_sheet(0).write(no+1, 1, "success")
                    os.remove(self.fname)
                    self.ww.save(self.fname)
                    self.num += 1
                break
            else:
                pass
    def begin(self):
        #self.first_start()
        self.wzj.implicitly_wait(10)
        b = self.wzj.find_element_by_xpath('//android.support.v7.widget.RecyclerView/android.widget.FrameLayout[2]/android.widget.ImageView')
        b.click()
        print self.wzj,u"初始次... "
        self.m = self.id('com.........blehunter.debug:id/iv_refresh_friend_location')
        self.chushihua()
        j = 0
        time0 = datetime.datetime.now()
        #总次数
        n = input(u'请输入测试次数,必须为整数!')
        for i in range(n):
            j += 1
            time.sleep(1)
            time1 = datetime.datetime.now()
            self.id('com.........blehunter.debug:id/iv_refresh_friend_location').click()
            self.panduan(i)
            time2 = datetime.datetime.now()
            self.ww.get_sheet(0).write(i+1, 2, "j")
            self.ww.get_sheet(0).write(i+1, 3, str(self.num))
            self.ww.get_sheet(0).write(i+1, 4, str(j-self.num))
            self.ww.get_sheet(0).write(i+1, 5, str((time2-time1).seconds))
            self.ww.get_sheet(0).write(i+1, 6, str(int((time2-time0).seconds)-j))
            os.remove(self.fname)
            self.ww.save(self.fname)
        self.ww.get_sheet(0).write(n+2, 0,str(((self.num)/n)*100)[:6]+'%' )
        os.remove(self.fname)
        self.ww.save(self.fname)

if __name__ == "__main__":
    server(ipp)
    time.sleep(2)
    for i in tt:
        i.start()

原文:https://blog.csdn.net/qq_22795513/article/details/53169416

monkeyrunner 进行多设备UI测试的更多相关文章

  1. WWDC15 Session笔记 - Xcode 7 UI 测试初窥

    https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...

  2. 使用uiautomator做UI测试

    转载~~~~~~~~~~~~~~~~~~~~~~~~ 若有侵权,请及时联系本博主,博主将第一时间撤销 在Android 4.1发布的时候包含了一种新的测试工具–uiautomator,uiautoma ...

  3. 使用uiautomatorviewer和uiautomator来做android的UI测试

    来自:http://university.utest.com    作者:Angelos Nakulas (All Authored Courses)      译者:Elaine00 目录 简介 什 ...

  4. [转载]使用uiautomator做UI测试

    这个只是单纯的mark一下.还没有认真去研究.鉴于最近也不会做手机的自动化测试,所以留作以后参考吧. 转自: http://blog.chengyunfeng.com/?p=504 在Android ...

  5. Google推出iOS功能性UI测试框架EarlGrey

    经过了一段时间的酝酿后,Google很高兴地宣布了EarlGrey,一款针对于iOS的功能性UI测试框架.诸如YouTube.Google Calendar.Google Photos.Google ...

  6. 在Android Studio中进行单元测试和UI测试

    本篇教程翻译自Google I/O 2015中关于测试的codelab,掌握科学上网的同学请点击这里阅读:Unit and UI Testing in Android Studio.能力有限,如有翻译 ...

  7. 4、Android UI测试

    为你的APP进行UI测试是为了确保不出现意料之外的结果,提升用户的体验.如果你需要验证你的APP UI的正确性,你需要养成创建UI测试的习惯. Espresso测试框架是由Android Testin ...

  8. H5测试点总结-UI测试、功能测试、兼容性测试、体验相关(弱网、资源、手机操作等)、安全性测试、性能测试

    一.概述 1.1 什么是H5 H5 即 HTML5,是最新的 Web 端开发语言版本,现如今,大多数手机 APP 页面会用 H5 实现,包括 PC Web 站点也会用它开发实现.所以 Web 的通用测 ...

  9. 一种新的自动化 UI 测试解决方案 Airtest Project

    今天分享一个自动化UI测试工具airtest——一款网易出品的基于图像识别面向游UI测试的工具,也支持原生Android App基于元素识别的UI自动化测试.主要包含了三部分:Airtest IDE. ...

随机推荐

  1. express上传图片

    var express = require('express') var app = express() var proxy = require('http-proxy-middleware') co ...

  2. linux c(一)Helloworld

    终端的屏幕上输入命令如下: 使用vi helloworld.c打开helloworld.c文件,写下如下代码:

  3. Hive HiveQL基础知识及常用语句总结

    基础语句 CREATE DROP 建表.删表 建表 -------------------------------------- -- 1. 直接建表 ------------------------ ...

  4. MySQL replace 和 replace into 的用法

    mysql replace实例说明: UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); REPLACE(str,from_str,to_str) 在字符串 st ...

  5. Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试

    文章目录 服务器集群搭建 Nginx---->php-fpm之间的优化 302机器 202机器 压力测试 搭建memcached.mysql(数据准备) 今晚就动手-.- 集群性能测试 服务器集 ...

  6. ng -v 不是内部或外部命令

    输入 npm install -g @angular/cli ng new my-app 提示ng -v 不是内部或外部命令 解决方法 1.安装过程中是否出错 原因可能是npm install -g  ...

  7. 13.JMeter 参数化、检查点、集合点

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  8. Cocos2d-x之引擎框架简介

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 1.cocos2d-x的设计思想 cocos2d-x分为导演,场景,图层,精灵,节点: (1).导演(Director):控制整个游戏的场 ...

  9. PHP定界符<<<的使用方法

    在web编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法——按字符串输出的话,使用PHP肯定要有大量的转义符来对字符串中的引号''/" ...

  10. swoole安装异步reids

    /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --enable-async ...