开始
还是继续上次的文章 解决 Selenium文件上传框无法识别的问题 在这篇文章里面介绍了如何解决windows文件上传框的问题。但是其实当时却避开了一个比较严重的问题,如何点击flash按钮。因为基本上纵观大多数的网页,对于要进行文件上传的按钮,都是采用的是flash的按钮来实现的。但是问题就来了。selenium是不识别flash的。那到底要如何才能解决这个问题呢。还是要靠我们的度娘啊。找到答案了—-sikuli
介绍、安装
MIT的研究人员设计了一种新颖的图形脚本语言Sikuli,计算机用户只须有最基本的编程技能(比如会写print”hello world”),他不需要去写出一行行代码,而是用屏幕截图的方式,用截出来的图形元素组合出神奇的程序。
感觉确实是有点神奇。简单的说就是通过图像识别,比对的方式,找到对应的按钮进行点击之类的操作了。
首先我们还是一步步来介绍下吧。进入sikulix的链接,或者直接点这里下载,下载下来以后运行jar,
选择使用的脚本语言以及你是否要使用其他编译器去使用它,也就是说是否要下载它的API。这边我默认选择的是1,2。按照流程一步步的下载吧。如果失败的话多安装几次吧。
使用
下载完,在你运行sikulixsetup的路径就会有SikulixIDE了。我们运行它。界面就如下图所示了。
我们来简单的写一段代码吧:
代码都是如此的有趣。步骤很简单,我们做的就是清空回收站的内容。我们看看运行的情况。
实际应用
下来我们看看sikuli与java selenium的结合使用吧。
我这里就贴下代码吧
//我们这里导入了sikuli api的包 这个jar也是在与IDE同路径下的
import org.sikuli.script.Screen;
private WebDriver driver;
private String baseUrl;
private Screen s;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
private String filePath ;
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "http://172.18.44.106:8888/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.manage().window().maximize();
//new一个Screen的对象
s = new Screen();
filePath = FileUtils.getCurrentPath();
}
@Test
public void test1() throws Exception {
driver.get(baseUrl + "/iclass/edu/login.html");
driver.findElement(By.id("username")).clear();
driver.findElement(By.id("username")).sendKeys("wangyan");
driver.findElement(By.id("password")).clear();
driver.findElement(By.id("password")).sendKeys("123456");
driver.findElement(By.cssSelector("button.btn.login-btn")).click();
Thread.sleep(2000);
driver.findElement(By.linkText("素材")).click();
driver.findElement(By.linkText("个人素材")).click();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filePath+"\\res\\file.txt"))));
String line ;
while ((line = (bufferedReader.readLine()))!=null) {
driver.findElement(By.linkText("上传素材")).click();
//关键就这里了。调用Screen对象的click方法,参数为图片的路径以及点击的次数
s.click(filePath + "\\pic\\1.png", 0);
//由于java是操作不了windows的窗口界面的。所以我们这里直接是调用autoit来进行窗口操作。当然还有一些方法类似于使用Jnative来调用windows的api。可以尝试后发现。窗口关闭不能够支持中文,可能这里面是我个人的原理。所以我还是放弃了这个方法了。
String command = "C:\\Users\\cvtpc\\Desktop\\1.exe "+filePath+"\\res\\"+line;
Runtime.getRuntime().exec(command);
Thread.sleep(3000);
driver.findElement(By.name("resourceIntro")).clear();
driver.findElement(By.name("resourceIntro")).sendKeys("123123");
driver.findElement(By.id("save-upload")).click();
}
}
结束
花了半天多的时间来研究这个,感觉至少简单的了解了sikuli,以及解决了flash按钮的点击了。