test ui-02-UI 测试组件之 Appium 入门介绍

Appium简介

正如主页所述,Appium的目标是支持许多不同平台(移动、Web、桌面等)的UI自动化。

不仅如此,它还旨在支持用不同语言(JS、Java、Python等)编写的自动化代码。

将所有这些功能组合到一个程序中是一个非常艰巨的任务,如果不是不可能的话!

为了实现这一目标,Appium有效地分为四个部分:

  1. Appium核心 - 定义核心API
  2. 驱动程序 - 实现与特定平台的连接
  3. 客户端 - 用特定语言实现Appium的API
  4. 插件 - 更改或扩展Appium的核心功能

因此,要开始使用Appium进行自动化,您需要:

  1. 安装Appium本身
  2. 为目标平台安装一个驱动程序
  3. 为目标编程语言安装一个客户端库
  4. (可选)安装一个或多个插件

这些是基础知识!如果您准备好开始,可以继续查看快速入门!

如果您希望了解更多有关其工作原理的详细信息,请参阅以下页面以获取背景材料:

  • Appium核心
  • Appium驱动程序
  • Appium客户端

Appium工作原理

正如主页所述,Appium是一个开源项目和相关软件生态系统,旨在简化许多应用平台的UI自动化。随着Appium 2的发布,Appium有以下主要目标:

  1. 使平台特定的自动化功能在跨平台的标准API下可用。
  2. 允许从任何编程语言轻松访问此API。
  3. 提供工具以便方便地共同开发Appium扩展。

因此,无论您了解哪个应用平台,比如iOS或Android,Appium都希望开发人员和测试人员能够按照单一、统一的API编写该平台的UI自动化代码。基于Appium的目标,我们需要回答许多问题,以使所有这些都能正常工作:

  1. “单一、统一”的API应该是哪个?
  2. 我们如何将该API映射到特定平台的自动化行为?
  3. 我们如何使该API可通过多种流行的编程语言轻松访问?

在这里,还有一个更大的问题潜伏在背后,因为除了iOS和Android之外,还有更多的应用平台:

  1. 我们如何为所有平台启用自动化?

探索Appium对这些问题的回答可能不是了解Appium的最快方式,但肯定是一个很好的方式!所以让我们深入研究。

Appium客户端简介

如主要概览中所讨论的那样,Appium基于W3C WebDriver规范。

这意味着Appium实现了一个客户端-服务器架构。服务器(由Appium本身以及您用于自动化的任何驱动程序或插件组成)连接到测试设备,并实际负责在这些设备上执行自动化。

客户端(由您,Appium测试作者驱动)负责通过网络向服务器发送命令,并接收服务器的响应。

这些响应可用于判断自动化命令是否成功,或可能包含您查询应用程序状态的信息。这份文档是对此方程式中客户端部分的概念性介绍。

有关方程式的服务器端(即Appium如何实际控制设备?)的更多信息,请查看我们的Appium驱动程序简介。要跳转到Appium客户端库链接列表,请查看客户端列表。

有哪些自动化命令可用?这取决于您在任何给定会话中使用的特定驱动程序和插件。

例如,标准的命令集可能包括以下内容:

  • 查找元素

  • 点击元素

  • 获取页面源码

  • 获取屏幕截图

如果您查看WebDriver规范中的这些命令,您会注意到它们并没有根据任何特定的编程语言定义。

它们不是Java命令、JavaScript命令或Python命令。

相反,它们构成了一个HTTP API的一部分,可以从任何编程语言(或没有!如果您愿意,可以只使用cURL)中访问。

因此,例如,查找元素命令对应于发送到HTTP端点/session/:sessionid/element的HTTP POST请求(在这种情况下,:sessionid是服务器在先前调用Create Session时生成的唯一会话ID的占位符)。

这些信息主要对于开发与WebDriver规范兼容的技术的人员是有用的。对于试图编写Appium或Selenium测试的人来说,这并不特别有用。在编写Appium测试时,您希望使用熟悉的编程语言。幸运的是,存在一组Appium客户端库,负责与Appium服务器进行HTTP通信。它们不会直接暴露特定编程语言的HTTP细节,而是为特定编程语言公开了一组“本地”命令,使得对于测试作者来说,就感觉像是在编写Python、JavaScript或Java。

例如,以下是相同的一组简单的Appium命令,使用每种语言的推荐Appium客户端绑定(请注意,这不是包含所有适当导入的工作示例代码;请参阅每个客户端库的设置和命令参考文档):

const element = await driver.$('//*[@text="Foo"]');
await element.click();
console.log(await element.getText())
console.log(await driver.getPageSource())

这些脚本,尽管使用不同的编程语言编写,但在底层执行的是相同的操作:

  1. 使用xpath作为using参数,使用表达XPath查询的值参数调用Find Element。(如果您对这些术语感到困惑,您可能会发现介绍Appium或Selenium的内容很有用)
  2. 使用上一步调用中找到的元素的ID调用Click Element。
  3. 使用相同元素的ID调用Get Element Text,并将其打印到控制台。
  4. 调用Get Page Source检索页面/应用源代码,并将其打印到控制台。

在选择或使用客户端之前,需要注意的另一件事是每个客户端都是独立维护的。仅因为一个客户端中有某个功能,并不意味着另一个客户端也有(尽管所有客户端至少支持标准的W3C协议以及任何常见的Appium扩展)。仅因为一个客户端具有一套不错的辅助函数,并不意味着另一个客户端也有。有些客户端保持非常频繁的更新,而其他客户端则没有!因此,在选择库时,首要考虑的是要使用的编程语言,其次考虑的是库的功能齐全程度和维护情况如何!

要了解如何使用Appium客户端,请访问该客户端的主页以获取更多信息。在许多情况下,给定语言的Appium客户端是建立在该语言的Selenium客户端之上的,因此某些Appium客户端可能仅记录在Selenium客户端之上添加的功能。总之,为了获取完整的参考信息,您可能需要同时访问Appium客户端文档和Selenium客户端文档。

这就是关于Appium客户端的所有需要知道的内容!请转到客户端页面查看当前客户端列表。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贝叶斯推断:细谈贝叶斯变分和贝叶斯网络

1. 贝叶斯推断 统计推断这件事大家并不陌生,如果有一些采样数据,我们就可以去建立模型,建立模型之后,我们通过对这个模型的分析会得到一些结论,不管我们得到的结论是什么样的结论,我们都可以称之为是某种推…

数据结构【线性表篇】(一)

数据结构【线性表篇】(一) 文章目录 数据结构【线性表篇】(一)前言为什么突然想学算法了?为什么选择码蹄集作为刷题软件? 目录一、顺序表(一)、顺序表的定义(二)、顺序表的插入删除(三)、顺序表的查找 二、完整代码(一)、顺序表的…

骑砍战团MOD开发(29)-module_scenes.py游戏场景

骑砍1战团mod开发-场景制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Cw411N7G4/ 一.骑砍游戏场景 骑砍战团中进入城堡,乡村,战斗地图都被定义为场景,由module_scenes.py进行管理。 scene(游戏场景) 天空盒(Skyboxes.py) 地形(terrain code) 场景物(scene_…

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中)

文章目录 3D数学基础矢量/向量概述 - 什么是向量单位矢量:只关注方向不关注大小 数学运算矢量的加法与减法减法的几何意义计算一个点到另一个点的位移矢量的点积与叉积 矩阵矩阵的几何意义 3D数学基础 矢量/向量 在笔记中 变量使用小写字母表示,a由于…

Springboot集成RabbitMq二

接上一篇:Springboot集成RabbitMq一-CSDN博客 1、搭建项目-消费者 与之前一样 2、创建配置类 package com.wym.rabbitmqconsumer.utils;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.spring…

2023-12-16 LeetCode每日一题(统计区间中的整数数目)

2023-12-16每日一题 一、题目编号 2276. 统计区间中的整数数目二、题目链接 点击跳转到题目位置 三、题目描述 给你区间的 空 集,请你设计并实现满足要求的数据结构: **新增:**添加一个区间到这个区间集合中。 **统计:**计算…

华为服务器安装银河麒麟V10操作系统(IBMC安装)

iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具,标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP:192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…

用Audio2Face驱动UE - MetaHuman

新的一年咯,很久没发博客了,就发两篇最近的研究吧。 开始之前说句话,别轻易保存任何内容,尤其是程序员不要轻易Ctrl S 在UE中配置Audio2Face 先检查自身电脑配置看是否满足,按最小配置再带个UE可能会随时崩&#x…

设计模式--适配器模式

适配器模式 适配器模式(Adapter),将一个类的接口转换为客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 系统的数据和行为都正确,但接口不符合时,我们应该…

19、BLIP-2

简介 github 通过利用预训练的视觉模型和语言模型来提升多模态效果和降低训练成本,预训练的视觉模型能够提供高质量的视觉表征,预训练的语言模型则提供了强大的语言生成能力。 实现过程 为了弥合模态差距,提出了一个分两个阶段预训练的 Qu…

YOLOv5算法进阶改进(10)— 更换主干网络之MobileViTv3 | 轻量化Backbone

前言:Hello大家好,我是小哥谈。MobileViTv3是一种改进的模型架构,用于图像分类任务。它是在MobileViTv1和MobileViTv2的基础上进行改进的,通过引入新的模块和优化网络结构来提高性能。本节课就给大家介绍一下如何在主干网络中引入MobileViTv3网络结构,希望大家学习之后能够…

MySQL基础学习: 由delete和insert操作导致的死锁问题

一、问题复现:表结构 CREATE TABLE user_props (user_id bigint NOT NULL ,prop_key varchar(100) NOT NULL ,prop_value varchar(100) NOT NULL,PRIMARY KEY (user_id,prop_key) )二、死锁测试 (1)开启两个事务 (2)…

C#中使用is关键字检查对象是否与给定类型兼容

目录 一、定义 二、示例 三、生成 在程序的开发过程中经常会使用类型转换,如果类型转换不成功则会出现异常,从抛出异常到捕获并处理异常,无形中增加了系统的开销,而且太过频繁地处理异常还会严重地影响系统的稳定性。is关键字可…

力扣hot100 对称二叉树 递归 队列

👨‍🏫 题目地址 👨‍🏫 参考思路 递归的难点在于:找到可以递归的点 为什么很多人觉得递归一看就会,一写就废。 或者说是自己写无法写出来,关键就是你对递归理解的深不深。 对于此题&#xf…

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台,该平台旨在为 Solana 原生铭文项目,以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash,将会有更多的 Solana 生态的铭…

熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

可用性的定义 在探讨高可用架构之前,让我们以 O2 系统为例,解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统,专注于提升投放效率、分析广告效果,拥有自动化广告投放、AIGC 自动化素材生产等多种功能。 其整体架构概览如下&…

springboot日志

1、日志用途 故障排查和调试:当项目出现异常或者故障时,日志记录可以快速帮助我们定位到异常的部分以及知道异常的原因。性能监测和优化:通过在关键代码路径中添加日志记录,可以了解应用程序的性能表现,并根据性能表…

最新-mybatis-plus 3.5分页插件配置

mybatis-plus 3.5分页插件配置 前提 1.项目不是springboot, 是以前的常规spring项目 2.mp 从3.2升级到3.5,升级后发现原本的分页竟然不起作用了,每次查询都是查出所有 前后配置对比 jar包对比 jsqlparser我这里单独引了包,因为版本太低…

洛谷普及组P1044栈,题目讲解(无数论基础,纯打表找规律)

[NOIP2003 普及组] 栈 - 洛谷 我先写了个打表的代码&#xff0c;写了一个小时&#xff0c;o(╥﹏╥)o只能说我真不擅长dfs。 int n; std::unordered_map<std::string, int>map; void dfs(std::vector<int>&a, int step,std::stack<int>p, std::string …

JDK17 - 开发者视角,从 JDK8 ~ JDK17 都增加了哪些新特性

目录 前言 一、站在开发视角&#xff0c;从 JDK8 升级到 JDK17 都有哪些新特性 1.1、JDK8 新特性 1.1.1、Optional 类 a&#xff09;简介 b&#xff09;使用方法 c&#xff09;使用场景 1.2、JDK9 新特性 1.2.1、Optional - ifPresentOrElse 解决 if-else 1.2.2、Opt…