当前位置: 首页 > news >正文

使用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)

相关文章:

使用Python启动appium

import osimport subprocessimport multiprocessingimport timeimport pytestfrom appium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom time import sleep# 关于appium的启动# 1、桌面版(咱们现在用的):…...

活动回顾丨研发效能度量线下沙龙圆满举办

2月18日,由跬智信息(Kyligence)联合甄知科技主办的研发效能度量线下沙龙圆满举办。本次沙龙在 Kyligence 上海总部举办,Kyligence 联合创始人兼 CTO 李扬、腾讯 Tech Lead 茹炳晟,以及甄知科技创始人兼 CTO 张礼军在现…...

问题解决篇 | Win11网络连接上了但是无法上网(修改DNS弹出框框“出现问题”,如何通过网络检测确定并修复网络问题)

目录 问题 网络诊断 Win i 打开设置 搜索“查找并修复网络问题”并点击 "远程计算机或设备将不接受连接" 解决办法: Win R,输入 inetcpl.cpl ,点击确定,打开Internet选项 选择“连接” 点击“局域网设置” 三个…...

Go语言进阶与依赖管理-学习笔记

1 语言进阶 1.1 Goroutine 线程:内核态,栈MB级别 协程:用户态,轻量级线程,栈KB级 1.2 CSP 提倡通信实现共享内存 1.3 Channel 创建方法 make(chan 元素类型,缓冲区大小) 无缓冲通道&#x…...

【Mybatis源码分析】datasource配置${}表达式时是如何被解析的?

核心配置中${}表达式配置的解析一、核心配置主体二、核心配置文件中properties是如何被解析的?三、${} 表达式的解析四、总结前提: 核心配置文件是被XMLConfigBuilder 对象进行解析的,configuration 对象是由它父类BaseBuider继承下来的属性…...

网络基础概述

1.计算机网络背景 ​ 计算机刚刚发展的时候,是没有网络的,每一台计算机都是相互独立的。后来,人们有了多人协作的需求,人们就想办法把多台计算机用“线”连接起来,实现数据共享。后来,连接到一起的电脑越来…...

微搭使用笔记(四) 通过循环展示组件+json配置生成表单及数据获取

背景及整体思路 上篇文章我们通过微搭提供的数据模型完成了问卷表单页面的创建和数据采集,相对来说除了数据模型配置略显复杂外其他的倒还算方便。 本文我们通过for循环加上json文件配置的方式实现一个通用表单页面,如果更换了表单只需要替换掉json配置…...

做测试5年,靠业务熟悉吃老本,技术短板暴露,30岁被无情辞退...

朋友跟我诉苦,最近他被公司无情辞退了。测试几年,月薪10k,如今已经30了,接下来不知道该怎么办,让我帮他想想办法... 几年下来,也算是公司的骨干成员,不说有功,但一定无过。公司业务…...

Linux系统安装MySQL8.0版本详细教程【亲测有效】

首先官网下载安装包:https://downloads.mysql.com/archives/community/ 一、上传到安装服务器 二、解压 tar -xvf mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz三、移动位置并重新命名 mv mysql-8.0.31-linux-glibc2.12-x86_64 /usr/local/mysql四、创建mysql用户…...

[论文阅读笔记19]SiamMOT: Siamese Multi-Object Tracking

这是CVPR2021的一篇文章, 是利用SOT的一些思想来进行MOT的运动估计. 文章地址: 文章 代码地址: 代码 0. 摘要 本文提出了一个孪生(Siamese)式的MOT网络, 该网络用来估计帧间目标的运动. 为了探究运动估计对多目标跟踪的影响, 本文提出了两种运动建模方式: 显式和隐式. 本文在…...

unix高级编程-fork和execve

fork和vfork vfork是老的实现方法又很多问题 vfork #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <signal.h> #include <errno.h> #include <sys/stat.…...

Vue3+Ts+Vite开发插件并发布到npm

依赖版本信息如下&#xff1a; "vue": "^3.2.45""typescript": "~4.7.4""vite": "^4.0.0""less": "^4.1.3""terser": "^5.16.4"npm: 8.1.0node: 16.13.0 目标&#xf…...

CAN TP层函数介绍

如果想使用CAN TP层函数,首先需要在网络节点或测试节点配置页面的Componets组件一栏添加osek_tp.dll文件。路径为:C:\Program Files\Vector CANoe 15\Exec32 至于节点的CAPL程序内需不需要引用这个dll文件,无所谓,可写可不写。但是如果是其他dll,必须在CAPL程序中引用。为…...

Spring架构篇--2.5 远程通信基础Select 源码篇--window--Select.open()

前言&#xff1a;在Socket通信中使用Select 来对NIO 进行实现&#xff0c;那么它们的实现方式是怎样的呢&#xff0c;本文从 Selector.open() 进行第一步的分析&#xff1b; Selector.open() &#xff1a; Selector 类&#xff1a; public static Selector open() throws IOEx…...

WEB静态交互展示【数据mock】

文章目录背景需求分析实现过程1.爬取原有项目数据2.将数据引入项目3.打包收工后记背景 接到公司一个【离谱】的需求&#xff0c;要求把已有的项目做一个演示版本&#xff08;静态文件版本&#xff09;&#xff1b;本人觉得前端、后端搞个容器包&#xff0c;一个演示版本不就有…...

(4)C#传智:分支Switch与循环While(第四天)

一、异常捕获 定义&#xff1a;语法无错&#xff0c;程序因某些原因出现的错误&#xff0c;而不能正常运行。 用try-catch进行捕获。哪行代码可能出现异常&#xff0c;你就踹它一脚。 try { 可能会出现异常的代码; ---- …...

Stable-Baselines 3 部分源代码解读 2 on_policy_algorithm.py

Stable-Baselines 3 部分源代码解读 ./common/on_policy_algorithm.py 前言 阅读PPO相关的源码&#xff0c;了解一下标准库是如何建立PPO算法以及各种tricks的&#xff0c;以便于自己的复现。 在Pycharm里面一直跳转&#xff0c;可以看到PPO类是最终继承于基类&#xff0c;也…...

15. Qt中OPenGL的参数传递问题

1. 说明 在OPenGL中&#xff0c;需要使用GLSL语言来编写着色器的函数&#xff0c;在顶点着色器和片段着色器之间需要参数值的传递&#xff0c;且在CPU中的数据也需要传递到顶点着色器中进行使用。本文简单介绍几种参数传递的方式&#xff1a; &#xff08;本文内容仅个人理解&…...

注意,这本2区SCI期刊最快18天录用,还差一步录用只因犯了这个错

发表案例分享&#xff1a; 2区医学综合类SCI&#xff0c;仅18天录用&#xff0c;录用后28天见刊 2023.02.10 | 见刊 2023.01.13 | Accepted 2023.01.11 | 提交返修稿 2022.12.26 | 提交论文至期刊部系统 录用截图来源&#xff1a;期刊部投稿系统 见刊截图来源&#xff1a…...

Could not find resource jdbc.properties问题的解决

以如下开头的内容&#xff1a; Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration 出现以上问题是没有在src/main/resources下创建jdbc.prop…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...