selenium webdriver 实现Canvas画布自动化测试
https://blog.csdn.net/xiaoguanyusb/article/details/80324210
由借鉴意义, 转过来
canvas 是一个画布,定位元素时只能定位到画布上,如下乳所示,网页上有一张类似于下图的eChart报表图片。selenium的基本定位方式只能定位到该画布上,画布上的子元素通过selenium的基础定位方式是定位不到的, 此时就需要使用selenium的js注入的方式,通过插入js脚本的方式获取索要操作的元素坐标。 再使用action对应的方法去执行对应的操作。

1: 创建注入js方法。用于获取canvas画布上的具体元素消息
window.T={
getCanvasId:function (id){
var cache = *****.echartCache;
var instances = [];
for (var key in cache){
//alert(key);
if (key.indexOf(id) != -1){
instances.push(key);
}
}
return instances
}
}
2: 通过如下js.executeScript方法将js脚本注入页面。
String jsCode=getText("e:/jsb.js");
Object a=js.executeScript(jsCode);
3: 通过再次注入js脚本的方式调用刚刚注入的js方法,获取元素在canvas上的元素坐标。
String script = "return window.T.getCanvasId(\"" + keys + "\")";
Object object = js.executeScript(script);
logger.info(object);
static String getText(String path) {
File file=new File(path);
String out=null;
StringBuilder result=new StringBuilder();
try{
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法,一次读一行
result.append(s+"\n");
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
out=result.toString();
return out;
}
4: 然后,使用action相关方法更具js获取到的x、y坐标进行操作。
/**
*左键点击元素上的具体坐标位置
* @param driver
* @param abnormElement 需要点击的元素
* @param x 需要点击的元素上的点的X坐标
* @param y 需要点击的元素上的点的Y坐标
*/
public static void mouseClick(WebDriver driver, WebElement abnormElement, int x, int y) {
Actions actions = new Actions(driver);
actions.release();
actions.moveToElement(abnormElement, x, y).click().build().perform();
} /**
*右键点击元素上的具体坐标位置
* @param driver
* @param abnormElement 需要点击的元素
* @param x 需要点击的元素上的点的X坐标
* @param y 需要点击的元素上的点的Y坐标
*/
public static void mouseRightClick(WebDriver driver, WebElement abnormElement, int x, int y) {
Actions actions = new Actions(driver);
actions.release();
actions.moveToElement(abnormElement, x, y).contextClick().build().perform();
} /**
*拖拽元素上的具体坐标位置
* @param driver
* @param abnormElement 需要点击的元素
* @param x 需要点击的元素上的点的X坐标
* @param y 需要点击的元素上的点的Y坐标
*/
public static void mouseMoveto(WebDriver driver, WebElement abnormElement, int x, int y){
Actions actions = new Actions(driver);
actions.release();
actions.moveToElement(abnormElement, x, y).clickAndHold().release().build().perform();
} /**
* 拖拽元素上的具体坐标位置
* @param driver
* @param abnormElement 需要点击的元素
* @param x 需要拖拽元素点的X坐标
* @param y 需要拖拽元素点的Y坐标
* @param to_x 拖拽元素点目标位置的X坐标
* @param to_y 拖拽元素点目标位置的Y坐标
*/
public static void mouseDragAndDrop(WebDriver driver, WebElement abnormElement, int x, int y,int to_x,int to_y){
Actions actions = new Actions(driver);
actions.release();
actions.moveToElement(abnormElement, x, y).clickAndHold().moveByOffset(to_x,to_y).release().build().perform();
}
问 :你好作者, 我在PC浏览器的console 执行下面代码报错, 1.请问 ***** 是什么: var cache = *****.echartCache 2.下面的keys 又是什么? "return window.T.getCanvasId(\"" + keys + "\")"; 期待博主的回复~
答:你好, 我这个是有点笔记的形式写的。 其实**** 是你canvas的固定路径。 如果你canvas图片的id是固定的话, 是不需要那个方法的。 我这边是因为canvas图片的id是动态的。 所有我需要根据静态的路径去获取动态的canvas画布id。 如果你canvas的图片id本来就是静态的话。 就没必要使用上面的那个方法了。 直接跟开发交流获取图片的JS信息就够了
selenium webdriver 实现Canvas画布自动化测试的更多相关文章
- 转载 基于Selenium WebDriver的Web应用自动化测试
转载原地址: https://www.ibm.com/developerworks/cn/web/1306_chenlei_webdriver/ 对于 Web 应用,软件测试人员在日常的测试工作中, ...
- Selenium WebDriver + python 自动化测试框架
目标 组内任何人都可以进行自动化测试用例的编写 完全分离测试用例和自动化测试代码,就像写手工测试用例一下,编写excel格式的测试用例,包括步骤.检查点,然后执行自动化工程,即可执行功能自动化测试用例 ...
- 【自动化测试&爬虫系列】Selenium Webdriver
文章来源:公众号-智能化IT系统. 一. Selenium Webdriver技术介绍 1. 简介 selenium Webdriver是一套针对不同浏览器而开发的web应用自动化测试代码库.使用这套 ...
- selenium webdriver testng自动化测试数据驱动
selenium webdriver testng自动化测试数据驱动 selenium webdriver testng自动化测试数据驱动 一.数据驱动测试概念 数据驱动测试是相同的测试脚本使用不同的 ...
- Selenium之Canvas画布操作
现在有一个场景是需要进入到 Canvas画布中 进行单击操作,现在使用过如下方法 canvas = driver.find_element_by_xpath("//canvas[@id='# ...
- jmeter联合selenium webdriver进行自动化测试-简单1
jmeter进行webdriver测试 背景:jmeter可以联合selenium进行基本的UI自动化进行测试,解放了手工测试的压力.那么selenium webdriver完成GUI的流程初步如下 ...
- Selenium Webdriver 自动化测试开发常见问题(C#版)
转一篇文章,有修改,出处http://www.7dtest.com/site/blog-2880-203.html 1:Selenium中对浏览器的操作 首先生成一个Web对象 IWebDriver ...
- 使用httpclient 调用selenium webdriver
结合上次研究的selenium webdriver potocol ,自己写http request调用remote driver代替selenium API selenium web driver ...
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...
随机推荐
- IOP知识点(3)-Modal.show
1.position 模态框初始位置.可设为字符串 "左位置 上位置" 或数组 [左位置, 上位置],规则如下: 左位置 可设为 left|center|right 三者之一,上位 ...
- Java通过sftp上传文件
Linux操作系统我们经常使用ssh中的ftp,sftp连接服务器,做相应操作. 如何通过java代码的形式采用sftp连接到服务器,进行文件上传下载等操作呢? 第一步,引入依赖包 <!-- s ...
- python 调用阿里云云解析api添加记录
首先安装阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-alidns 可以配合jenkins传递参数 # ...
- jenkins openshift 持续集成
参数部分没有 不要照抄,只供参考 需求: CI利用confd+etcd生成配置文件 CI把git的COMMIT 传到openshift的buildconfigs #!/bin/bash echo ec ...
- js图的数据结构处理----邻链表,广度优先搜索,最小路径,深度优先搜索,探索时间拓扑
//邻居连表 //先加入各顶点,然后加入边 //队列 var Queue = (function(){ var item = new WeakMap(); class Queue{ construct ...
- vue中使用hotcss--stylus
页面中一直闪动这个. 后面改成scss后还是这样.还不知道原因
- iOS UI调试神器,插件injection for Xcode使用方法
项目越来越大,代码编译时间越来越长,你是不是早已经厌倦了改一点点UI布局就要重新编译一次项目的过程,我们一分钟几百万上下的,怎能被编译浪费掉珍贵的时间.使用injectionforxcode这款插件, ...
- .NET Core使用Quartz执行调度任务进阶(转)
一.前言运用场景 Quartz.Net是一个强大.开源.轻量的作业调度框架,在平时的项目开发当中也会时不时的需要运用到定时调度方面的功能,例如每日凌晨需要统计前一天的数据,又或者每月初需要统计上月的数 ...
- PHP json_encode/json_decode与serialize/unserializ性能测
PHP里面,有时候出于实际需求考虑,需要将某些信息以数组的方式进行存储,甚至有时候介于数组.字符串两者之间,很难确定是数组还是字符串,如果最终还需要将这些信息存储到文件系统中,而且要保证正确无误的存储 ...
- sqli-labs(三)
第五关:这关的重点是有联合查询的注入漏洞,但是页面不会显示查询信息,但是会有报错信息显示在页面上 这关是双查询注入,其实用报错注入和盲注都是可以注入的,但是我觉得这个双查询注入还是很有意思的,所以这关 ...