IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> UI自动化测试框架:selenium webdriver原理 -> 正文阅读

[Python知识库]UI自动化测试框架:selenium webdriver原理

当我开始想要学习UI自动化测试,开始搜索相关资料时,展现在我眼前的除了经典的selenium,还有很多如puppeteer、cypress、testcafe、Airtest,我决定对提到最多的selenium、puppeteer和cypress的原理做一番研究。

Selenium

Selenium webdriver 使用WebDriver来远程控制浏览器实例, 并模拟用户与浏览器的交互。

当我们按照入门教程,在本地环境中实现了使用selenium自动化控制浏览器,完成打开amazon首页-> 输入"自动化测试"->点击搜索得到结果的整个过程时,我们可以明确感知到三样东西:

  • selenium测试代码:Selenium测试代码是开发/测试人员使用不同的语言和相应的selenium API库完成的测试代码,具体可以查看下方以Amazon搜索商品功能为例的Python代码实现。

  • 浏览器driver:即我们在运行selenium代码前,下载的针对不同浏览器开发的chromedriver、geckodriver等。

  • 浏览器:自动化程序运行时,会打开代码中与浏览器Driver对应的浏览器,我们可以直观地看到代码的运行效果。
    在这里插入图片描述

而,WebDriver,作为selenium的核心,却并不在这三个肉眼可见的东西里。这是怎么回事呢?我们先来看看WebDriver是什么。

WebDriver

WebDriver是一个基于HTTP的协议,它提供了一系列的接口用于发现和控制 Web 文档中的 DOM 元素,几乎可以操作浏览器做任何事情。WebDriver协议的详细信息你可以在W3C WebDriver 规范中查看。

以访问亚马逊中国首页为例,代码实现为driver.get('https://www.amazon.cn/'),查看源码,可以在webdriver.py中看到get方法实际上是调用了self.execute(Command.GET, {'url': url}),而WebDriver类是继承自Remoteexecute方法的核心逻辑是response = self.command_executor.execute(driver_command, params),其中Command.GET在remote_connection.py中的定义为Command.GET: ('POST', '/session/$sessionId/url')

也就是说,Selenium测试代码运行时,会向浏览器driver发送对应的HTTP请求,浏览器driver在收到请求后对浏览器进行操作,再将结果返回给Selenium测试代码。那么,如果我们先运行浏览器driver,再通过Postman向其发送HTTP请求,是不是也能控制浏览器呢?答案当然是肯定的。下面我们以在Amazon中搜索商品的操作为例,实际操作一下。

Postman发送基于WebDriver协议的HTTP请求实现UI自动化

首先,启动chromedriver,双击chromedriver文件打开即可:
在这里插入图片描述

启动成功之后,注意到控制台中输出了chromedriver启动和监听的的端口号为9515。

然后启动Postman,我们可以开始发送基于WebDriver协议的请求了!

  1. 建立连接:driver = webdriver.Chrome(executable_path='/path/to/chromedriver')

    对应的请求为POST http://localhost:9515/session

    {
        "desiredCapabilities": {
            "caps": {
                "nativeEvents": false,
                "browserName": "chrome",
                "version": "",
                "platform": "ANY"
            }
        }
    }
    

    点击Send后,我们可以看到Chrome自动打开了,检查一下Response,返回了很多信息,其中sessionId是后续所有操作都需要使用的参数,可以将其保存到postman的环境变量中,方便使用。

  2. 进入amazon首页:driver.get('https://www.amazon.cn/')

    对应的请求为:POST http://localhost:9515/session/{{sessionId}}/url

    {"url":"https://www.amazon.cn/"}
    
  3. 查找输入框元素:search_input = driver.find_element(By.ID,'twotabsearchtextbox')

    对应的请求为:POST http://localhost:9515/session/{{sessionId}}/element

    {"using":"id","value":"twotabsearchtextbox"}
    

    这个请求会返回查找到的元素的ID即ELEMENT,我们将其保存到环境变量searchInputId中。

  4. 在输入框中输入搜索关键词:search_input.send_keys("自动化测试")

    对应的请求为:POST http://localhost:9515/session/{{sessionId}}/element/{{searchInputId}}/value

    {"value":["自动化测试"]}
    
  5. 查找搜索按钮:search_button = driver.find_elements(By.CLASS_NAME,'nav-input')[0]

    对应的请求为:POST http://localhost:9515/session/{{sessionId}}/elements

    {"using": "className","value": "nav-input"}
    

    这里会查找到2个元素,第一个是我们想要的搜索按钮,将搜索按钮元素ID保存到环境变量searchButtonId

  6. 点击搜索按钮:search_button.click()

    对应的请求为:http://localhost:9515/session/{{sessionId}}/element/{{searchButtonId}}/click

  7. 获取浏览器当前窗口的标题,用做测试用例的断言:assertEqual(driver.title, '亚马逊 : 自动化测试')

    获取标题的请求为:GET http://localhost:9515/session/{{sessionId}}/title

    标题在返回的value中。

  8. 结束测试,断开连接:driver.close(),对应为DELETE http://localhost:9515/session/{{sessionId}}

下面奉上完整的Postman Collection Json文件,请各位看官们自取。

在这里插入图片描述

浏览器driver是如何与浏览器沟通的呢?

对于Chrome浏览器,ChromeDriver解析webdriver协议后,然后根据解析结果,再去调用与之对应的Chrome DevTool Protocol (CDP)协议来操控chrome浏览器,它可以和浏览器内核进行交互进而操控浏览器。关于CDP协议的具体内容,我会在puppeteer框架的原理中详细介绍。

同样地,对于Firefox浏览器,也是由geckodriver解析webdriver协议后再去调用相应的Marionette remote protocol来操控Firefox浏览器。

Chrome DevTool Protocol和Marionette remote protocol这两个协议的作用是相同的,但由于浏览器内核的不同,协议的实现是存在差别的,因此当我们想要驱动不同的浏览器时,需要下载浏览器对应的driver。

Reference

  1. Selenium Webdriver原理终于搞清楚了!
  2. selenium doc
  3. Browser automation using ChromeDriver and Postman
  4. WebDriver 的协议标准 W3C
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:04:23  更:2021-08-26 12:05:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 23:22:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计