selenium 配合sikuli script操作高德地图
会不会使用工具,是一般QA和高级QA的区别 ---To be crazy
Java就是好,开源框架遍地都是,各种niubility的jar包,各种神器,真是不亦乐乎.
今天研究一下基于图片识别作为对象的niubility的sikuli框架。
MIT的研究人员设计了一种新颖的图形脚本语言Sikuli,计算机用户只须有最基本的编程技能(比如会写print"hello world"),
他不需要去写出一行行代码,而是用屏幕截图的方式,用截出来的图形元素组合出神奇的程序。
简单了解一下:
- 官网http://slides.sikuli.org/
- API doc :http://nightly.sikuli.de/docs/index.html
- sikuli可以用来测试Flash ,Android和IOS
- 优缺点参考百度百科
优点:
1.可以测试不易识别的对象,比如map 和Flash
2.可以验证图片
3.通俗易懂,容易维护
缺点:
待续
- 注意事项:
1. 只能识别当前屏幕的内容,如果操作对象被最小化,是无法识别的
2. 第一次运行需要重启系统 ,虽然不make sense
下载:http://pan.baidu.com/s/1hq2CaHm
实例1.
打开chrome,输入http://www.cnblogs.com/tobecrazy/ 并转到
首先你得分别准备截图

创建工程,把sikuli-script.jar添加进去

代码如下:
import org.openqa.selenium.Keys;
import org.sikuli.basics.Debug;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Key;
import org.sikuli.script.Pattern;
import org.sikuli.script.Screen; public class NavigateToMyBlog { private static String URL="http://www.cnblogs.com/tobecrazy/";
public static void main(String[] args) throws FindFailed, Exception {
Debug.setDebugLevel(3);
Screen screen=new Screen();
Pattern chromeLogo=new Pattern("D:\\MyBlog\\chromeICO.png");
screen.doubleClick(chromeLogo);
Pattern maxButton=new Pattern("D:\\MyBlog\\maxButton.png");
screen.click(maxButton);
Pattern addressBar=new Pattern("D:\\MyBlog\\adressBar.png");
screen.type(addressBar, URL);
String keys=Keys.ENTER.toString();
screen.keyDown(Key.ENTER);; } }
实例二, 配合selenium webdriver 测试高德地图
1.打开地图
2.选择北京
3.打开地图的工具,选择测距
3.选择天安门
4.选择到这里去
5.选择输入并搜索,火车站
precondition:
截图呀:

Debug.setDebugLevel(3);
Screen s = new Screen();
String URL = "http://www.amap.com/";
WebDriver driver = DriverFactory.getFirefoxDriver();
Actions actions = new Actions(driver);
driver.get(URL);
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
WebElement chooseCityElement = driver.findElement(By
.xpath("//div/span[@class='icon_expand cursor ml5']"));
chooseCityElement.click();
WebElement city_iframe = driver.findElement(By
.xpath("//iframe[@id='city_iframe']"));
driver.switchTo().frame(city_iframe); //选择北京
WebElement BJ = driver.findElement(By.xpath("//div/a[text()='北京']"));
BJ.click(); //等待页面加载
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.switchTo().defaultContent();
//打开工具 选择测距
WebElement tools=driver.findElement(By.xpath("//div/span[text()='工具']"));
actions.moveToElement(tools).click().perform();
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
Pattern cj=new Pattern("D:\\MyBlog\\CJ.png");
if(s.find(cj) != null)
{
s.click(cj);
}
Pattern bjbz=new Pattern("D:\\MyBlog\\BJBZ.png");
s.click(bjbz); Pattern bjnz=new Pattern("D:\\MyBlog\\BJNZ.png");
s.click(bjnz); s.rightClick(); WebElement inputBoxElement = driver.findElement(By
.xpath("//input[@id='keywordTxt']"));
WebElement searchButton = driver.findElement(By
.xpath("//input[starts-with(@class,'magnifier_button')]"));
inputBoxElement.clear();
inputBoxElement.sendKeys("天安门");
searchButton.submit();
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
WebElement tiAnMenElement = driver.findElement(By
.xpath("//div[@title='天安门']"));
tiAnMenElement.click();
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); WebElement comeToHereElement = driver.findElement(By
.xpath("//div[@class='route']//li[text()='到这里去']"));
comeToHereElement.click(); WebElement setStartLocationElement = driver.findElement(By
.xpath("//div/input[@class='route-input srh-ipt']"));
setStartLocationElement.sendKeys("火车站");
WebElement routeByBus = driver.findElement(By
.xpath("//div[@id='rout-by-bus']"));
routeByBus.click();
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
WebElement startFrom = driver
.findElement(By
.xpath("//div[@class='start_end_item_title' and contains(text(),'北京站')]")); actions.moveToElement(startFrom)
.click(driver.findElement(By
.xpath("//a[contains(text(),'设为起点') and @data-name='北京站']")))
.perform();
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); driver.findElement(By.xpath("//div[@class='amap-zoom-plus']")).click();
到此为止,selenium配合sikuli的探索结束了,更多更好玩的玩法,会进一步更新
selenium 配合sikuli script操作高德地图的更多相关文章
- selenium WebDriver 操作高德地图
String URL="http://www.amap.com/"; WebDriver driver = new FirefoxDriver(profile); driver.g ...
- Windows Store Javascript项目使用高德地图、谷歌地图、百度地图API
原文 Windows Store Javascript项目使用高德地图.谷歌地图.百度地图API 在Win8 Store 项目中可以使用的地图主要有微软的Bing Map,目前高德地图sdk也支持Wi ...
- [WEB地图] 2017高德地图API WEB开发(key申请,地图搭建)简约教程
前端时间因为公司需要研究 了一下百度的教程 然后写个简约的笔记记录一下自己学习的收获,只为了满足自己暂时的写作热情 高德地图WEB开发(key申请.api)简约教程 1.首先我们需要去“高德地 ...
- web开发如何使用高德地图API(四)通过AMap.Marker自定义标点
说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...
- web开发如何使用高德地图API(三)点击热点打开信息窗体
说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...
- web开发如何使用高德地图API(二)结合输入提示和POI搜索插件
说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...
- web开发如何使用高德地图API(一)浏览器定位
说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...
- Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作
刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息 使用的Unity ...
- 基于高德地图的描点操作,监听地图缩放,展示合理数量的marker
原文:基于高德地图的描点操作,监听地图缩放,展示合理数量的marker 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lx583274568/art ...
随机推荐
- 解决子元素margin让父辈元素位置一起改变的问题
1.在父元素内添加内容,并且要在子元素块前面添加,后面添加内容无效. 内容可以是文字.图片甚至是空格,源代码里直接按空格无效,可以用占位符 2.让子元素或父元素浮动float:left. 缺点:在元 ...
- @SuppressWarnings的使用、作用、用法
在java编译过程中会出现很多警告,有很多是安全的,但是每次编译有很多警告影响我们对error的过滤和修改,我们可以在代码中加上 @SuppressWarnings(“XXXX”) 来解决 例如:@S ...
- Java中为什么有abstract interface 修饰类?
如果有人问你为什么有abstract interface 修饰类,答案一定是他看到的这种方式一定是反编译出来的结果.实际中abstract interface和interface修饰的类没有区别. 下 ...
- Node.SelectNodes
http://www.crifan.com/csharp_under_some_node_search_specific_child_node/ https://msdn.microsoft.com/ ...
- 有关Highchart的那些事。。。备份一段(稍后修改)
$(function () { $('#CurrentFinanceChart').highcharts({ title: { text: '' }, xAxis: { type: 'datetime ...
- 谈谈我眼中的CSDN吧
昨天逛博客园看到了这篇曝光率很高的文章:博客搬家——从CSDN到博客园,一篇短短的文章竟然招致这么多人的讨论,可能程序员就喜欢“Java好还是PHP好”这类型的问题吧,好无聊.由于我一直在使用CSDN ...
- AngularJS API之bootstrap启动
对于一般的使用者来说,AngularJS的ng-app都是手动绑定到某个dom元素.但是在一些应用中,这样就显得很不方便了. 绑定初始化 通过绑定来进行angular的初始化,会把js代码侵入到htm ...
- linux下安装python环境
1.linux下安装python3 a. 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum groupinstall 'Development To ...
- spring配置文件详解--真的蛮详细
spring配置文件详解--真的蛮详细 转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常 ...
- 必须知道的.net(继承)
1.继承定义:就是面向对象中类与类之间的一种关系.通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或者修改父类的属性和方法建立新的类层次. 2.CLR支持实现单继承和接口多 ...