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

深度剖析,如何从底层代码层面理解Selenium和Appium的关联

 目录

 前言:

一、Selenium和WebDriver

二、Appium和WebDriver

三、Selenium和Appium的底层关联

1. Selenium WebDriver提供底层的浏览器控制机制

2. 利用JSON Wire Protocol通信协议实现通讯机制

四、实例代码

总结:


前言:

Selenium和Appium是目前广泛应用于Web和移动测试领域的两个重要工具,它们可以协助测试人员完成测试任务,提高测试效率和测试质量。在实际的测试过程中,Selenium和Appium并不是孤立的存在,它们之间存在着底层的关联,这个关联的深入理解可以帮助我们更好地利用这两个工具进行测试。本文将从底层代码实现的角度出发,介绍Selenium和Appium之间的联系。

一、Selenium和WebDriver

Selenium是一款自动化测试框架,可以模拟用户在浏览器上的交互操作,它可以完成如下的测试任务:

1. 测试Web应用程序的UI功能和行为。

2. 测试Web应用程序的功能和性能。

3. 模拟用户在Web应用程序上的交互行为。

Selenium的最大特点是可以跨浏览器执行测试,支持多种语言编写测试脚本。在实际测试中,可以使用Selenium WebDriver来驱动浏览器进行测试。

WebDriver是Selenium的一个子项目,是一系列API接口的集合,可以直接通过Web浏览器驱动来控制浏览器完成各种测试任务。WebDriver直接操作浏览器的DOM结构,模拟用户的操作,实现自动化测试的效果。WebDriver支持多种语言(如Java、Python、Ruby等)的编写,同时还支持多种浏览器(如Chrome、Firefox、IE等)的执行。

二、Appium和WebDriver

Appium是一款自动化测试工具,它可以模拟真实的用户行为,在模拟器和真实设备上执行测试任务。Appium支持多种移动操作系统(如IOS、Android等)的测试,并可以通过多语言(如Java、Python、Ruby等)进行编写。

类似于Selenium中的WebDriver,Appium也有自己的WebDriver,称为AppiumDriver。AppiumDriver是WebDriver的一个子类,用于控制移动设备上运行的应用程序。与WebDriver相同,AppiumDriver也支持多种平台和语言编写的自动化测试脚本。

三、Selenium和Appium的底层关联

在底层代码实现中,Selenium和Appium之间的关联主要有两个方面:一是Selenium WebDriver提供了底层的浏览器控制机制,而AppiumDriver基于WebDriver的API实现了移动设备控制的能力;二是Appium利用了Selenium WebDriver中的JSON Wire Protocol通信协议来实现与Appium Server之间的通讯机制。

1. Selenium WebDriver提供底层的浏览器控制机制

Selenium WebDriver通过控制浏览器的驱动程序来模拟用户在浏览器上的各种操作,包括点击、输入、跳转等等。WebDriver通过与浏览器内部的JavaScript引擎进行交互,在Web页面中注入JavaScript脚本,再通过DOM结构操作实现对Web页面的自动化控制。

在Appium的底层实现中,AppiumDriver继承自Selenium WebDriver,借助了WebDriver提供的低层次浏览器控制机制实现了对移动设备的控制。除此之外,Appium还通过自己的API来实现了移动设备中特有的功能,如截图、定位、手势操作等等。

2. 利用JSON Wire Protocol通信协议实现通讯机制

Selenium WebDriver和AppiumDriver之间的通讯采用了JSON Wire Protocol通信协议,它是一种轻量级且简单易学的协议,可以帮助实现不同语言和平台之间的通信。在实际测试中,Selenium WebDriver和AppiumDriver都需要与相应的DriverServer进行通讯,而这些DriverServer则会向应用程序发送命令来控制浏览器或移动设备。

JSON Wire Protocol协议中包含了三个部分:请求(Request)、响应(Response)、错误(Error)。它采用HTTP协议进行通讯,利用RESTful风格来定义不同的请求类型,并使用JSON格式来传输数据。例如,发送一个点击链接的请求,请求的格式如下:

{"sessionId": "1234567890","command": "click","target": "link text","value": "Example Link"
}

其中sessionId是对话的唯一标识符,command是请求的类型,target是要执行的操作目标,value是要输入的值。这个请求将被应用程序解析并执行相应的操作,然后返回相应的结果。

Appium利用WebDriver定义的JSON Wire Protocol通信协议,实现了与移动设备的通讯机制。Appium Server将接收到的JSON字符串在本地进行解析,然后再发送给移动设备上的DriverServer执行相应的操作。DriverServer会解析接收到的指令,并将操作执行在移动设备上。例如,发送一个点击按钮的请求,请求的格式如下:

{"sessionId": "1234567890","command": "click","element": "//button[@text='Submit']"
}

其中sessionId是对话的唯一标识符,command是请求的类型,element是要点击的按钮的标识符。这个请求将被Appium Server解析,并发送给移动设备上的DriverServer执行相应的操作,然后再返回结果。

四、实例代码

下面是一个实例代码,它演示了如何使用Selenium WebDriver和AppiumDriver进行测试,并演示了它们之间的联系:

//使用Selenium WebDriver测试一个Web页面
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class SeleniumTest {public static void main(String[] args) {System.setProperty("webdriver.chrome.driver", "chromedriver.exe");WebDriver driver = new ChromeDriver();driver.get("http://www.baidu.com");driver.quit();}
}//使用AppiumDriver测试一个Android应用程序
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.DesiredCapabilities;import java.net.URL;public class AppiumTest {public static void main(String[] args) throws Exception {DesiredCapabilities capabilities = new DesiredCapabilities();capabilities.setCapability("deviceName", "Android Emulator");capabilities.setCapability("appPackage", "com.example.android.contactmanager");capabilities.setCapability("appActivity", ".ContactManager");capabilities.setCapability("platformName", "Android");URL url = new URL("http://127.0.0.1:4723/wd/hub");AndroidDriver driver = new AndroidDriver(url, capabilities);driver.quit();}
}

上面的代码演示了如何使用Selenium WebDriver测试一个Web页面,并且使用Chrome浏览器来执行。另外一个代码演示了如何使用AppiumDriver测试一个Android应用程序,并且使用模拟器作为测试设备。这两个测试工具都是基于WebDriver接口实现的,其中Selenium WebDriver用于控制浏览器进行测试,AppiumDriver用于控制移动设备进行测试,同时它们都遵循了JSON Wire Protocol通信协议进行通信。

总结:

Selenium和Appium是两个重要的自动化测试工具,它们能够帮助测试人员提高测试效率和质量。在底层代码实现中,Selenium WebDriver提供了底层的浏览器控制机制,而AppiumDriver基于它的API实现了移动设备控制的能力。同时,它们都采用了JSON Wire Protocol通信协议来实现与DriverServer之间的通讯机制。对于测试工程师来说,了解Selenium和Appium之间的关联可以更好地理解自动化测试的底层实现,并且可以根据实际需求来选择合适的测试工具进行测试。最后,给出几点实用建议:

1. 在使用Selenium和Appium进行测试时,需要先了解目标浏览器或移动设备的特性和限制。这样才能编写出可靠的测试脚本和有效的测试用例。

2. 学会使用Selenium WebDriver和AppiumDriver提供的API方法和函数,在测试过程中可以更轻松地对页面元素和移动设备进行操作。

3. 对于Selenium WebDriver和AppiumDriver提供的代码接口,需要进行适当的封装和抽象,以便在编写测试脚本时更加高效和灵活。

4. 在实际测试过程中,需要配置相应的DriverServer和测试环境。尝试不同的配置组合,可以更好地发现测试用例中的缺陷和问题。

5. 学习JSON Wire Protocol通信协议和RESTful风格的API设计,可以帮助理解Selenium WebDriver和AppiumDriver之间的关联,并实现自己的通讯机制。

总之,掌握Selenium和Appium之间的底层关联可以更好地理解自动化测试的底层实现,提高测试效率和测试质量。希望本文可以对读者有所启发,对自动化测试工作者有所帮助。

 作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些自动化测试的学习资源,如果你用得到的话可以直接拿走,希望能对你带来帮助。(包括Python编程、WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、性能测试、安全测试、大厂面试真题、简历模板等等),相信能使你更好的进步!

获取方式:留言【自动化测试学习】即可免费获取
【自动化测试交流】:574737577(进群备注ccc)icon-default.png?t=N4HBhttp://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=5Yy1aF4jOfrqXFA_eg14oG9EZ5fFbv5A&authKey=zYx3Zivwu55NOCM%2B%2BKqaZjoeTRS5xMdAmfqX%2FyzUm4lvrD4q75P5Ukeg%2FPBRMMbm&noverify=0&group_code=574737577

 

相关文章:

深度剖析,如何从底层代码层面理解Selenium和Appium的关联

目录 前言: 一、Selenium和WebDriver 二、Appium和WebDriver 三、Selenium和Appium的底层关联 1. Selenium WebDriver提供底层的浏览器控制机制 2. 利用JSON Wire Protocol通信协议实现通讯机制 四、实例代码 总结: 前言: Selenium和…...

【Three.js】第一、二章 入门指南和基础知识

01.介绍 Three.js 非常庞大,你可以用它做无数的事情。 在第一章中,我们将学习所有基础知识,例如创建第一个场景、渲染、添加对象、选择正确的材料、添加纹理、为所有内容制作动画,甚至将其放到网上。有些人可能会觉得这部分有点…...

力扣第 104 场双周赛 2681. 英雄的力量

原题链接力扣 题目大意:我开始看成连续子段了,写了个递归程序....... 一个数组任选一个子序列,子序列的力量值最大值平方*最小值。求所有子序列的力量和。 分析过程:如序列长度为n,子序列总数为2的n次幂&#xff0c…...

在linux上创建crypto_LUKS格式的块设备

要在Linux上创建一个块设备并将其格式化为 crypto_LUKS,可以按照以下步骤进行: 创建一个空白文件,作为块设备的基础。可以使用 dd 命令创建指定大小的文件,例如: dd if/dev/zero of/path/to/device bs1M count100这将创…...

76.建立一个主体样式第二部分

上节课的时候我们完成的页面是这个样子! ● 之后我们通过绝对定位来解决位置定位的问题 .header-container {width: 1200px;margin: 0 auto;position: absolute;left: 50%;top: 50%; }header {height: 100vh;background-color: orange;position: relative; }● 之…...

SQL删除重复的记录(只保留一条)-窗口函数row_number()

文章目录 一、关于mysql表中数据重复二、聚合函数min(id)not in二、窗口函数row_number()四、补充:常见的窗口函数 一、关于mysql表中数据重复 关于删除mysql表中重复数据问题,本文中给到两种办法:聚合函数、窗口函数row_number()的方法。 (注…...

CF1660D Maximum Product Strikes Back 题解

CF1660D Maximum Product Strikes Back 题解 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路点拨(分类题)缩小研究对象范围除0的分析加上0的分析 代码实现小方法陈述 题目描述 你有一个长度为 n n n 的数组,每一个元素都在 …...

基于CSSOM的暗链检测技术实现方案

什么是暗链 大部分的开源代码在实现暗链检测的时候都是直接判断页面里面有没有敏感词,如果有,就认为该链接为暗链。这种做法其实是有误的。 违规链接应该分为:外链、内链、死链和暗链。而暗链除了违规,还应该具备“暗”这个看不见的特征。 暗链的特征 其实“暗链”就是看…...

MySQL db、tables_priv、columns_priv和procs_priv权限表

在 MySQL 数据库中,权限表除了 user 表外,还有 db 表、tables_priv 表、columns_priv 表和 procs_priv 表。在《MySQL user权限表详解》中我们讲解了 MySQL 的 user 表,下面主要介绍其它几种权限表。 db表 db 表比较常用,是 MyS…...

JavaWeb-JSP的学习

JSP 今日目标: 理解 JSP 及 JSP 原理能在 JSP中使用 EL表达式 和 JSTL标签理解 MVC模式 和 三层架构能完成品牌数据的增删改查功能 1、JSP 概述 JSP(全称:Java Server Pages):Java 服务端页面。是一种动态的网页技术…...

力扣sql中等篇练习(二十三)

力扣sql中等篇练习(二十三) 1 统计实验的数量 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 有可能数据本身就不全,就需要自行创建临时表 WITH T as (SELECT Android p1,Reading e1UNIONSELECT Android p1,Sports e1UNIONSELECT Android p1,Prog…...

C语言算法之查找

一.查找相关概念 这一部分解释数据结构里面查找的相关基础概念: 查找:在数据集合中寻找满足某种条件的数据元素的过程。查找表:用于查找的数据集合关键字:数据元素中唯一标识该元素的某个数据项的值静态查找表:静态查…...

肝一肝设计模式【九】-- 享元模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝…...

自动化测试的十大雷区【刚入门必看】

虽然从自己的错误中学习也不错,但从别人的错误中学习总是更好的。 作为一个自动化测试人员,分享常见的容易犯的10个错误,可以从中吸取教训,引以为鉴。 一、必要时才自动化 新人小王接到为Web应用程序自动化测试脚本的任务时&…...

【Android源码篇】用grep搜索源码内容关键词

前言 选项: • -w:只匹配整个单词,不会部分匹配 • -r:递归搜索 • -n:显示行号 • -i:忽略字符大小写 • -I(大写i):忽略二进制文件 • -I:忽略文件内容&am…...

腾讯云轻量应用服务器卡死怎么连接?

腾讯云轻量云服务器卡死怎么解决?使用腾讯云自带的VNC登录连接轻量服务器,或使用腾讯云OrcaTerm一键免密登录轻量实例。如果是确定数据没问题,也可以使用控制台自带的重启实例。 腾讯云轻量应用服务器参考:https://curl.qcloud.co…...

Charles安装及抓取APP接口

一、Charles使用 Charles是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的,能够在Windows,Mac,…...

Linux开发工具:yum和vim的使用

目录 一. Linux下的软件 1.1 软件安装的三种方法 1.2 采用yum安装软件 1.3 yum源的问题 二. vim开发工具的使用 2.1 vim的三种基本模式 2.2 命令模式下vim的常用指令 2.2.1 定位相关指令 2.2.2 光标移动相关指令 2.2.3 插入相关指令 2.2.4 复制粘贴相关指令 2.2.5 替…...

Java基础重温巩固

方法 方法与方法之间是平级关系,不能嵌套return表示结束当前方法 基本数据类型和引用数据类型 基本数据类型:数据存储在自己的空间中 引用数据类型:数据存储在其他空间中,自己空间存储的是地址值 值传递 传递基本数据类型时&…...

Text2SQL 语义解析数据集、解决方案和学术论文资源整合

目录 什么是Text2SQL? Text2SQL语义解析数据集 Text2SQL解决方案 Text2SQL相关学术论文 欢迎大家,我是你们的博主,今天我们来讨论一个非常有趣且有挑战性的话题 —— Text2SQL。这个话题涉及到自然语言处理 (NLP),数据库查询语言 (SQL)&…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...