Sikuli กวดวิชาสำหรับ Selenium อัตโนมัติ

⚡ สรุปอย่างชาญฉลาด

Sikuli ทำให้ส่วนติดต่อผู้ใช้แบบกราฟิกเป็นแบบอัตโนมัติโดยการจดจำภาพหน้าจอที่บันทึกไว้แทนที่จะใช้ตัวระบุตำแหน่ง ซึ่งช่วยให้ Selenium ทดลองขับ Windows หน้าต่างป๊อปอัพ, กล่องโต้ตอบไฟล์แบบเนทีฟ และวัตถุ Flash ที่ WebDriver เพียงอย่างเดียวไม่สามารถเข้าถึงได้

  • 🔘 แนวคิดหลัก: องค์ประกอบทุกชิ้นจะถูกจัดเก็บในรูปแบบไฟล์ PNG และ Sikuli จะค้นหาโดยการจับคู่พิกเซลบนหน้าจอ
  • ☑️ การติดตั้ง: เพิ่ม SikuliX ไฟล์ JAR ของ API สำหรับ Java เส้นทางการสร้างที่อยู่ข้างๆ Selenium โหลแก้ว
  • คลาสหน้าจอ: มีฟังก์ชันคลิก ดับเบิ้ลคลิก พิมพ์ วางเมาส์เหนือภาพ และค้นหา โดยแต่ละฟังก์ชันจะรับชื่อภาพเป็นพารามิเตอร์
  • 🧪 คลาสแพทเทิร์น: ห่อหุ้มเส้นทางของรูปภาพและปรับแต่งการจับคู่ผ่าน similar() และ exact()
  • 🛠️ ตัวอย่างการทำงาน: ในการทดสอบ Chrome ให้คลิก "เลือกไฟล์" จากนั้น Sikuli จะพิมพ์เส้นทางและคลิก "เปิด"
  • ⚙️ ข้อ จำกัด : การเปลี่ยนแปลงความละเอียดหรือขนาดพิกเซลจะทำให้การจับคู่ล้มเหลวและแสดงข้อความ FindFailed

Sikuli กวดวิชาสำหรับ Selenium อัตโนมัติ

ซิคูลีอยู่ในอะไร Selenium?

ซิคูลี เป็นเครื่องมือทดสอบอัตโนมัติแบบโอเพ่นซอร์สที่ใช้ GUI เป็นหลัก โดยส่วนใหญ่ใช้สำหรับการโต้ตอบกับองค์ประกอบของหน้าเว็บและการจัดการหน้าต่างป๊อปอัป Sikuli ใช้เทคนิค "การจดจำภาพ" และ "การควบคุม GUI" เพื่อโต้ตอบกับองค์ประกอบของหน้าเว็บและหน้าต่างป๊อปอัป ใน Sikuli องค์ประกอบเว็บทั้งหมดจะถูกถ่ายเป็นรูปภาพและจัดเก็บไว้ภายในโครงการ

⚠️ หมายเหตุการตั้งชื่อ: โครงการนี้ยังคงได้รับการดูแลรักษามาจนถึงปัจจุบัน SikuliXเผยแพร่บน Maven Central ในชื่อ com.sikulix:sikulixapiชื่อคลาสที่ระบุไว้ด้านล่างยังคงไม่เปลี่ยนแปลง

วิธีใช้ Sikuli ร่วมกับ Selenium ไดรเวอร์เว็บ

Sikuli สามารถผสานรวมเข้ากับ... Selenium การใช้งาน WebDriver โดยใช้ไฟล์ JAR ของ Sikuli ตามสองขั้นตอนด้านล่าง

ขั้นตอนที่ 1) ดาวน์โหลด ไฟล์ JAR ของ Sikuli จากด้านล่าง URLและเช่นtracคัดลอกเนื้อหาจากไฟล์ ZIP ไปยังโฟลเดอร์

https://mvnrepository.com/artifact/com.sikulix/sikulixapi/2.0.5

ขั้นตอน 2) สร้างโปรเจ็กต์ JAVA ใหม่ใน Eclipse และเพิ่มไฟล์ JAR ลงใน Build Path พร้อมกับไฟล์ JAR ของ Selenium โดยคลิกขวาที่โปรเจ็กต์ -> Build Path -> Configure Build Path ดังแสดงในภาพด้านล่าง

เพิ่มไฟล์ JAR ของ Sikuli แล้ว Java สร้างเส้นทางใน Eclipse กำหนดค่าเส้นทางการสร้าง

เมื่อคุณเพิ่มไฟล์ JAR ลงใน build path ของโปรเจ็กต์แล้ว คุณสามารถใช้คลาสที่ Sikuli จัดเตรียมไว้ได้ หรืออีกทางเลือกหนึ่ง โปรเจ็กต์ Maven สามารถประกาศ artifact เดียวกันนี้เป็น dependency แทนได้

คลาสสกรีนใน Sikuli

คลาส Screen เป็นคลาสพื้นฐานสำหรับเมธอดทั้งหมดที่ Sikuli มีให้ คลาส Screen ประกอบด้วยเมธอดที่กำหนดไว้ล่วงหน้าสำหรับการดำเนินการทั่วไปทั้งหมดบนองค์ประกอบบนหน้าจอ เช่น การคลิก การดับเบิ้ลคลิก การป้อนข้อมูลลงในกล่องข้อความ การวางเมาส์เหนือองค์ประกอบ เป็นต้น ด้านล่างนี้คือรายการเมธอดที่ใช้กันทั่วไปซึ่งมีอยู่ในคลาส Screen

วิธี Descriptไอออน วากยสัมพันธ์
คลิก วิธีการนี้ใช้ในการคลิกที่องค์ประกอบบนหน้าจอโดยใช้ชื่อรูปภาพเป็นพารามิเตอร์

หน้าจอ s = หน้าจอใหม่ ();

s.click(“QA.png”);

ดับเบิลคลิก วิธีนี้ใช้เพื่อดับเบิลคลิกบนองค์ประกอบ โดยยอมรับชื่อภาพเป็นพารามิเตอร์

หน้าจอ s = หน้าจอใหม่ ();

s.doubleClick(“QA.png”);

ประเภท วิธีการนี้ใช้ในการจัดเตรียมค่าอินพุตให้กับองค์ประกอบ ยอมรับชื่อรูปภาพและข้อความที่จะส่งเป็นพารามิเตอร์

s.type(“QA.png”,”ข้อความ”);

โฉบ วิธีการนี้จะใช้ในการวางเมาส์เหนือองค์ประกอบ ยอมรับชื่อรูปภาพเป็นพารามิเตอร์

s.hover(“QA.png”);

หา วิธีนี้ใช้เพื่อค้นหาองค์ประกอบเฉพาะบนหน้าจอ ยอมรับชื่อรูปภาพเป็นพารามิเตอร์

s.find(“QA.png”);

ชั้นเรียนรูปแบบใน Sikuli

ในขณะที่คลาส Screen ทำงานกับชื่อไฟล์ภาพธรรมดา คลาส Pattern จะใช้เพื่อเชื่อมโยงไฟล์ภาพกับคุณลักษณะเพิ่มเติมเพื่อระบุองค์ประกอบนั้นได้อย่างเฉพาะเจาะจง โดยรับพาธของไฟล์ภาพเป็นพารามิเตอร์

Pattern p = new Pattern(“Path of image”);

ต่อไปนี้เป็นวิธีการที่ใช้กันทั่วไปที่สุดของคลาส Pattern

วิธี Descriptไอออน วากยสัมพันธ์
getFileName.getFileName ส่งกลับชื่อไฟล์ที่มีอยู่ในวัตถุรูปแบบ

รูปแบบ p = รูปแบบใหม่ (“D:\Demo\QA.png”);

ชื่อไฟล์สตริง = p.getFileName();

คล้ายคลึงกัน วิธีการนี้จะส่งคืนออบเจ็กต์ Pattern ใหม่ที่มีความคล้ายคลึงกันซึ่งตั้งค่าเป็นค่าที่ระบุ ยอมรับค่าความคล้ายคลึงระหว่าง 0 ถึง 1 เป็นพารามิเตอร์ Sikuli ค้นหาองค์ประกอบทั้งหมดที่อยู่ในช่วงความคล้ายคลึงกันที่ระบุ และส่งคืนออบเจ็กต์รูปแบบใหม่

รูปแบบ p1 = p.similar(0.7f);

แน่นอน เมธอดนี้ส่งคืนออบเจ็กต์รูปแบบใหม่โดยตั้งค่าความคล้ายคลึงกันเป็น 1 โดยจะค้นหาเฉพาะการจับคู่ที่ตรงกันทุกประการขององค์ประกอบที่ระบุ

รูปแบบ p1 = p.exact();

Code ตัวอย่างการอัปโหลดไฟล์โดยใช้ Sikuli

โค้ดด้านล่างนี้อธิบายการใช้งาน Sikuli สำหรับการอัปโหลดไฟล์ใน Chrome

package com.sikuli.demo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Pattern;
import org.sikuli.script.Screen;
import org.openqa.selenium.chrome.ChromeDriver;

public class SikuliDemo {

    public static void main(String[] args) throws FindFailed {

        System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
        String filepath = "D:\\Guru99Demo\\Files\\";
        String inputFilePath = "D:\\Guru99Demo\\Files\\";
        Screen s = new Screen();
        Pattern fileInputTextBox = new Pattern(filepath + "FileTextBox.PNG");
        Pattern openButton = new Pattern(filepath + "OpenButton.PNG");
        WebDriver driver;

        // Open Chrome browser    
        driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/test/image_upload/index.php");

        // Click on Browse button and handle windows pop up using Sikuli
        driver.findElement(By.xpath(".//*[@id='photoimg']")).click();
        s.wait(fileInputTextBox, 20);
        s.type(fileInputTextBox, inputFilePath + "Test.docx");
        s.click(openButton);

        // Close the browser
        driver.close();
    }
}

Code คำอธิบาย

ขั้นตอน 1) คำสั่งแรกเกี่ยวข้องกับการตั้งค่าเส้นทางปฏิบัติการของไดรเวอร์สำหรับ Chrome

System.setProperty("webdriver.chrome.driver", "D:\\ chromedriver.exe");

⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: Selenium 4 แก้ไขไบนารีไดรเวอร์ผ่าน Selenium ผู้จัดการครับ บรรทัดนี้เป็นตัวเลือกแล้วครับ คงไว้ตามที่ต้นฉบับเขียนไว้ครับ

ขั้นตอน 2) ใช้เครื่องมือ screengrab เช่น Snipping Tool การจับภาพหน้าจอของหน้าต่างป๊อปอัป 'FileTextBoxและปุ่ม 'เปิด' ดังภาพด้านล่าง

Snipping Tool การคัดเลือกเหนือ Windows ช่องป้อนไฟล์ในหน้าต่างป๊อปอัพการอัปโหลด

ภาพหน้าจอของคุณควรมีลักษณะดังนี้:

ไฟล์ข้อความที่บันทึกไว้Box และภาพอ้างอิง OpenButton ที่ใช้โดยสคริปต์ Sikuli

รูปภาพสำหรับกล่องข้อความอินพุตไฟล์ Windows และปุ่มเปิดจะถูกเก็บไว้ใน 'FileTextBox.PNG' และ 'OpenButton.PNG'

ตัวอย่าง: หากคุณต้องการให้การเปิด Notepad เป็นแบบอัตโนมัติ คุณจะต้องจัดเก็บภาพไอคอนเดสก์ท็อปสำหรับ Notepad ลงในไฟล์ PNG และคลิกที่ไฟล์นั้น

ในกรณีของเรา ระบบจะจดจำช่องป้อนข้อความไฟล์และปุ่มเปิด Windows ป๊อปอัปที่ใช้รูปภาพที่เก็บไว้ หากความละเอียดของหน้าจอเปลี่ยนไปจากการจับภาพเป็นการดำเนินการสคริปต์ทดสอบ พฤติกรรมของ Sikuli จะไม่สอดคล้องกัน ดังนั้นขอแนะนำให้เรียกใช้สคริปต์ทดสอบในความละเอียดเดียวกันกับที่จับภาพ การเปลี่ยนแปลงขนาดพิกเซลของรูปภาพจะส่งผลให้ Sikuli แสดงข้อยกเว้น FindFailed

ขั้นตอน 3) คำสั่งถัดไปรวมถึงการสร้างออบเจ็กต์สำหรับคลาส Screen และ Pattern สร้างวัตถุหน้าจอใหม่ กำหนดเส้นทางของไฟล์ที่คุณต้องการอัปโหลดเป็นพารามิเตอร์ไปยังออบเจ็กต์ Pattern

Screen s = new Screen();
Pattern fileInputTextBox = new Pattern(filepath + "FileTextBox.PNG");
Pattern openButton = new Pattern(filepath + "OpenButton.PNG");

ขั้นตอน 4) ข้อความด้านล่างนี้เกี่ยวข้องกับการเปิดเบราว์เซอร์ Chrome ด้วย URL ตัวอย่างแอปพลิเคชันอัปโหลดไฟล์: https://demo.guru99.com/test/image_upload/index.php

driver = new ChromeDriver();
driver.get("https://demo.guru99.com/test/image_upload/index.php");

ขั้นตอน 5) คลิกปุ่มเลือกไฟล์โดยใช้คำสั่งด้านล่าง

driver.findElement(By.xpath(".//*[@id='photoimg']")).click();

ขั้นตอน 6) รอให้หน้าต่างป๊อปอัปปรากฏขึ้น วิธีการรอใช้เพื่อจัดการกับความล่าช้าที่เกี่ยวข้องกับการเปิดหน้าต่างป๊อปอัปหลังจากคลิกปุ่มเรียกดู

s.wait(fileInputTextBox, 20);

ขั้นตอน 7) พิมพ์เส้นทางไฟล์ลงในกล่องข้อความไฟล์อินพุตและคลิกปุ่มเปิด

s.type(fileInputTextBox, inputFilePath + "Test.docx");
s.click(openButton);

ขั้นตอน 8) ปิดเบราว์เซอร์

driver.close();

เอาท์พุต

เริ่มแรกสคริปต์จะเปิดเบราว์เซอร์ Chrome

เมื่อเริ่มการทำงาน เบราว์เซอร์ Chrome จะเปิดขึ้นที่หน้าอัปโหลดไฟล์สาธิต

คลิกที่ปุ่ม 'เลือกไฟล์' หน้าจอป๊อปอัปไฟล์ของ Windows จะปรากฏขึ้น ป้อนข้อมูลลงในกล่องข้อความอินพุตไฟล์ แล้วคลิกปุ่ม 'เปิด'

Windows หน้าต่างป๊อปอัพไฟล์จะปรากฏขึ้นพร้อมกับเส้นทางไฟล์ที่พิมพ์ลงในช่องข้อความป้อนไฟล์

หน้าจอด้านล่างจะปรากฏขึ้นเมื่อการอัพโหลดไฟล์เสร็จสิ้นและปิดเบราว์เซอร์

หน้าสาธิตแสดงการยืนยันว่าการอัปโหลดเสร็จสมบูรณ์แล้ว ก่อนที่เบราว์เซอร์จะปิดลง

เนื่องจากการจับคู่ขึ้นอยู่กับจำนวนพิกเซล จึงต้องบันทึกภาพอ้างอิงใหม่ทุกครั้งที่มีการปรับเปลี่ยนดีไซน์ของอินเทอร์เฟซ ความเปราะบางนี้เองที่ทำให้ทีมงานเลือกใช้ Sikuli สำหรับป๊อปอัพเท่านั้น การจัดการไฟล์ WebDriver แบบธรรมดา ไม่สามารถเข้าถึงได้

คำถามที่พบบ่อย

ภาพอ้างอิงไม่ตรงกันบนหน้าจอ สาเหตุทั่วไปคือความละเอียดต่างกัน ภาพถูกปรับขนาด ธีมถูกเปลี่ยน หรือองค์ประกอบนั้นยังไม่ปรากฏให้เห็น ถ่ายภาพใหม่ด้วยความละเอียดที่ต้องการหรือค่าความคล้ายคลึงที่ต่ำกว่า

Selenium ใช้ตัวระบุตำแหน่ง (locators) ในการควบคุม DOM ของเบราว์เซอร์ ส่วน Sikuli ใช้การจับภาพหน้าจอ (screenshots) ในการควบคุมหน้าจอ ทำให้สามารถเข้าถึงไดอะล็อกแบบเนทีฟที่ DOM ไม่เคยแสดงออกมาได้ ทั้งสองอย่างจึงถูกใช้งานร่วมกัน

ใช่ ประกาศ com.sikulix:sikulixapi ในฐานะที่เป็นส่วนประกอบที่จำเป็น และ Maven ดึง API เดียวกันมาใช้ keeping เวอร์ชันในไฟล์บิลด์แทนที่จะเป็น Eclipse เส้นทางการสร้าง

ใช่ SikuliX วิ่งบน Windows, Linux และ macOSภาพอ้างอิงไม่สามารถใช้ร่วมกันได้ระหว่างแพลตฟอร์มต่างๆ เนื่องจากรูปแบบการตกแต่งและแบบอักษรแตกต่างกัน ดังนั้นแต่ละแพลตฟอร์มจึงต้องใช้ภาพต้นฉบับของตนเอง

ระบบจับคู่ภาพด้วยการเรียนรู้ของเครื่องสามารถทนต่อการเปลี่ยนแปลงของสี ขนาด และธีม ซึ่งการเปรียบเทียบพิกเซลไม่สามารถทำได้ และสามารถค้นหาภาพควบคุมได้จากป้ายกำกับ ซึ่งช่วยลดงานการจับภาพใหม่ที่จำเป็นหลังจากออกแบบใหม่

นักบิน GitHub ร่างคำสั่ง Screen และ Pattern รวมถึงการตั้งค่า WebDriver ที่เกี่ยวข้อง ไม่สามารถจับภาพไฟล์ PNG ได้ ดังนั้นโปรดตรวจสอบเส้นทางของภาพที่สร้างขึ้นทุกครั้ง

การจับคู่จะเกิดข้อผิดพลาดเมื่อมีการปรับเปลี่ยนรูปแบบอินเทอร์เฟซหรือความละเอียดหน้าจอเปลี่ยนแปลง ทำงานช้ากว่าการทำงานอัตโนมัติของ DOM และรายงานข้อผิดพลาดได้ไม่ชัดเจนเท่า เหมาะสำหรับอินเทอร์เฟซที่เปลี่ยนแปลงไม่บ่อยนัก

โครงการวิจัยซิกูลีเดิมไม่ใช่ แต่โครงการที่สืบทอดต่อมาต่างหากที่ไม่ใช่ SikuliX คือและเผยแพร่อาร์ติแฟกต์ sikulixapi ที่ใช้ในที่นี้ บทความที่อ้างอิงถึง JAR สคริปต์ sikuli ธรรมดาจะอธิบายบรรทัดก่อนหน้านี้

สรุปโพสต์นี้ด้วย: