Jmeter模拟selenium操作浏览器
前言
selenium是一个web自动化测试的开源框架,它支持多语言:python/java/c#…
selenium支持多语言,是因为selenium与浏览器驱动之间是通过http协议进行通信的。只关心通信的数据是否能够正确解读 ,并不关心这个数据是从哪个客户端来。无论来自python\java,还是jmeter,postman都没有问题。
本篇文章中,以Jmeter做为客户端,跳过selenium,直接与谷歌浏览器驱动(chromedriver)进行http通信,驱动chrome浏览器去执行命令。
需要解决的问题
1、selenium有哪些请求?
2、每一个请求的请求url、请求类型如何获取?
3、每一个请求的请求数据又如何获取?
selenium - json wire protocol - 获取请求url和类型
要想解决以上3个问题,我们需要了解selenium的部分原理。
在selenium与驱动进行http通信的协议全称叫做:json wire protocol.
我们在使用selenium库驱动浏览器的时候,我们的操作有一部分大概是以下这样的:
1)打开chrome浏览器;
2)访问某一个网址;
3)查找该网址中的某一个元素;
4)操作3)中查找到的元素。
在selenium库看来,以上每一步操作都是一个http请求,也叫做命令(Command)。
chromedriver在收到这个请求之后,再去驱动对chrome浏览器执行对应的动作。
所以,在selenium库当中,存储了所有命令(Command)名称、命令对应的http请求类型、命令对应的请求url。
首先,来看看Command的名称(选取几个大家熟知的操作):
访问网站命令(GET)对应的请求类型和请求url为:
从上图可以看出,GET命令是post请求,请求地址只有一部分。
url中有3个问题:
1)请求的url并不完整。
url中,缺失中base地址。base地址为,chromedriver的ip+端口号。因为,命令是发给chromedriver去执行的。
2)url当中的$sessionId是什么?
在selenium当中,每开启一次与chromedriver的会话,都会生成一个会话ID。sessionId就是这个会话ID。在很多的命令请求当中,在请求地址中,通过sessionId都绑定了当前的会话。
换句话说,我们要用requests与chromedriver进行通信,那么我们首先,得生成会话ID,并得到这个ID值,才能够进一步的去访问网页,去发送更多的浏览器操作命令。
3)sessionId从何而来?如何获取?
在selenium当中,通过NEW_SESSION请求来开启会话,chromedriver在收到请求后,在响应数据中,返回本次会话的sessionId
接下来,以百度为例子,使用Jmeter来完成浏览器的操作
1、启动webdriver接口服务
点击运行chromedriver.exe文件(注意:chromedriver需与当前浏览器的版本一致,不一致可自行百度下载与浏览器一致的版本),打开后,默认端口号为9515,请求地址:http://127.0.0.1:9515
2、新建浏览器会话
Webdriver协议中一般使用POST请求, 数据使用JSON格式发送,即使不需要参数也要传递{}的JSON数据。
新建会话的接口及数据如下,新建会话时同capabilities指定要启动浏览器的选项。
POST http://127.0.0.1:9515/session
{
“capabilities”: {“browserName”: “chrome”}
}
Jmeter中的请求设置如下图所示:
响应中会返回一个sessionId,如:8ed0492f296082d2e2569cf7f0e637d2,这个sessionId就代表这个浏览器(会话),将其提取出来,以备后续接口使用
3、打开指定网址
接口及数据为:
POST http://127.0.0.1:9515/session/8ed0492f296082d2e2569cf7f0e637d2/url
{“url”: “https://www.baidu.com/”}
Jmeter中请求如下:
4、元素定位-输入框
接口及数据为:
POST http://127.0.0.1:9515/session/8ed0492f296082d2e2569cf7f0e637d2/element
{“using”: “css selector”, “value”: “#kw”}
这里的using支持以下5种:
“css selector”
“tag name”
“xpath”
“link text”
“partial link text”
Selenium中的find_element_by_id(), find_element_by_name()和find_element_by_class_name()实际上用的是css selector。
id=“kw”:相当于 css selector “#kw”
class_name=“card”:相当于 css selector “.card”
name=“info”:相当于 css selector “[name=info]”
执行后响应中会返回元素id,如:eef207e2-59c1-429d-9425-f1fd2da93c35,代表这个元素
5、输入元素
输入操作接口数据为:
POST http://127.0.0.1:9515/session/8ed0492f296082d2e2569cf7f0e637d2/element/eef207e2-59c1-429d-9425-f1fd2da93c35/value
{“text”: “selenium”}
注意session/后面的是sessionId, element/后面是元素id
6、元素定位-百度按钮
和第4步元素定位一样,只是请求参数不同
7、点击百度按钮
点击百度按钮接口操作数据:
POST http://127.0.0.1:9515/session/8ed0492f296082d2e2569cf7f0e637d2/element/eef207e2-59c1-429d-9425-f1fd2da93c35/value
{}
8、关闭浏览器
关闭浏览器接口操作数据:
DELETE http://127.0.0.1:9515/session/8ed0492f296082d2e2569cf7f0e637d2
{}
注意,这个是delete请求,删除会话,相当于关闭浏览器
到此,Jmeter模拟selenium操作浏览器的简单演示就结束了
Jmeter模拟selenium操作浏览器相关推荐
- chrome frame节点 取_爬虫3-下(利用Selenium + Chrome Driver模拟用户操作浏览器)
一.前言 前面利用request的方法爬取页面数据的操作,今天用另外一种方法:利用Selenium + Chrome Driver模拟用户操作浏览器,来爬取数据. 在此之前需要做一些准备工作:安装se ...
- 零基础:Python之Selenium操作浏览器模拟登陆QQ邮箱
零基础:Python之Selenium操作浏览器模拟登陆QQ邮箱 一. Selenium简介 二. 环境配置 2.1 Python运行环境搭建 2.2 Selenium相关安装与配置 2.2.1 Se ...
- java操作浏览器_java selenium 操作浏览器实例
导读热词 本篇文章介绍selenium 操作浏览器 阅读目录 浏览器最大化 前进,后退, 刷新 截图操作 模拟鼠标操作 杀掉Windows浏览器进程 浏览器最大化 前进,后退, 刷新 public s ...
- [Python爬虫]使用Selenium操作浏览器订购火车票
这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分 [Python爬虫]使用Python爬取动态网页-腾讯动漫(Selenium) [Python爬虫]使用Python爬取静态网页-斗 ...
- selenium 原理应用 - 利用 requests 模拟 selenium 驱动浏览器
前言 selenium 是一个 Web 自动化测试的开源框架,它支持多语言:python/java/c#- 前面也有一篇文章说明了,selenium+ 浏览器的环境搭建. selenium 支持多语言 ...
- selenium操作浏览器的前进和后退
前进关键字:driver.forward() 后退关键字:driver.back() 测试对象:1.https://www.baidu.com/ 2.https://www.sogou.com/ 实例 ...
- Selenium基础 — Selenium操作浏览器窗口滚动条
1.为什么操作滚动条 在HTML页面中,由于前端技术框架的原因,页面中的一些元素为动态显示,元素根据滚动条的下拉而被加载. 例如:页面注册同意条款,需要滚动条到最底层,才能点击同意. 2.Seleni ...
- selenium操作浏览器cookie方法
/** * 操作浏览器的cookie */ @Test public void testCookie()throws Exception{ ...
- [Selenium] 操作浏览器 Cookies
WebDriver 提供了一系列 Cookies 的操作来获取.填写.删除 Cookies 的方法,节省了多次在登陆页面的查找元素并填写登录信息的时间. 1)获取 Cookies ,并保存到文件中以备 ...
最新文章
- 【ACM】熊孩子的乐趣
- 人工智能及其应用(第5版).蔡自兴-1-5章课后习题。【部分无答案】
- 【项目实践】从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附注释项目代码)...
- 使用C++实现Socket编程图片打包传输(修改)
- zTree新增的根结点再新增子节点reAsyncChildNodes不生效解决方案
- tensorflow随笔-二分法求解一元方程
- 使用eclipse开发javaweb登录功能
- 安装php遇到的问题
- 为DataList和GridView内容项添加序号
- 大学计算机应用基础教程第三章,计算机应用基础教程 李健苹 计算机应用基础教程 第3章...
- 插件占坑,四大组件动态注册前奏(三) 系统BroadCast的注册发送流程
- laravel php artisan migrate 数据迁移时出现的[HY000][1045]错误
- 问题: 在Multisim中的 Tools»Show Breadboard,我找不到面包板视图的选项。
- MINIST数据集读取
- 电脑键盘部分按键失灵_华硕笔记本键盘有部分按键失灵 - 卡饭网
- 模N计数器-计数+使能信号
- 有哪些超好用的邮件群发软件?这款做邮件推广的一定要试试!
- python安装os模块_python安装os
- java如何表格一样对齐_如何水平对齐表格? (How can I horizontally align a form?)
- Android Espresso(一)——环境建立