简单实现通过代码启动 appium server

news2025/3/15 15:24:10

一、前置说明

  • 总体目录:《从 0-1 搭建企业级 APP 自动化测试框架》
  • 上节回顾:在 os_util 工具类和方法的实现 中,实现了启动应用程序和查杀进程的一些基本方法。
  • 本节目标:简单实现通过代码启动 appium server,代替手动启动。

二、操作步骤

1. 目录结构

说明:启动 appium server 的相关方法,可以被看成是 appium 使用中特定用途的辅助方法,因此可以将它存放在 appium --> support --> env_setup.py 文件中。

2. 代码实现

core/driver/appium/support/env_setup.py

import logging
import time

from utils.os_util import application_manager, process_manager, port_manager

logger = logging.getLogger(__name__)


class AppiumServer:
    """
    - appium server 的默认监听端口号是 4723,默认以 4723 端口启动 appium server;
    - 4723 端口可能会被其他程序占用,如果已被占用,需要使用其它端口号启动 appium server;
    - 假设成功启动 appium 的端口号为 `4723` ,检查 4723 端口是否被占用;
    - 如果 4723 端口已被占用,则说明 appium 已启动,则不重复启动;
    - 如果 4723 端口未被占用,说明 appium 未启动,则在终端命令行中执行命令,启动 appium server;
    - 有时可能需要清理测试环境,因此允许强制重启 appium server。
    """

    def __init__(self, port):
        self.port = port

    def start(self, force_restart=False):
        if force_restart:
            self.stop()
            application_manager.start_application(f'appium -p {self.port}', is_run_in_command=True)
            time.sleep(10)  # 启动 appium server 需要一定时间
        else:
            if not port_manager.is_port_in_use(self.port):
                application_manager.start_application('appium', is_run_in_command=True)

        logger.debug('Appium Server is already running')

    def stop(self):
        process_manager.kill_process_by_port(self.port)


class EmulatorDevice:
	...


class UIAutomatorViewer:
	...


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)

    app = AppiumServer(4723)
    app.start(force_restart=True)
    app.start()

3. 代码验证

通过执行上述代码,可以实现如下功能:

  • appium server 的默认监听端口号是 4723,默认以 4723 端口启动 appium server;
  • 假设成功启动 appium 的端口号为 4723 ,检查 4723 端口是否被占用;
  • 如果 4723 端口已被占用,则说明 appium 已启动,则不重复启动;
  • 如果 4723 端口未被占用,说明 appium 未启动,则在终端命令行中执行命令,启动 appium server;
  • 有时可能需要清理测试环境,因此允许强制重启 appium server。

测试通过。

三、要点小结

  • 本节只是对启动 appium server 的简单实现,可作用临时功能使用;
  • 在启动 appium server 时,除了使用 -p 参数指定端口外,还有很多其它参数,比如:使用 -g 参数指定日志输出的路径等;
  • 更多参数,请参考 appium 官方文档 ;
  • Appium-Python-Client 库提供了 AppiumService 类来启动 appium 服务,但是经过调试存在一些问题;
  • 在后续章节,会对该类进行二次封装,以实现本节中描述的需求。

点击返回主目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1336876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【低照度图像增强系列(2)】Retinex(SSR/MSR/MSRCR)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务,常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题,给检测带来一定的难度。 🌻使用图像增强模块对原始图像进行画质提升,恢复各类图像信息,再使用目标检…

云仓酒庄的品牌雷盛红酒LEESON分享干红是纯葡萄酿造的吗?

干红是一种葡萄酒的简称,全称是干型红葡萄酒。葡萄酒按含残糖量分为干型、半干型、半甜型和甜型。无论什么型的酒,只要是葡萄酒,那就是葡萄酿造的。 云仓酒庄的品牌雷盛红酒LEESON分享干红是葡萄酒的一种,而葡萄酒却不止干红一种…

[问题随记]-如何修改网页中input type=file按钮名字

在使用HTML编辑网页的时候经常会出现如下问题&#xff0c;使用<input typefile>的类型控件上传文件按钮的时候&#xff0c;无法对按钮的名字进行修改&#xff0c;如下为解决方案 <input typefile nameBseleFile style"display:none" onchange"iTest.va…

【代码随想录】刷题笔记Day39

前言 下午答疑课过于无聊了&#xff0c;后台在跑代码也写不了作业&#xff0c;再刷点题吧~难得一天两篇 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 和之前重叠区间是同个类型&#xff0c;和res里的元素比较&#xff0c;重叠就更新res里最后元素的最右边界 class…

JavaScript 中的双等号(==)和三等号(===)有何不同?何时使用它们?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-等号区别 目录 和 区别&#xff0c;分别在什么情况使用 一、等于操作符…

Vue与低代码开发:简化前端开发的强力组合

在当下瞬息万变的软件开发领域&#xff0c;前端开发的速率与效益显得尤为关键。为适应市场的不断变迁&#xff0c;开发者们致力于寻求更为快捷、高效的开发模式。因此&#xff0c;Vue框架与低代码开发平台受到了开发者们的高度关注。本文旨在探讨Vue框架与低代码开发的融合&…

如何在水经微图中加载调用长光卫星影像

我们在这里&#xff0c;再来分享长光卫星影像在水经微图中的加载方法。 如何获取地图服务地址 如果你还没有在长光的官网注册&#xff0c;请通过以下地址注册。 https://www.jl1mall.com/rskit/?agentCompanySJZ&agentfangfang 因为&#xff0c;只有注册之后才能获取到…

嵌入式——I2C原理代码结合(干货)看图易懂

学习目标 理解I2C通讯原理理解I2C通讯过程中的信号理解软件I2C实现过程理解硬件I2C的工作内容学习内容 I2C通讯规则 I2C总线包括两根信号线:SDA(串行数据线)和SCL(串行时钟线)。这两根信号线共用一个总线,因此在总线上可以连接多个设备。在I2C总线上,每个设备都有一个唯…

【数据结构】查找与排序

要查询信息&#xff0c;涉及两个问题&#xff1a; 在哪里查&#xff1f;——查找表 怎么查&#xff1f;——查找方法 一.查找 1.查找表的定义&#xff1a; 查找表是由同类型的数据元素构成的集合 2.对查找表的基本操作&#xff1a; 1&#xff09;查询某个数据元素是否在查…

【原创分享】DDR拓扑结构的详细解析

在进行多片DDR设计的时候&#xff0c;通常DDR会存在拓扑结构&#xff0c;下面我们将详细介绍一下各种拓扑结构的区别以以及应用场景。 首先我们先介绍一下&#xff0c;当只存在一片DDR的时候通常是采用点对点的连接方式&#xff0c;点对点的布线方式优点是结构简单&#xff0c…

git之UGit可视化工具使用

一、下载安装UGit 链接&#xff1a;https://pan.baidu.com/s/1KGJvWkFL91neI6vAxjGAag?pwdsyq1 提取码&#xff1a;syq1 二 、使用SSH进行远程仓库连接 1.生成SSH密钥 由于我们的本地 git仓库和 gitee仓库之间的传输是通过SSH加密的&#xff0c;所以我们需要配置SSH公钥。才…

瓷片图绘制教程,R语言ggplot2绘图笔记

瓷片图像地板砖一样&#xff0c;由许多个小格子组成&#xff0c;不用的颜色深浅可以用来表示不同的值&#xff0c;横轴和纵轴可以用来展示不同的位置&#xff0c;二维码图、马赛克图、热图等都有异曲同工之妙。 今天分享一个在R语言中利用ggplot2包绘制瓷片图的方法&#xff0c…

处理器类型简介

转载自&#xff1a;https://www.cnblogs.com/zamely/p/4334979.html 多核处理器也称片上多核处理器&#xff08;Chip Multi-Processor&#xff0c;CMP&#xff09;。 1.多核处理器的流行 多核出现前&#xff0c;商业化处理器都致力于单核处理器的发展&#xff0c;其性能已经…

轻量封装WebGPU渲染系统示例<54>- 表现GLB模型之拱形门

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/GLBMaterialTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class GLBMaterialTest {private mRscene new …

java内存溢出初步排查

java内存模型 java内存空间主要包括以下几个部分&#xff1a;方法区、堆内存、虚拟机栈、本地方法栈 方法区&#xff1a;主要存放已被加载的类信息&#xff0c;常量&#xff0c;静态变量等。堆内存&#xff1a;Java堆是JVM所管理的最大一块内存空间&#xff0c;几乎所有的对象…

【ai】阿里云 大模型 api 聚合平台 dashscope

阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 快速调用 前提条件 已开通服务并获得API-KEY&#xff1a;开通DashScope并创建API-KEY。 已安装最新版SDK&#xff1a;安装DashScope SDK。 DashScope灵积模型服务建立在“模型即服务”&#xff08;Model-a…

Sqlserver-查询和kill杀死正在运行的事务

Sqlserver-查询和kill杀死正在运行的事务 1.查询正在运行的事务2.杀死运行的事务Kill 1.查询正在运行的事务 SELECT session_id, task_state, pending_io_count, context_switches_count FROM sys.dm_os_tasks WHERE session_id > 50 ORDER BY task_state asc2.杀死运行的事…

【51单片机系列】DS18B20温度传感器模块

本文是关于温度传感器的相关内容。 文章目录 一、 DS18B20数字温度传感器介绍1.1、 DS18B20温度传感器的特点1.2、DA18B20内部结构1.3、 DS18B20的温度转换规则1.4、 DS18B20的ROM指令表1.6、 计算温度1.7、 读写时序 二、DS18B20使用示例 一、 DS18B20数字温度传感器介绍 DS1…

真心建议,入职业务部门前先学会BI数据分析

不管进入哪个业务部门&#xff0c;都需要具备一定的数据分析能力&#xff0c;能够从不断累积的数据中发现并解决问题。比如销售部门的需要通过分析销售数据&#xff0c;及时发现销售不佳的商品&#xff0c;调整销售策略&#xff0c;提高销售额、销售利润等。而随着精细化数据分…

一体式读卡器:引领数据读取新潮流

一体式读卡器&#xff1a;引领数据读取新潮流 随着科技的发展&#xff0c;读卡器在各个领域的应用越来越广泛&#xff0c;如工业自动化生产、身份认证、门禁控制、数据采集等。读卡器主要有两种类型&#xff1a;一体式读卡器和分体式读卡器。这两种类型的读卡器各有其优缺点&a…