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

news2024/11/23 14:34:13

 目录

 前言:

一、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

 

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

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

相关文章

FFmpeg命令实战(中)

标题 1.ffplay命令播放2.ffplay简单过滤器3 .ffmpeg命令参数1.主要参数2. 音频参数3.视频参数 4.ffmpeg命令提取音视频数据1.保留封装格式2.提取视频3.提取音频 5.ffmpeg提取像素格式1.提取YUV2.提取RGB3.提取PCM 5.ffmpeg命令转封装格式1.保持编码格式2.改变编码格式3.修改帧率…

String源码

介绍 1&#xff09;String 是一个 final 类&#xff0c;即不能被继承的类 。 2&#xff09;String类实现了 java.io.Serializable 接口&#xff0c;可以实现序列化。 3&#xff09;String类实现了 Comparable< String>&#xff0c;可以用于比较大小&#xff08;按顺序…

49天精通Java,第34天,finalize、引用计数、JVM停止复制、JVM即时编译器

目录 一、finalize二、引用计数三、JVM停止复制四、JVM即时编译器五、惰性评估 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xff0c;49天精通Java从入门到就业。 全网最细Java零基础手把手入门教程&#xff0c;系列课程包括&#xff1a;基础篇、集合篇、Java8…

chatgpt赋能Python-pythonchallenge

Python Challenge: 挑战你的Python技能 如果你正在寻找一种提高Python编程技能的有趣方法&#xff0c;那么Python Challenge是一个不错的选择。Python Challenge是一个在线的puzzle游戏&#xff0c;每个挑战都需要使用Python编写程序来解决。这些挑战是由一个名叫Nadav Samet的…

centos或ubuntu部署OpenSips

参考 Centos7安装opensips超详细教程 centos7 部署opensips信令服务器 【死磕opensips】sip协议解析 开源SIP Kamailio OpenSIPS的四种均衡负载算法详解和SBC呼叫路由 基于SIP协议的性能测试——奇林软件kylinPET OpenSIPS实战&#xff08;一&#xff09;&#xff1a;OpenSIPS…

【消息中间件】RocketMQ如何保证消息的可靠性?

文章目录 前言一 、发送端消息可靠性1. 同步发送2. 异步发送3. 单向发送4. 发送重试策略 二、存储端消息可靠性1. 存储可靠性挑战2. 同步刷盘3. 异步刷盘&#xff08;默认&#xff09;4. 过期文件删除 三、消费端消息可靠性1. 消费重试2. 死信队列3. 消息回溯 四、总结参考与感…

一文读懂“大语言模型”

1、背景 本文基于谷歌云的官方视频&#xff1a;《Introduction to Large Language Models》 &#xff0c;使用 ChatGPT4 整理而成&#xff0c;希望对大家入门大语言模型有帮助。 本课程主要包括以下 4 方面的内容&#xff1a; 大语言模型的定义描述大语言模型的用例解释提示…

网络安全分组混战靶机攻击与加固——BPlinux系列

网络安全分组混战靶机攻击与加固——BPlinux系列 目录 一、渗透过程 二、加固过程 三、中职网络安全竞赛知识星球 一、渗透过程 #这是一个以前混战阶段用的靶机然后C模块也会用 1、我们先使用nmap --scriptvuln(这是nmap自带的脚本&#xff0c;可以扫描可利用的漏洞&…

计算机网络|第四章:网络层:数据平面

前文回顾&#xff1a;第三章&#xff1a;传输层 运输层依赖于网络层的主机到主机的通信服务&#xff0c;提供各种形式的进程到进程的通信。网络层与传输层和应用层不同的是&#xff0c;在网络中的每一台主机和路由器中都有一个网络层部分。正因如此&#xff0c;网络层协议是协议…

metaRTC+ZLMediaKit实现webrtc的推拉流

概述 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架&#xff0c;是一个支持webrtc SFU的优秀的流媒体服务器系统。 metaRTC新版本支持whip/whep协议&#xff0c;支持whip/whep协议的ZLMediaKit推拉流。 信令通信 ZLMediaKit新版本支持whip和whep协议&#xff0c;支…

065:cesium设置带有箭头的线材质(material-9)

第065个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置带有箭头的线材质,请参考源代码,了解PolylineArrowMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共82行)相关API参考…

Microsoft Office 2010安装

哈喽&#xff0c;大家好。今天一起学习的是office2010的安装&#xff0c;有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统&#xff1a;Windows 7 不建议win10及以上操作系统使用 系统类型&#xff1a;64位 演示版本&#xff1a;SW_DVD5_Office_Profession…

Ceres简介及示例(9)On Derivatives(Numeric derivatives)

使用analytic derivatives的另一个极端是使用numeric derivatives。关键是&#xff0c;对函数f(x)关于x的求导过程可以写成极限形式: Forward Differences前向差分 当然&#xff0c;在计算机中&#xff0c;我们不能执行数值求极限操作&#xff0c;所以我们要做的是&#xff0…

squid的基本代理

一、Squid代理服务器的概述 squid 作为一款服务器代理工具&#xff0c;可以缓存网页对象&#xff0c;减少重复请求&#xff0c;从而达到加快网页访问速度&#xff0c;隐藏客户机真实IP&#xff0c;更为安全。 Squid主要提供缓存加速、应用层过滤控制的功能 1、squid代理的工…

攻击者使用“Geacon”Cobalt Strike工具瞄准macOS

威胁行为者现在正在部署一种名为 Geacon 的 Cobalt Strike 的 Go 语言实现&#xff0c;它于四年前首次出现在 GitHub 上。 他们正在使用红队和攻击模拟工具来针对 macOS 系统&#xff0c;其方式与过去几年在 Windows 平台上使用 Cobalt Strike 进行后开发活动的方式大致相同。…

Rust每日一练(Leetday0007) 删除结点、有效括号、合并链表

目录 19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list &#x1f31f;&#x1f31f; 20. 有效的括号 Valid Parentheses &#x1f31f; 21. 合并两个有序链表 Mmerge-two-sorted-lists &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Ru…

web搭建服务器端+创建web后端项目详细步骤

一、搭建服务器端 Web服务器&#xff1a;用于响应来自Web客户端&#xff08;如浏览器、移动应用程序等&#xff09;的请求并提供Web页面和其他Web资源的软件程序或计算机系统。它允许用户在Web浏览器中输入网址&#xff0c;通过HTTP协议向服务器发送请求&#xff0c;并收到Web页…

用原生JS实现虚拟列表(IT枫斗者)

用原生JS实现虚拟列表 介绍 最近在开发需求的时候&#xff0c;有用到 Antd 的虚拟列表组件 rc-virtual-list &#xff0c;粗略地看了一下源码&#xff0c;于是萌生了自己写一个虚拟列表的想法。当一个列表需要渲染大量数据的时候是非常耗时的&#xff0c;而且在列表滚动的过程…

Golang每日一练(leetDay0073) 实现前缀树、最短子数组

目录 208. 实现 Trie (前缀树) Implement-trie-prefix-tree &#x1f31f;&#x1f31f; 209. 长度最小的子数组 Minimum-size-subarray-sum &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每…

多线程的三种创建方式及各自的优缺点分析

第一种方式&#xff1a;继承Thread类&#xff0c;覆写run()方法 1、创建一个MyThread类&#xff0c;继承Thread类&#xff1b; 2、覆写run()方法&#xff0c;在run()方法内编写任务代码&#xff1b; 3、创建MyThread类&#xff0c;需要注意的是&#xff0c;如果想要给线程命名…