zoukankan      html  css  js  c++  java
  • appium---封装appium命令行

      前面我们把简单的页面逻辑,定位元素,已经定位方法都封装好了,但是还不支持一键启动,为什么呢?因为我们还要去打开appium才可以,那我们可以思考下,如果把appium命令行启动也封装起来,那是不是真的可以一键执行了?实现了自动化?

    appium参数配置

    在前面的版本中说明了,appium分为客户端和命令行的,在自动化中想要一键执行的话,如果通过客户端做成一键启动成本有点大,但是可以通过命令行去启动appium,这样简单易实现

    appium命令行安装:appium---命令行启动appium

    这里要提到一点,依然要用到命令行了,那肯定需要了解一些参数。参考地址:Appium 服务命令行参数

    命令行参数配置

    标志默认值描述例子

    --shell

    null

    进入 REPL 模式

    --localizable-strings-dir

    en.lproj

    IOS only: 定位 .strings所在目录的相对路径

    --localizable-strings-dir en.lproj

    --app

    null

    iOS: 基于模拟器编译的 app 的绝对路径或者设备目标的 bundle_id; Android: apk 文件的绝对路径--app /abs/path/to/my.app

    --ipa

    null

    (IOS-only) .ipa 文件的绝对路径

    --ipa /abs/path/to/my.ipa

    -U--udid

    null

    连接物理设备的唯一设备标识符

    --udid 1adsf-sdfas-asdf-123sdf

    -a--address

    0.0.0.0

    监听的 ip 地址

    --address 0.0.0.0

    -p--port

    4723

    监听的端口

    --port 4723

    -ca--callback-address

    null

    回调IP地址 (默认: 相同的IP地址)

    --callback-address 127.0.0.1

    -cp--callback-port

    null

    回调端口号 (默认: 相同的端口号)

    --callback-port 4723

    -bp--bootstrap-port

    4724

    (Android-only) 连接设备的端口号

    --bootstrap-port 4724

    -k--keep-artifacts

    false

    弃用,无效。trace信息现在保留tmp目录下,每次运行前会清除该目录中的信息。 也可以参考 –trace-dir 。

    -r--backend-retries

    3

    (iOS-only) 遇到 crash 或者 超时,Instrument 重新启动的次数。

    --backend-retries 3

    --session-override

    false

    允许 session 被覆盖 (冲突的话)

    --full-reset

    false

    (iOS) 删除整个模拟器目录。 (Android) 通过卸载应用(而不是清除数据)重置应用状态。在 Android 上,session 完成后也会删除应用。

    --no-reset

    false

    session 之间不重置应用状态 (iOS: 不删除应用的 plist 文件; Android: 在创建一个新的 session 前不删除应用。)

    -l--pre-launch

    false

    在第一个 session 前,预启动应用 (iOS 需要 –app 参数,Android 需要 –app-pkg 和 –app-activity)

    -lt--launch-timeout

    90000

    (iOS-only) 等待 Instruments 启动的时间

    -g--log

    null

    将日志输出到指定文件

    --log /path/to/appium.log

    --log-level

    debug

    日志级别; 默认 (console[:file]): debug[:debug]

    --log-level debug

    --log-timestamp

    false

    在终端输出里显示时间戳

    --local-timezone

    false

    使用本地时间戳

    --log-no-colors

    false

    不在终端输出中显示颜色

    -G--webhook

    null

    同时发送日志到 HTTP 监听器

    --webhook localhost:9876

    --native-instruments-lib

    false

    (IOS-only) iOS 内建了一个怪异的不可能避免的延迟。我们在 Appium 里修复了它。如果你想用原来的,你可以使用这个参数。

    --app-pkg

    null

    (Android-only) 你要运行的apk的java包。 (例如, com.example.android.myApp)

    --app-pkg com.example.android.myApp

    --app-activity

    null

    (Android-only) 打开应用时,启动的 Activity 的名字(比如, MainActivity)

    --app-activity MainActivity

    --app-wait-package

    false

    (Android-only) 你想等待的 Activity 的包名。(比如, com.example.android.myApp)

    --app-wait-package com.example.android.myApp

    --app-wait-activity

    false

    (Android-only) 你想等待的 Activity 名字(比如, SplashActivity)

    --app-wait-activity SplashActivity

    --android-coverage

    false

    (Android-only) 完全符合条件的 instrumentation 类。 作为命令 adb shell am instrument -e coverage true -w 的 -w 的参数

    --android-coverage com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation

    --avd

    null

    (Android-only) 要启动的 avd 的名字

    --avd-args

    null

    (Android-only) 添加额外的参数给要启动avd

    --avd-args -no-snapshot-load

    --device-ready-timeout

    5

    (Android-only) 等待设备准备好的时间,以秒为单位

    --device-ready-timeout 5

    --safari

    false

    (IOS-Only) 使用 Safari 应用

    --device-name

    null

    待使用的移动设备名字

    --device-name iPhone Retina (4-inch), Android Emulator

    --platform-name

    null

    移动平台的名称: iOS, Android, or FirefoxOS

    --platform-name iOS

    --platform-version

    null

    移动平台的版本

    --platform-version 7.1

    --automation-name

    null

    自动化工具的名称: Appium or Selendroid

    --automation-name Appium

    --browser-name

    null

    移动浏览器的名称: Safari or Chrome

    --browser-name Safari

    --default-device-dd

    false

    (IOS-Simulator-only) 使用instruments自己启动的默认模拟器

    --force-iphone

    false

    (IOS-only) 无论应用要用什么模拟器,强制使用 iPhone 模拟器

    --force-ipad

    false

    (IOS-only) 无论应用要用什么模拟器,强制使用 iPad 模拟器

    --language

    null

    iOS / Android 模拟器的语言

    --language en

    --locale

    null

    Locale for the iOS simulator / Android Emulator

    --locale en_US

    --calendar-format

    null

    (IOS-only) iOS 模拟器的日历格式

    --calendar-format gregorian

    --orientation

    null

    (IOS-only) 初始化请求时,使用 LANDSCAPE (横屏) 或者 PORTRAIT (竖屏)

    --orientation LANDSCAPE

    --tracetemplate

    null

    (IOS-only) 指定 Instruments 使用的 tracetemplate 文件

    --tracetemplate /Users/me/Automation.tracetemplate

    --show-sim-log

    false

    (IOS-only) 如果设置了, iOS 模拟器的日志会写到终端上来

    --show-ios-log

    false

    (IOS-only) 如果设置了, iOS 系统的日志会写到终端上来

    --nodeconfig

    null

    指定 JSON 格式的配置文件 ,用来在 selenium grid 里注册 appiumd

    --nodeconfig /abs/path/to/nodeconfig.json

    -ra--robot-address

    0.0.0.0

    robot 的 ip 地址

    --robot-address 0.0.0.0

    -rp--robot-port

    -1

    robot 的端口地址

    --robot-port 4242

    --selendroid-port

    8080

    用来和 Selendroid 交互的本地端口

    --selendroid-port 8080

    --chromedriver-port

    9515

    ChromeDriver运行的端口

    --chromedriver-port 9515

    --chromedriver-executable

    null

    ChromeDriver 可执行文件的完整路径

    --use-keystore

    false

    (Android-only) 设置签名 apk 的 keystore

    --keystore-path

    (Android-only) keystore 的路径

    --keystore-password

    android

    (Android-only) keystore 的密码

    --key-alias

    androiddebugkey

    (Android-only) Key 的别名

    --key-password

    android

    (Android-only) Key 的密码

    --show-config

    false

    打印 Appium 服务器的配置信息,然后退出

    --no-perms-check

    false

    跳过Appium对是否可以读/写必要文件的检查

    --command-timeout

    60

    默认所有会话的接收命令超时时间 (在超时时间内没有接收到新命令,自动关闭会话)。 会被新的超时时间覆盖

    --keep-keychains

    false

    (iOS) 当 Appium 启动或者关闭的时候,是否保留 keychains (Library/Keychains)

    --strict-caps

    false

    如果所选设备是appium不承认的有效设备,会导致会话失败

    --isolate-sim-device

    false

    Xcode 6存在一个bug,那就是一些平台上如果其他模拟器设备先被删除时某个特定的模拟器只能在没有任何错误的情况下被建立。这个选项导致了Appium不得不删除除了正在使用设备以外其他所有的设备。请注意这是永久性删除,你可以使用simctl或xcode管理被Appium使用的设备类别。

    --tmp

    null

    可以被Appium用来管理临时文件的目录(绝对路径),比如存放需要移动的内置iOS应用程序。 默认的变量为 APPIUM_TMP_DIR ,在 *nix/Mac 为 /tmp 在windows上使用环境便令 TEMP 设定的目录。

    --trace-dir

    null

    用于保存iOS instruments trace的 appium 目录,是绝对路径, 默认为 /appium-instruments

    --intent-action

    android.intent.action.MAIN

    (Android-only) 用于启动 activity 的intent action

    --intent-action android.intent.action.MAIN

    --intent-category

    android.intent.category.LAUNCHER

    (Android-only) 用于启动 activity 的intent category

    --intent-category android.intent.category.APP_CONTACTS

    --intent-flags

    0x10200000

    (Android-only) 启动 activity 的标志

    --intent-flags 0x10200000

    --intent-args

    null

    (Android-only) 启动 activity 时附带额外的 intent 参数

    --intent-args 0x10200000

    --suppress-adb-kill-server false (Android-only) 如果被设定,阻止Appium杀掉adb实例。

    封装appium

    1、封装Dos命令

    因为appium命令启动需要依赖于Dos命令,这里先把Dos命令封装进来,这里加上了获取设备信息,后面我们需要传入到appium中,这里封装了三种方法。

    # coding:utf-8
    # dos_cmd.py
    import os class Dos_adb: def get_adb_result(self,command): ''' :param command: Dos中输入内容 :return: 返回解决内容 ''' adb_result = os.popen(command).read().split(' ') return adb_result def get_device(self): ''' 获取到设备信息 ''' xx = Dos_adb() devices = [] result_list = xx.get_adb_result('adb devices') result = [x for x in result_list if x != ''] if len(result)>1: for i in result: if 'List' in i: continue de = i.split(' device') devices.append(de[0]) return devices else: return None def get_adb(self,command): ''' 执行adb 命令: ''' os.system(command) if __name__ == '__main__': x= Dos_adb() x.get_adb_result('appium')

    2、封装appium读取设备信息

    这里也直接把设备信息全部封装进来了,如果多设备的话就不能这样写了。这里也可以把设备信息封装在yaml中,方法不唯一。

    # coding:utf-8
    # appium_start.py
    from appium import webdriver from common.dos_cmd import Dos_adb import os path =os.path.dirname(os.getcwd())
    # appium日志路径 appium_log
    = os.path.join(os.path.join(path,'logs'),'appium_log.txt') class Appium_start(): def Android_device(self): '''启动app''' desired_caps = { 'platformName': 'Android', # 测试版本 'platformVersion': '5.1.1', # 系统版本 "appPackage": "com.taobao.taobao", # app包名 "appActivity": "com.ali.user.mobile.login.ui.UserLoginActivity", # 启动launch Activity "noReset": True, # 不清空数据 "unicodeKeyboard": True, # 使用Unicode编码方式发送字符串 "resetKeyboard": True, # 键盘隐藏起来 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) return driver def start(self): ''' 启动appium ''' adb = Dos_adb() devices = adb.get_device()[0] a = 'appium -p 4723 -U '+devices +' --log %s' %appium_log adb.get_adb(a) if __name__ == '__main__': xx = Appium_start() xx.start() xx.Android_device()

    3、执行用例

    这里我们在前面的封装用例的基础上进行了更改,把封装的appium通过多线程的方法进行执行。

    # coding:utf-8
    # start_login.py
    
    from pages.login_page import LoginPage
    import time
    import os
    from common.appium_start import Appium_start
    import threading
    path  =os.path.dirname(os.getcwd())
    # 获取到yaml文件路径
    yaml_path = os.path.join(os.path.join(path,'config'),'element.yaml')
    class BaseDriver:
        def login(self,driver):
                page =LoginPage(driver)
                time.sleep(8)
                # 获取用户名元素以及输入内容
                use = page.get_username_element(yaml_path)
                use.send_keys('1111')
                # 获取密码元素以及输入内容
                pas = page.get_password_element(yaml_path)
                pas.send_keys('22222')
                # 进行点击登录
                button = page.get_login_button_element(yaml_path)
                button.click()
    
    if __name__ == '__main__':
        t2 = threading.Thread(target=Appium_start().start)
        t2.start()
        time.sleep(20)
        xx= Appium_start().Android_device()
        t1 = threading.Thread(target=BaseDriver().login(xx))
        t1.start()

    这里需要注意的是我们通过代码启动appium的过程中需要用到多线程,因为appium启动完成后,没有办法进行继续执行其他的代码

    感谢您的关注,哪里不懂的可以下方留言,看到后第一时间回复

    
    
  • 相关阅读:
    Python抓取妹子图,内含福利
    我是如何通过一部动漫学习英语的?
    SqlServer,Oracle,db2,MySql查询表索引
    cmd命令大全
    资源推荐:PPT快闪资源合集附配套字体下载
    安卓抖音全球地区版
    tomcat的Server.xml详解和Host的配置
    Java总结篇系列:Java多线程(三)
    Java总结篇系列:Java多线程(二)
    Java总结篇系列:Java多线程(一)
  • 原文地址:https://www.cnblogs.com/qican/p/12804284.html
Copyright © 2011-2022 走看看