Я запускаю тест на смартфоне, используя Python 3.7 и Appium 1.19 на Windows 10 с реальными Android смартфонами.
Мой скрипт использует concurrent.futures.ProcessPoolExecutor () для запуска всех смартфоны одновременно. Вот как работает мой скрипт:
- инициировать блокировку для многопроцессорной обработки
- подключиться к локальной базе данных, чтобы получить и сохранить некоторые сведения о подключенных смартфонах
- запустить сервер приложений ( убить существующий сервер appium, чтобы избежать исключений) получить UID и другие сведения о подключенных смартфонах
- подготовить номер порта для запуска смартфона на сервере Appium
- запустить многопроцессорную работу, чтобы запустить все смартфоны в Параллельно в то же время
Я хотел бы разработать систему «plug n play», в которой скрипт постоянно работает, и когда я подключаю новый смартфон по USB, скрипт обнаруживает его и начать новый процесс , чтобы запустить функцию "run_smartphone", которая должна быть выполнена автоматически.
Вот код:
import concurrent.futures
import multiprocessing
multiprocessing.freeze_support()
import sqlite3
import subprocess
import time
import psutil
import mymodules
if __name__ == '__main__':
# initiate a lock for multiprocessing
m = multiprocessing.Manager()
lock = m.Lock()
# connect to local database
sqliteConnection = sqlite3.connect('db.db')
cursor = sqliteConnection.cursor()
# start appium server (kill the existing appium server to avoid exception)
while True:
try:
PROCNAME = "node.exe"
for proc in psutil.process_iter():
if proc.name() == PROCNAME:
print(f"PhoneBot will kill this process : {proc}")
proc.kill()
# os.system("start /B start cmd.exe @cmd /k appium --log appium.log --log-level error:debug --debug-log-spacing --async-trace --relaxed-security")
proc = subprocess.Popen('appium --log appium.log --log-level error:debug --debug-log-spacing --async-trace',
shell=True,
stdin=None, stdout=None, stderr=None, close_fds=True)
print("Appium server starting....")
time.sleep(15)
break
except Exception as ex:
print(
f"{ex} --> We couldn't start Appium server.... Be sure to have installed it and add the path to variable environment!")
# Start the Appium activities for each smartphone connected
while True:
# get the UID and other details of connected smartphones
quantity_connected_phones = mymodules.get_details_smartphones()
list_smartphones_connected_tuple = cursor.execute(
'SELECT udid, systemPort, deviceName, platformversion, OS_device FROM smartphones where status=1').fetchall()
list_smartphones_connected = [item[0] for item in list_smartphones_connected_tuple]
print(f"list_smartphones_connected : {list_smartphones_connected}")
print("MULTIPROCESSING :" + str(list_smartphones_connected))
# === Let's try to madd some lock
# let's prepare the port number to run the smartphone on Appium server
mymodules.give_systemPort_to_smartphones()
# start the multiprocessing to run all the smartphones in parallel at the same time
with concurrent.futures.ProcessPoolExecutor() as executor:
try:
multiprocesses = executor.map(mymodules.run_smartphone, list_smartphones_connected,
[lock] * len(list_smartphones_connected))
for function_return_value in multiprocesses:
print(function_return_value)
except Exception as ex:
print(f"{ex} --> Error multiprocesses")
Я запускаю этот скрипт и подождите, пока работает 1 смартфон ... Затем я подключил второй смартфон, который был обнаружен windows ... но ничего не произошло. Я полагаю, это потому, что многопроцессорность еще не завершена, и он должен закончиться, чтобы вернуться к l oop и обнаружить новый подключенный смартфон.
Как определить каждый новый подключенный смартфон и запустить новый процесс для каждого из них?