selenium部分功能(上传文件、swf插件)无法自动化时可使用的方法

selenium是一个相当方便的东西,但是有些功能它也并不能完成,比如上传文件,swf插件的点击操作,和各种不在web中需要在Windows进行相关的操作。

我再录制selenium脚本的时候碰到的第一个问题就是上传文件。

1、一般来说,上传文件的HTML代码都是使用<input type='file'>标签完成的,而这种的上传文件比较好操作,可使用sendKeys方法完成。

如:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <input id='uploadfile' type='file'>上传文件</input>  
可使用selenium webDriver:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. driver.findElement(By.id("uploadfile")).sendKeys("C:\\testfile.zip");  

2、但是如果上传文件不是使用<input>标签完成的,就不能使用以上的方法了,baidu了很久也没有其他类似sendkeys的方法可以实现。

如:swf插件

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <object id="SWFUpload_0" type="application/x-shockwave-flash" data="/xxx/xxx/xxx.swf?xxx"  
  2. width="120" height="30" class="swfupload" style="position: absolute; z-index: 1;">  

以上这种代码就无法使用sendkeys的方法实现上传文件

我第二次采用的方法就是使用autoIT工具。

autoIT是一个可以用来捕捉Windows操作然后编写代码生成一个EXE文件的工具,只不过这个工具需要在打开上传文件窗口后才能使用,而我的上传文件代码无法使用click等其他方式打开上传文件窗口,所以后来也废弃不用了。

以下是autoIT的代码,具体使用方法网上可baidu:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ControlFocus ("文件上传","","Edit1");  
  2. WinWait("CLSAA[#32770]","",5);  
  3. ControlSetText('文件上传','','Edit1','E:\selenium\FILE\uploadfile.zip');  
  4. ControlClick ('文件上传','','Button1');  
保存后编译成EXE文件:uploadfile.exe
然后在selenium webDriver中使用代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Runtime.getRuntime().exec("E:\\selenium\\FILE\\uploadfile.exe");  

3、而使用click方法点击这个对象也会在Junit报错且前台无任何反应,这个时候就可以使用第三个我一不小心找到的工具——sikuli!!!

Junit执行报错:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. org.openqa.selenium.WebDriverException: Returned value cannot be converted to WebElement: {}  
  2. Build info: version: '2.43.0', revision: '597b76b', time: '2016-07-28 20:52:14'  
  3. System info: host: 'XXX', ip: 'XX.XX.XX.XX', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_21'  
  4. Driver info: driver.version: RemoteWebDriver  
  5.  at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:359)  
  6.  at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:393)  
  7.  at org.openqa.selenium.By$ById.findElement(By.java:214)...  

注:据说会报错是因为chrome版本问题,但是没有研究过

在网上各种找的时候,在以下这位好心人的评论里看到了这个名字,sikuli,抱着试一试的心情我baidu了一下,真的可以用,虽然不知道你是谁,但是我感谢你呀~
http://www.oschina.net/question/1992633_2144550

sikuli是一种靠对比图片来定位的工具,无论是web页面、Windows窗口,只要是显示在屏幕上的东西它都能靠图片来定位,但是如果在屏幕上有差不多的地方,可能就会定位失败啦,但是我需要定位的地方都很有特点,所以没有失败过。

首先,下载sikuli:https://launchpad.net/sikuli/+download

进入网页后找到最新的setup.jar就可以,我是sikulixsetup-1.1.0.jar

也可以下载source包,在eclipse中使用查看class方法:https://github.com/sikuli/sikuli/releases

得到sikulixsetup-1.1.0.jar后可导入eclipse build path中使用,但是其实并没有可以使用,这种时候执行Junit会报错:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. [error] RunTimeINIT:  *** terminating: libs to export not found on above classpath: /sikulixlibs/windows/libs64  

之前一直不明白为什么会报错,后来才知道需要执行jar包

打开cmd,cd到jar包的目录文件中,然后执行

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. java -jar sikulixsetup-1.1.0.jar  

之后会打开让你选择的窗口,直接选择第二种,java方式(eclipse),然后点击setup now,之后会弹出一个窗口,具体是神马我忘记了,但是我选择了YES也没有错。

执行完成后会有一个say hi的窗口,然后在同目录下会出现一个jar包:sikulixapi.jar,就此安装完成,就可以正常使用了。

首先截取需要的图片:

choosefile.png:选择文件的按钮图片


inputfilename.png:上传文件窗口的输入框图片


openfile.png:上传文件窗口的open按钮图片


保存到你期望的位置

在selenium webDriver中写代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Screen s=new Screen();  
  2.     s.click("E:\\selenium\\FILE\\choosefile.png");  
  3.     s.type("E:\\selenium\\FILE\\inputfilename.png","E:\\selenium\\FILE\\uploadfile.zip");  
  4.     s.click("E:\\selenium\\FILE\\openfile.png");  

记得导入包:import org.sikuli.script.Screen;

就可以执行啦

更多sikuli的命令:

http://www.testwo.com/article/299

http://doc.sikuli.org/tutorials/helloworld/helloworld-mac.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值