Sikuli 整合Selenium Webdriver 上傳檔案-- Java
阿新 • • 發佈:2018-11-11
Sikuli 整合Selenium Webdriver -- Java
目錄
Sikuli簡介
Sikuli是由MIT(麻省理工學院) 研究團隊釋出的一種圖形化程式設計技術(程式設計小白的福音),使用Sikuli你只需要會寫HelloWorld這種最基本的程式設計技能即可,用Sikuli不需要去寫出一行行復雜的程式碼,而是用螢幕截圖的方式,用截出來的圖形元素組合出神奇的程式。
- Sikuli官網:http://slides.sikuli.org/
- API doc :http://nightly.sikuli.de/docs/index.html
- Sikuli是開源的,原始碼可在Github檢視:https://github.com/sikuli/sikuli
主要目的
在自動化的過程中,不管是web端還是APP端,你可能會遇到一些元素無法定位(就是完全沒有任何屬性,反正我是遇到過。。),導致一些操作無法實施,你可能借助一些第三方的工具來實施,比如說處理檔案的上傳(這個在之前的部落格中有寫過兩種方法檢視),今天主要用上傳檔案演示Sikuli的呼叫方法。
環境設定
這邊介紹兩種呼叫Sikuli的方法(必須已經配置過Java環境,Java環境配置:檢視):
第一種
首先下載sikuli的jar包,地址:https://raiman.github.io/SikuliX1/downloads.html,
開啟連結,點選下載:
將下載的jar包加入到引用庫中,我這裡用的是IDEA的編譯器(強烈推薦,不過還是選擇自己喜歡的),方法:
- 首先開啟Idea編譯器點選File->Project Structure
- 依次點選Modules->Dependencies-> +
- 選擇下載好的sikulixapi.jar包點選OK,你將會看到:
第一種的環境已經可以了,你可以嘗試以一下,啟動桌面上的Chrome(執行程式碼時確保桌面上Chrome的圖示沒有被其他視窗遮擋,要不然會報錯的)。
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;
public class sikuliTest {
public static void main(String[] args) throws FindFailed {
Screen s = new Screen();
// 定義圖片路徑
String imgPath = "H:\\code\\sikuliTest\\src\\test\\java\\imgs\\Chrome.png";
// 點選應用
s.doubleClick(imgPath);
}
}
第二種
第二種相對簡單,直接用構建工具maven來實現
- 首先本地要有maven的環境(沒有配置的需要自行配置,自行度娘去)
- 建立一個maven專案在pom.xml中引入外掛,根據不同的系統選擇不同的依賴外掛,這裡是Windows的,外掛選擇地址:檢視
<!-- https://mvnrepository.com/artifact/com.sikulix/sikulixapi -->
<dependency>
<groupId>com.sikulix</groupId>
<artifactId>sikulixapi</artifactId>
<version>1.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sikulix/sikulixlibswin -->
<dependency>
<groupId>com.sikulix</groupId>
<artifactId>sikulixlibswin</artifactId>
<version>1.1.1</version>
</dependency>
加入到pom中之後,執行下載依賴包
至此,第二種方法也已經介紹完畢,可以用上邊的程式碼驗證。
用Sikuli上傳檔案
import org.sikuli.script.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;
public class fileUploadBySikuli {
public static void main(String[] args) throws FindFailed {
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
String imgPath = "H:\\study\\code\\sikuliTest\\src\\test\\java\\imgs\\";
String inputFilePath = "H:\\study\\code\\sikuliTest\\src\\test\\java\\tempTest\\";
Screen s = new Screen();
Pattern fileInputTextBox = new Pattern(imgPath + "fileTextBox.PNG");
Pattern openButton = new Pattern(imgPath + "openButton.PNG");
WebDriver driver;
driver = new ChromeDriver();
// 兩個個上傳檔案的demo,任選其一就好
driver.get("http://demo.guru99.com/test/image_upload/index.php");
driver.findElement(By.xpath(".//*[@id='photoimg']")).click();
// 第二個
// driver.get("http://www.sahitest.com/demo/php/fileUpload.htm");
// driver.findElement(By.xpath("//*[@id=\"file5\"]")).click();
// 等待輸入框出現
s.wait(fileInputTextBox, 20);
//輸入上傳檔案的路徑
s.type(fileInputTextBox, inputFilePath + "test.txt");
//點選開啟按鈕
s.click(openButton);
driver.close();
}
}
程式碼解釋
- 設定driver的可執行路徑
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
- 定義圖片儲存路徑和上傳檔案的路徑(需要手動將要用到的圖片截圖儲存到相應的資料夾中)
- 接下來就是建立Screen和Pattern類的物件了具體用法參考:檢視
Screen s = new Screen();
Pattern fileInputTextBox = new Pattern(imgPath + "fileTextBox.PNG");
Pattern openButton = new Pattern(imgPath + "openButton.PNG");
- 啟動瀏覽器並開啟連結,點選上傳按鈕
driver = new ChromeDriver();
driver.get("http://demo.guru99.com/test/image_upload/index.php");
driver.findElement(By.xpath(".//*[@id='photoimg']")).click();
- 等到Windows彈窗出現,sikuli開始操作,首先等待輸入框出現,然後輸入上傳檔案的路徑,點選開啟
s.wait(fileInputTextBox, 20);
//輸入上傳檔案的路徑
s.type(fileInputTextBox, inputFilePath + "test.txt");
//點選開啟按鈕
s.click(openButton);
- 最終上傳上傳成功,關掉瀏覽器
結論
Sikuli用於處理web頁面上的一些無法定位的物件和windows彈出視窗。當用戶介面上的元素不經常更改時,可以使用Sikuli實現。不過這個軟體程式碼的可移植性比較差,有的平臺圖片識別度不高。總的來說,與Robot和AutoIT等其他框架相比,Sikuli受到的青睞較少,不過還是可以用來輔助識別一些元素的。