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

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明

在Appium的1.6.0版本中引入了AppiumService类,可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试,使用该类的实例执行关闭server时,并没有释放端口号,会导致第二次启动时失败。另外,使用该类启动server,不能在窗口中实时显示日志,不方便调试。因此,可以重写 AppiumService 类的 start 方法和 stop 方法,实现相应功能。

二、代码实现

import loggingfrom appium.webdriver.appium_service import *
from appium.webdriver.appium_service import AppiumService as OriginalServerfrom libs import path, file_util
from libs.cmd_util import cmd_executor as cmdlogger = logging.getLogger(__name__)class AppiumService(OriginalServer):def __init__(self, port=4723, log_file_path=None, tail_log=False):super().__init__()self.port = portself.log_file_path = log_file_path# 用于控制是否开启cmd窗口,实时展示日志内容,当调试代码时建议开启self.tail_log = tail_logif not self.log_file_path:self.log_file_path = os.path.join(path.get_log_dir(), f'appium_server_{port}.log')if os.path.exists(self.log_file_path):os.remove(self.log_file_path)self.default_start_args = ['-p', str(self.port),'-g', self.log_file_path,'--session-override','--log-timestamp','--session-override','--local-timezone','--allow-insecure','chromedriver_autodownload']def start(self, **kwargs: Any) -> sp.Popen:self.stop()env = kwargs['env'] if 'env' in kwargs else Nonenode: str = kwargs.get('node') or get_node()npm: str = kwargs.get('npm') or get_npm()main_script: str = kwargs.get('main_script') or get_main_script(node, npm)# A workaround for https://github.com/appium/python-client/issues/534default_std = sp.DEVNULL if sys.platform == 'win32' else sp.PIPEstdout = kwargs['stdout'] if 'stdout' in kwargs else default_stdstderr = kwargs['stderr'] if 'stderr' in kwargs else default_stdtimeout_ms = int(kwargs['timeout_ms']) if 'timeout_ms' in kwargs else STARTUP_TIMEOUT_MSargs: List[str] = [node, main_script]if 'args' in kwargs:args.extend(kwargs['args'])# ==================添加这段逻辑(开始):设置默认启动参数=======================if self.port:args.extend(self.default_start_args)# ==================添加这段逻辑(结束):设置默认启动参数=======================self._cmd = argsself._process = sp.Popen(args=args, stdout=stdout, stderr=stderr, env=env)error_msg: Optional[str] = Nonestartup_failure_msg = ('Appium server process is unable to start. Make sure proper values have been 'f'provided to \'node\' ({node}), \'npm\' ({npm}) and \'main_script\' ({main_script}) 'f'method arguments.')if timeout_ms > 0:status_url_path = make_status_url(args)try:if not self._poll_status(parse_host(args), parse_port(args), status_url_path, timeout_ms):error_msg = (f'Appium server has started but is not listening on {status_url_path} 'f'within {timeout_ms}ms timeout. Make sure proper values have been provided 'f'to --base-path, --address and --port process arguments.')except AppiumStartupError:error_msg = startup_failure_msgelif not self.is_running:error_msg = startup_failure_msgif error_msg is not None:if stderr == sp.PIPE and self._process.stderr is not None:err_output = self._process.stderr.read()if err_output:error_msg += f'\nOriginal error: {str(err_output)}'self.stop()raise AppiumServiceError(error_msg)# ==================添加这段逻辑(开始):是否启动cmd窗口跟踪log日志=======================if self.tail_log:file_util.tail_log_file(self.log_file_path)# ==================添加这段逻辑(结束):是否启动cmd窗口跟踪log日志=======================return self._processdef stop(self) -> bool:status = super().stop()# 经过实测,原stop()方法执行之后,进程仍被占用,所以这里添加一个关闭进程的逻辑cmd.kill_process_by_port(self.port)return statusif __name__ == '__main__':logging.basicConfig(level=logging.INFO)service = AppiumService(port=4723, tail_log=True)service.start()

三、Demo验证

执行代码,顺利启动appium server,并启动了一个命令行窗口,实时展示了server的日志。

欢迎技术交流:

相关文章:

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类,可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试,使用该类的实例执行关闭server时,并没有释放端口号,会导致第二次启动时失败。另外,使用该…...

[方法论]allocation 空间内容分配

区分度 typeanalysisrecognitionconclusion type - 阅读 - 理解- 背诵- 听课 看 听 思考- reproduce/ 默写/ 应用- 背- 想- 写analysis 理解 和 背 是不占用现实空间的,可以在脑内不断消化,可以飞配给没有空间的时间块。 阅读 和 写是占用现实空间的…...

家电制造数字孪生5G智能工厂可视化系统,加速家电制造产业数字化转型

5G数字孪生、三维可视化与工业互联网的融合加速中国新型工业化进程,助推我国从制造大国迈进制造强国。家电行业是中国最具国际竞争力的产业之一,在企业数字化转型中,要求企业从生产设备到数字化系统,一系列的数字化、智能化改革已…...

Flink入门之部署(二)

三种部署模式 standalone集群,会话模式部署:先启动flink集群 web UI提交shell命令提交:bin/flink run -d -m hadoop102:8081 -c com.atguigu.flink.deployment.Flinke1_NordCount./Flink-1.0-SNAPSHOT.jar --hostname hadoop102 --port 8888 …...

SQL命令---修改字段名

介绍 使用sql语句修改字段名。 命令 alter table 表名 change 旧字段名 新字段名 新数据类型;例子 将a表id字段名改为id1 alter table a change id id1 int(12) NOT NULL;...

设计模式篇---代理模式

文章目录 概念结构实例静态代理动态代理 总结 概念 代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。 比如我们想从其他国家买东西,但我们无法直接联系外国的商家,可以找代理商,让他们…...

STM32单片机项目实例:基于TouchGFX的智能手表设计(2)UI交互逻辑的设计

STM32单片机项目实例:基于TouchGFX的智能手表设计(2)UI交互逻辑的设计 目录 一、UI交互逻辑的设计 1.1 硬件平台的资源 1.2 界面切换功能 ​​​​​​​1.3 表盘界面 1.4 运动界面 ​​​​​​​1.6 设置界面 ​​​​​​​1.7 应…...

ES-分析器

分析器 两种常用的英语分析器 1 测试工具 #可以通过这个来测试分析器 实际生产环境中我们肯定是配置在索引中来工作 GET _analyze {"text": "My Moms Son is an excellent teacher","analyzer": "english" }2 实际效果 比如我们有下…...

智能优化算法应用:基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.缎蓝园丁鸟算法4.实验参数设定5.算法…...

【开发问题】vue的前端和java的后台,用sm4,实现前台加密,后台解密

sm4加密 vue引入的包代码加密解密 javamaven代码运行结果 vue 引入的包 npm install sm-crypto代码加密解密 加密: key :代表着密钥,必须是16 字节的十六进制密钥 password :加密前的密码 sm4Password :代表sm4加密…...

【算法专题】分治 - 快速排序

分治 - 快速排序 分治 - 快速排序1. 颜色分类2. 排序数组(快速排序)3. 数组中的第K个最大元素4. 库存管理Ⅲ5. 排序数组(归并排序)6. 交易逆序对的总数7. 计算右侧小于当前元素的个数8. 翻转对 分治 - 快速排序 1. 颜色分类 做题链接 -> Leetcode -75.颜色分类 题目&…...

UG NX二次开发(C#)-求曲线在某一点处的法矢和切矢

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一个曲线3、直接放代码4、测试案例1、前言 最近确实有点忙了,好久没更新博客了。今天恰好有时间,就更新下,还请家人们见谅。 今天我们讲一下如何获取一条曲线上某一条曲…...

leetcode 622. 设计循环链表

这道题讲了两种方法,第一个代码是用数组实现的,第二个是用链表实现的,希望对你们有帮助 (最好在VS自己测试一遍,再放到 leetcode上哦) 下面的是主函数(作参考),静下心来…...

Linux:dockerfile编写搭建tomcat练习(9)

我使用的httpyum仓库 本地使用了5个文件,tomcat使用的官网解压直接用的包】 Dockerfile 主配置文件 基于centos基础镜像 jdk1.8.0_91 java环境 run.sh 启动脚本 centos.repo 仓库文件 tomcat 源码包 vim Dockerfile写入FROM centos MAINTAINER ta…...

Linux 基础IO

文章目录 前言基础IO定义系统IO接口文件描述符重定向原理缓冲区刷新 前言 要知道每个函数/接口的全部参数和返回值建议去官网或者直接在Linux的man手册中查,这不是复制粘贴函数用法的文章。 C语言文件读写介绍链接 基础IO定义 IO是Input/Output的缩写&#xff0c…...

uniapp 打开文件管理器上传(H5、微信小程序、android app三端)文件

H5跟安卓APP 手机打开的效果图&#xff1a; Vue页面&#xff1a; <template><view class"content"><button click"uploadFiles">点击上传</button></view> </template><script>export default {data() {return…...

掌控安全 -- header注入

http header注入 该注入是指利用后端验证客户端口信息&#xff08;比如常用的cookie验证&#xff09;或者通过http header中获取客户端的一些信息&#xff08;比如useragent用户代理等其他http header字段信息&#xff09;&#xff0c;因为这些信息是会重新返回拼接到后台中的&…...

windows批处理脚本(.bat)如何激活Anconda Prompt虚拟环境

通过call 来调用激活脚本&#xff0c; activate myenv指的是要激活的环境&#xff0c;若省略&#xff0c;则激活的是base环境。 call : 从另一个批处理程序调用一个批处理程序&#xff0c;而不停止父批处理程序。 call C:\ProgramData\Anaconda3\Scripts\activate.bat activate…...

扩散模型实战(十四):扩散模型生成音频

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…...

《微信小程序开发从入门到实战》学习四十七

4.4 云函数 4.4.5 云函数的定时触发 如果云函数需要定时执行&#xff0c;可以使用云函数定时触发器。配置了定时触发器&#xff0c;云函数会在相应时间点被自动触发。函数返回结果不会返回调用方 在需要添加触发器的云函数下新建文件config.json。格式如下&#xff1a; &quo…...

蓄电池与超级电容混合储能并网matlab/simulink仿真模型 (1)混合储能采用低通滤波...

蓄电池与超级电容混合储能并网matlab/simulink仿真模型 &#xff08;1&#xff09;混合储能采用低通滤波器进行功率分配&#xff0c;可有效抑制功率波动&#xff0c;并对超级电容的soc进行能量管理&#xff0c;soc较高时多放电&#xff0c;较低时少放电&#xff0c;soc较低时状…...

【车辆】插电式混合动力汽车(PHEV)动力系统进行建模与设计MATLAB 代码,含发动机、电机、电池组等组件

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f447; 关注我领取海量matlab电子书和数学建模资料&#x1f34a;个人信条&#xff1a;格物致知,完整Matl…...

AIGlasses_for_navigation 的Java后端集成:SpringBoot微服务调用实战

AIGlasses_for_navigation 的Java后端集成&#xff1a;SpringBoot微服务调用实战 最近在做一个物流仓储的智能调度项目&#xff0c;里面用到了不少视觉导航的AGV小车。为了让这些小车更“聪明”&#xff0c;我们尝试引入了一套叫AIGlasses_for_navigation的视觉导航模型。这东…...

NVIDIA显卡隐藏功能终极解锁:10个性能调校技巧完全指南

NVIDIA显卡隐藏功能终极解锁&#xff1a;10个性能调校技巧完全指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 想让你的NVIDIA显卡发挥出全部潜能吗&#xff1f;NVIDIA Profile Inspector这款强大的…...

Qwen3-14B私有部署案例:电商客服话术生成与情感倾向优化实践

Qwen3-14B私有部署案例&#xff1a;电商客服话术生成与情感倾向优化实践 1. 项目背景与需求分析 电商客服每天需要处理大量重复性问题&#xff0c;传统人工回复效率低下且难以保证一致性。我们基于Qwen3-14B模型构建了智能客服话术生成系统&#xff0c;主要解决以下痛点&…...

南北阁Nanbeige 4.1-3B效果展示:同一问题在不同temperature设置下的风格对比

南北阁Nanbeige 4.1-3B效果展示&#xff1a;同一问题在不同temperature设置下的风格对比 1. 引言&#xff1a;为什么关注temperature参数&#xff1f; 如果你用过AI对话工具&#xff0c;可能会发现一个有趣的现象&#xff1a;同一个问题&#xff0c;有时候AI的回答严谨专业&a…...

IronCalc 性能基准测试:与传统电子表格引擎的对比分析

IronCalc 性能基准测试&#xff1a;与传统电子表格引擎的对比分析 【免费下载链接】IronCalc Main engine of the IronCalc ecosystem 项目地址: https://gitcode.com/gh_mirrors/ir/IronCalc IronCalc 是一个基于 Rust 语言开发的现代化开源电子表格引擎&#xff0c;专…...

STM32精准延时实现与Keil调试技巧

1. 精准延时在单片机开发中的重要性在STM32等嵌入式系统开发中&#xff0c;精准延时是基础但至关重要的功能。我最近调试一块自制的STM32开发板时&#xff0c;就遇到了需要精确控制时序的场景。比如在驱动LCD屏幕时&#xff0c;某些控制信号需要维持15ms的精确延时&#xff0c;…...

仅限首批内测开发者获取:CPython无GIL预编译二进制+无锁标准库API速查表(含ABI兼容性矩阵与降级熔断方案)

第一章&#xff1a;Python无锁GIL环境下的并发模型概览Python 的全局解释器锁&#xff08;GIL&#xff09;长期被视为多线程 CPU 密集型任务的瓶颈。然而&#xff0c;随着 CPython 3.13 的正式引入“实验性无锁 GIL”&#xff08;--without-pymalloc 配合 --with-gildisabled 构…...

群晖 /dev/md0 根分区爆满 100% 排查清理全流程

解决群辉系统爆满安装不了套件 一、群辉安装套件报错 报错&#xff1a;系统分区的可用空间不足&#xff0c;请联络Synology支持小组来寻求帮助。这是因为系统分区&#xff08;System Partition&#xff09;空间不足&#xff0c;导致无法解压和安装该套件。与磁盘硬盘大小没有关…...