zoukankan      html  css  js  c++  java
  • 用命令方式启动、停止appium服务和app

    启动appium服务并监听一个端口命令:

    命令command==>  appium -a {ip} -p {port} -U {deviceName} -g {log}

    以shell命令方式执行命令,并输入日志到log文件:用subprocess需导入

    subprocess.Popen(command, stdout=open(LOG_PATH, 'a+'), stderr=subprocess.PIPE, shell=True)  #相当于再cmd窗口输入上面的命令command

    根据端口号查询是否已经启动服务:

    subprocess.getoutput('netstat -ano | findstr %s'%self.port)   #如果找到以启动端口包含port,则会返回对应信息,

    netstat -ano | findstr 1111   查询端口号1111的进程信息,从中可以获得pid

    启动模拟器或手机,访问服务监听的那个端口:

    webdriver.Remote('http://127.0.0.1:4723/wd/hub',dic)  #dic是模拟器或手机的设备信息和app信息

    根据pid查询进程信息,第一列就是进程名称

    tasklist | findstr 2472

     根据进程名称杀死改名成对应的所有进程:

    taskkill /F /IM node.exe /t   #node.exe是进程名

    根据pid杀死进程

    taskkill /pid 2472 -t -f  #2472是pid

    例子:

    yaml文件格式如下:内容为手机信息和app信息

    device_type: android
    tester:
      resetKeyboard: true
      appActivity: com.tencent.mobileqq.activity.SplashActivity
      appPackage: com.tencent.mobileqq
    #  appPackage: com.android.browser
    #  appActivity: .BrowserActivity
      noReset: False
      unicodeKeyboard: true
    devices:
      android:
        - port: 9009
          platformName: Android
          udid: emulator-5554
          platformVersion: 5.1.1
          name: 雷电a
          ip: 127.0.0.2
          deviceName: emulator-5554

    启动服务、测试服务是否启动、启动app

    from lib.tool import Tool
    from conf.setting import LOG_PATH
    from lib.log import logger
    from appium import webdriver
    import subprocess
    class Controller(object):
    def __init__(self):#初始化函数主要是对设备和app信息的获取
    self.tool=Tool()#tool类中写的有获取设备文件yaml数据的方法
    self.yml=self.tool.app_data#获取到yaml文件中的设备信息
    self.device_type=self.yml.get('device_type')
    self.device_name=self.yml.get('devices').get(self.device_type)[0].get('deviceName')
    self.devices=self.yml.get('devices')
    self.port=self.devices.get(self.device_type)[0].get('port')
    self.tester=self.yml.get('tester')
    # print(self.device_name)




    #taskkill -PID 4152 -F
    # 每次启动前都要kill掉所有的进程taskkill /F /IM node.exe /t

    def kill_server(self):

    #taskkill /F /IM node.exe /t 我们开启的appium进程名是node.exe
    logger.debug('执行[KILL SERVER]操作:%s' % subprocess.getoutput("taskkill /F /IM node.exe /t"))
    logger.debug('重启ADB服务!%s' % subprocess.getoutput("adb kill-server"))

    def start_server(self):#启动server
    device=self.devices.get(self.device_type)[0]

    #命令字符串
    command="appium -a {ip} -p {port} -U {deviceName} -g {log}".format(
    ip=device.get('ip'),
    port=device.get('port'),
    deviceName=device.get('deviceName'),
    log=LOG_PATH.replace('app_log.log',device.get('name')+'.log')

    )
    print(command)
    logger.debug('服务启动命令:%s'%command)

    #执行命令
    subprocess.Popen(command, stdout=open(LOG_PATH, 'a+'), stderr=subprocess.PIPE, shell=True)

    def test_server(self):
    while True:
    #查询是否端口已启动,即服务启动
    c=subprocess.getoutput('netstat -ano | findstr %s'%self.port)
    if c:

    logger.debug('启动成功。。。。')
    break
    else:
    logger.debug('启动失败,5s后重试')
    import time
    time.sleep(5)
    return True

    def start_driver(self):
    device=self.devices.get(self.device_type)[0]
    self.tester.update(device)
    # print(self.tester)
    driver=webdriver.Remote('http://{ip}:{port}/wd/hub'.format(
    ip=device.get('ip'),
    port=device.get('port')

    ),self.tester)


    if __name__=='__main__':
    controller=Controller()
    print(controller.device_name)
    controller.kill_server()
    controller.start_server()
    if controller.test_server():
    controller.start_driver()
     
  • 相关阅读:
    关于 web service 参数传递的序列化反序列化问题
    (转)GIS理论(墨卡托投影、地理坐标系、地面分辨率、地图比例尺、Bing Maps Tile System)
    (转)如何oracle调试存储过程
    word中字号和磅数的对应
    (转)C# 泛型相关讲解
    16 款最流行的 JavaScript 框架(转)
    mark:about 手势
    UIWebView
    android 无法安装ApiDemos
    Android开发中的单元测试
  • 原文地址:https://www.cnblogs.com/bendouyao/p/9461418.html
Copyright © 2011-2022 走看看