天天看點

使用Python啟動appium

import os

import subprocess

import multiprocessing

import time

import pytest

from appium import webdriver

from selenium.webdriver.support.wait import WebDriverWait

from time import sleep

# 關于appium的啟動

# 1、桌面版(咱們現在用的):

# 運作方式一:點選軟體圖示

# 運作方式二:

# cmd指令行運作appium:

# appium的路徑:C:/Users/jeff.xie/AppData/Roaming/npm/node_modules/appium/build/lib

# ①CD切換上的路徑

# ②dir(列出檔案)

# ③找到main.js後執行node main.js

# 參數 -p:指定端口

# 參數 -g:指定儲存appium日志檔案的路徑

# node main.js -g D:\appium_log\log.log

# 2、服務版(指令行啟動)

# cmd中輸入appium指令即可啟動

# 參數 -p:指定端口

# 參數 -g:指定儲存appium日志檔案的路徑

# 3、通過python代碼啟動appium

# ①main.js路徑下執行指令:node main.js

# ②通過端口查找進行id:netstat -ano|findstr端口

# ③關閉程序:taskkill /F /PID程序id

# 切換到appium的main.js所在路徑

main_js_path= r"C:/Users/jeff.xie/AppData/Roaming/npm/node_modules/appium/build/lib";

os.chdir(main_js_path)

# 執行cmd指令

# os.system('node main.js')

os.system(r'node main.js -p 7890 -g D:\appium_log\log')

# 注意點:os.system會堵塞代碼繼續往下執行

# 執行測試代碼(直接這樣運作測試時不行的)

# pytest.main()

print("aaaa")

def start_appium():

"""啟動appium"""

# 使用另外的子產品

# appium_server_path = r'C:\Users\Admin\AppData\Local\Programs\Appium' \

# r'\resources\app\node_modules\appium\build\lib\main.js'

os.chdir(main_js_path)

port = 4723

appium_log_path = r'D:\appium_log\log{}.log'.format(port)

subprocess.Popen('node main.js -p {} -g {}'.format(port, appium_log_path),

stdout=subprocess.STDOUT,

stderr=subprocess.PIPE,

shell=True).communicate()

sleep(10)

print("KKKKKKK")

desired_caps = {}

# 系統

desired_caps['platformName'] = 'Android'

#手機版本,在手機中:設定--關于手機 #指令行擷取手機的版本号:adb -s da79fc70 shell getprop ro.build.version.release

desired_caps['platformVersion'] = '10'

# 裝置号 adb devices

desired_caps['deviceName'] = 'emulator-5554'

# 包名 指令行擷取包名和啟動名:adb shell dumpsys window windows | findstr mFocusedApp

desired_caps['appPackage'] = 'com.android.settings'

# 啟動名

desired_caps['appActivity'] = 'com.android.settings.Settings'

desired_caps["resetKeyboard"] = "True"#程式結束時重置原來的輸入法

desired_caps["noReset"] = "True"#不初始化手機app資訊(類似不清除緩存)

# 聲明手機驅動對象

driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)

WebDriverWait(driver,60)

sleep(2)

print("Open app")

sleep(10)

driver.update_settings({"getMatchedImageResult": True})

el = driver.find_element_by_image('D:/Battery.png')

el.click();

if __name__ == '__main__':

# 建立一個程序去啟動appium

p = multiprocessing.Process(target=start_appium)

p.start()

time.sleep(10)

# 運作測試用例

pytest.main()

  1. """
  1. appium啟動/關閉處理類
  1. """
  1. import subprocess
  1. import os,sys
  1. import time
  1. def stop_appium(port):
  1. mac_cmd = f"lsof -i tcp:{port}"
  1. win_cmd = f"netstat -ano | findstr {port}"
  1. # 判斷作業系統
  1. os_platform = sys.platform
  1. print('作業系統:',os_platform)
  1. # #windows 系統
  1. if os_platform == "win32":
  1. win_p = subprocess.Popen(win_cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  1. for line in win_p.stdout.readlines():
  1. if line:
  1. line = line.decode('utf8')
  1. if "LISTENING" in line:
  1. win_pid = line.split("LISTENING")[1].strip()
  1. os.system(f"taskkill -f -pid {win_pid}")
  1. else:
  1. # unix系統
  1. p = subprocess.Popen(mac_cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  1. for line in p.stdout.readlines():
  1. line = line.decode('utf8')
  1. if "node" in line:
  1. stdoutline = line.split(" ")
  1. # print(stdoutline)
  1. pid = stdoutline[4]
  1. os.system(f"kill {pid}")
  1. def start_appium(port):
  1. """
  1. 啟動appium 服務
  1. :param port: 服務的端口号
  1. :return:
  1. """
  1. stop_appium(port)
  1. cmd = f"appium -p {port}"
  1. logsdir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "logs")
  1. appium_logs = os.path.join(logsdir,"appium-logs")
  1. if not os.path.exists(appium_logs):
  1. os.mkdir(appium_logs)
  1. log_name = str(port) + '-' + time.strftime('%Y_%m_%d') +".log"
  1. appium_logs_dirName = os.path.join(appium_logs,log_name)
  1. subprocess.Popen(cmd, shell=True, stdout=open(appium_logs_dirName, mode='a', encoding="utf8"),
  1. stderr=subprocess.PIPE)
  1. # # 單個方法調試代碼
  1. if __name__ == '__main__':
  1. start_appium(4723)
  1. stop_appium(4723)