1. 程式人生 > >Sikuli 整合Selenium Webdriver 上傳檔案-- Java

Sikuli 整合Selenium Webdriver 上傳檔案-- Java

Sikuli 整合Selenium Webdriver -- Java

目錄

Sikuli簡介

Sikuli是由MIT(麻省理工學院) 研究團隊釋出的一種圖形化程式設計技術(程式設計小白的福音),使用Sikuli你只需要會寫HelloWorld這種最基本的程式設計技能即可,用Sikuli不需要去寫出一行行復雜的程式碼,而是用螢幕截圖的方式,用截出來的圖形元素組合出神奇的程式。

  1. Sikuli官網:http://slides.sikuli.org/
  2. API doc :http://nightly.sikuli.de/docs/index.html
  3. Sikuli是開源的,原始碼可在Github檢視:https://github.com/sikuli/sikuli

主要目的

在自動化的過程中,不管是web端還是APP端,你可能會遇到一些元素無法定位(就是完全沒有任何屬性,反正我是遇到過。。),導致一些操作無法實施,你可能借助一些第三方的工具來實施,比如說處理檔案的上傳(這個在之前的部落格中有寫過兩種方法檢視),今天主要用上傳檔案演示Sikuli的呼叫方法。

環境設定

這邊介紹兩種呼叫Sikuli的方法(必須已經配置過Java環境,Java環境配置:檢視):

第一種

首先下載sikuli的jar包,地址:https://raiman.github.io/SikuliX1/downloads.html,
開啟連結,點選下載:在這裡插入圖片描述
將下載的jar包加入到引用庫中,我這裡用的是IDEA的編譯器(強烈推薦,不過還是選擇自己喜歡的),方法:

  1. 首先開啟Idea編譯器點選File->Project Structure
    在這裡插入圖片描述
  2. 依次點選Modules->Dependencies-> +
    在這裡插入圖片描述
  3. 選擇下載好的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來實現

  1. 首先本地要有maven的環境(沒有配置的需要自行配置,自行度娘去)
  2. 建立一個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();
    }
}

程式碼解釋

  1. 設定driver的可執行路徑
	System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
  1. 定義圖片儲存路徑和上傳檔案的路徑(需要手動將要用到的圖片截圖儲存到相應的資料夾中)
    在這裡插入圖片描述
  2. 接下來就是建立Screen和Pattern類的物件了具體用法參考:檢視
 		Screen s = new Screen();
        Pattern fileInputTextBox = new Pattern(imgPath + "fileTextBox.PNG");
        Pattern openButton = new Pattern(imgPath + "openButton.PNG");
  1. 啟動瀏覽器並開啟連結,點選上傳按鈕
        driver = new ChromeDriver();
        driver.get("http://demo.guru99.com/test/image_upload/index.php");
        driver.findElement(By.xpath(".//*[@id='photoimg']")).click();
  1. 等到Windows彈窗出現,sikuli開始操作,首先等待輸入框出現,然後輸入上傳檔案的路徑,點選開啟
       s.wait(fileInputTextBox, 20);
        //輸入上傳檔案的路徑
        s.type(fileInputTextBox, inputFilePath + "test.txt");
        //點選開啟按鈕
        s.click(openButton);

在這裡插入圖片描述

  1. 最終上傳上傳成功,關掉瀏覽器
    在這裡插入圖片描述

結論

Sikuli用於處理web頁面上的一些無法定位的物件和windows彈出視窗。當用戶介面上的元素不經常更改時,可以使用Sikuli實現。不過這個軟體程式碼的可移植性比較差,有的平臺圖片識別度不高。總的來說,與Robot和AutoIT等其他框架相比,Sikuli受到的青睞較少,不過還是可以用來輔助識別一些元素的。