您的位置:首页 > 其它

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

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

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

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

如:

[html] view
plain copy







<input id='uploadfile' type='file'>上传文件</input>

可使用selenium webDriver:

[java] view
plain copy







driver.findElement(By.id("uploadfile")).sendKeys("C:\\testfile.zip");

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

如:swf插件

[html] view
plain copy







<object id="SWFUpload_0" type="application/x-shockwave-flash" data="/xxx/xxx/xxx.swf?xxx"

width="120" height="30" class="swfupload" style="position: absolute; z-index: 1;">

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

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

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

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

[plain] view
plain copy







ControlFocus ("文件上传","","Edit1");

WinWait("CLSAA[#32770]","",5);

ControlSetText('文件上传','','Edit1','E:\selenium\FILE\uploadfile.zip');

ControlClick ('文件上传','','Button1');

保存后编译成EXE文件:uploadfile.exe

然后在selenium webDriver中使用代码:

[java] view
plain copy







Runtime.getRuntime().exec("E:\\selenium\\FILE\\uploadfile.exe");

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

Junit执行报错:

[java] view
plain copy







org.openqa.selenium.WebDriverException: Returned value cannot be converted to WebElement: {}

Build info: version: '2.43.0', revision: '597b76b', time: '2016-07-28 20:52:14'

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'

Driver info: driver.version: RemoteWebDriver

at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:359)

at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:393)

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







[error] RunTimeINIT: *** terminating: libs to export not found on above classpath: /sikulixlibs/windows/libs64

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

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

[plain] view
plain copy







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







Screen s=new Screen();

s.click("E:\\selenium\\FILE\\choosefile.png");

s.type("E:\\selenium\\FILE\\inputfilename.png","E:\\selenium\\FILE\\uploadfile.zip");

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  selenium
相关文章推荐