การตรวจสอบสิทธิ์พร็อกซีใน Selenium จะทำได้ยากเมื่อเบราว์เซอร์—ไม่ใช่เว็บเพจ—เป็นผู้ขอชื่อผู้ใช้และรหัสผ่าน วิธีแก้ปัญหาที่ถูกต้องนั้นขึ้นอยู่กับประเภทของพร็อกซี เบราว์เซอร์ เวอร์ชันของ Selenium และว่าสามารถระบุข้อมูลประจำตัวได้ภายนอกการทดสอบหรือไม่ คู่มือนี้จะอธิบายวิธีการที่เชื่อถือได้ใน Selenium 4 วิธีแก้ปัญหาแบบเก่าที่ยังคงใช้ได้ และเหตุใดโค้ดการจัดการการแจ้งเตือนจึงมักล้มเหลว
พร็อกซี่คืออะไร?
พร็อกซีคือตัวกลางที่ส่งคำขอไปยังเว็บไซต์ในนามของเบราว์เซอร์ของคุณ ปลายทางจะเห็นที่อยู่ IP ของพร็อกซีแทนที่จะเป็นเครื่องที่ใช้งาน Selenium ทีมทดสอบใช้พร็อกซีเพื่อตรวจสอบประสบการณ์ในแต่ละภูมิภาค กำหนดเส้นทางการรับส่งข้อมูลผ่านเครือข่ายที่มีการควบคุม ตรวจสอบคำขอ หรือกระจายภาระงานอัตโนมัติ
โดยทั่วไป URL ของพร็อกซีจะประกอบด้วยโฮสต์และพอร์ต เช่น proxy.example.test:8080บริการส่วนตัวอาจต้องการชื่อผู้ใช้และรหัสผ่านด้วยเช่นกัน Selenium สามารถกำหนดค่าปลายทางพร็อกซีผ่านตัวเลือกของเบราว์เซอร์ได้ แต่ข้อความแจ้งเตือนการตรวจสอบสิทธิ์นั้นถูกควบคุมโดยเบราว์เซอร์และไม่ได้แสดงให้ WebDriver เห็นเสมอไปเหมือนกับแบบฟอร์ม HTML ทั่วไป
ใช้ระบบอัตโนมัติเฉพาะในกรณีที่คุณได้รับอนุญาต ปฏิบัติตามข้อกำหนดของเว็บไซต์ และเก็บข้อมูลประจำตัวให้ห่างจากซอร์สโค้ดและบันทึกการทดสอบ
ความแตกต่างระหว่าง SOCKS และ HTTP Proxy
พร็อกซี HTTP เข้าใจการรับส่งข้อมูลบนเว็บและโดยทั่วไปจะถูกกำหนดค่าด้วยค่า HTTP และ HTTPS แยกกัน พร็อกซี SOCKS ทำงานในระดับที่ต่ำกว่าและสามารถส่งข้อมูล TCP ประเภทต่างๆ ได้โดยไม่ต้องตีความโปรโตคอลแอปพลิเคชัน นอกจากนี้ SOCKS5 ยังรองรับการตรวจสอบสิทธิ์และมักเป็นเวอร์ชัน SOCKS ที่นิยมใช้มากกว่า
| ลักษณะเฉพาะ | พร็อกซี HTTP/HTTPS | พร็อกซี SOCKS5 |
|---|---|---|
| การจราจร | ออกแบบมาเพื่อรองรับการร้องขอเว็บเบราว์เซอร์ | ใช้งานได้กับแอปพลิเคชันที่ใช้ TCP หลายตัว |
| ความตระหนักรู้เกี่ยวกับโปรโตคอล | เข้าใจคำขอและส่วนหัวของ HTTP | ส่งต่อทราฟฟิกโดยไม่พิจารณาความหมายของ HTTP |
| การตั้งค่า Selenium | ตั้งค่าฟิลด์พร็อกซี HTTP และ SSL | ตั้งค่าเอนด์พอยต์และเวอร์ชันของ SOCKS |
| การใช้งานทั่วไป | การทดสอบเว็บไซต์, การกรองข้อมูล, การแคชข้อมูล, การตรวจสอบ | การสร้างอุโมงค์ที่ยืดหยุ่นและการรับส่งข้อมูลที่ไม่ใช่ HTTP |
เบราว์เซอร์และผู้ให้บริการพร็อกซีต้องรองรับวิธีการเดียวกัน การมีเอนด์พอยต์ที่ถูกต้องไม่ได้หมายความว่า Selenium จะสามารถกรอกชื่อผู้ใช้/รหัสผ่านในกล่องโต้ตอบดั้งเดิมได้โดยอัตโนมัติเสมอไป
วิธีจัดการพร็อกซีใน Selenium Webdriver บน Chrome
สำหรับพร็อกซีที่ไม่ต้องการการตรวจสอบสิทธิ์แบบโต้ตอบ Selenium 4 สามารถกำหนดค่าได้ Proxy วัตถุประสงค์ ChromeOptions. ปัจจุบัน เอกสารอย่างเป็นทางการเกี่ยวกับตัวเลือกเบราว์เซอร์ของ Selenium แสดงให้เห็นถึงแนวทางที่เน้นความสามารถเป็นหลักนี้
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
Proxy proxy = new Proxy();
proxy.setHttpProxy("proxy.example.test:8080");
proxy.setSslProxy("proxy.example.test:8080");
ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);
WebDriver driver = new ChromeDriver(options);
driver.get("https://example.com");
สำหรับ SOCKS5 ให้ตั้งค่าเอนด์พอยต์และเวอร์ชันของ SOCKS แทน:
Proxy proxy = new Proxy();
proxy.setSocksProxy("proxy.example.test:1080");
proxy.setSocksVersion(5);
ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);
พร็อกซีที่ต้องมีการตรวจสอบสิทธิ์นั้นจำเป็นต้องมีการวางแผนเพิ่มเติม การฝังข้อมูลประจำตัวไว้ใน URL อาจถูกปฏิเสธโดยเบราว์เซอร์สมัยใหม่และอาจเปิดเผยข้อมูลลับได้ ควรใช้วิธีการเหล่านี้แทน:
- รายชื่อ IP ที่อนุญาต: อนุญาต IP สาธารณะคงที่ของ CI runner หรือโหนด Selenium Grid ของคุณ เพื่อไม่ให้กล่องโต้ตอบในเบราว์เซอร์ปรากฏขึ้น
- เกตเวย์ท้องถิ่น: ติดตั้งพร็อกซีส่งต่อที่เชื่อถือได้บนเครื่องทดสอบ Selenium จะเชื่อมต่อในเครื่องโดยไม่ต้องใช้ข้อมูลรับรอง และเกตเวย์จะตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ปลายทาง
- ส่วนขยายเบราว์เซอร์ที่ควบคุมได้: สร้างส่วนขยาย Chrome ภายในที่กำหนดค่าพร็อกซีและตอบสนองต่อการตรวจสอบสิทธิ์ โหลดส่วนขยายนี้จากไฟล์ทดสอบที่ได้รับการป้องกันเท่านั้น
- การกำหนดค่าระดับกริด: กำหนดค่าเครือข่ายและข้อมูลลับบนโหนด Selenium แทนที่จะแจกจ่ายข้อมูลประจำตัวให้กับทุกการทดสอบ
อ่านข้อมูลประจำตัวจากตัวจัดการความลับหรือการกำหนดค่าการทดสอบเฉพาะสภาพแวดล้อม ห้ามบันทึกข้อมูลเหล่านี้ลงใน Git ห้ามพิมพ์ลงในคอนโซล หรือรวมไว้ในภาพหน้าจอ หลังจากเริ่มการทดสอบแล้ว ให้ตรวจสอบ IP ขาออกกับปลายทางการทดสอบที่ได้รับอนุมัติก่อนดำเนินการทดสอบต่อ
ERR_PROXY_CONNECTION_FAILED โดยปกติแล้วแสดงว่าโฮสต์ พอร์ต โปรโตคอล หรือเส้นทางเครือข่ายไม่ถูกต้อง เกิดขึ้นซ้ำๆ 407 Proxy Authentication Required คำตอบเหล่านี้บ่งชี้ว่าข้อมูลประจำตัวไม่ครบถ้วนหรือถูกปฏิเสธการใช้เครื่องมือ AutoIt
AutoIt สามารถทำให้กระบวนการตรวจสอบสิทธิ์ในหน้าต่าง Windows เป็นไปโดยอัตโนมัติได้โดยการค้นหาหน้าต่าง พิมพ์ข้อมูลประจำตัว และกดปุ่ม ในอดีต วิธีการนี้เคยเป็นวิธีแก้ปัญหาที่ใช้กันทั่วไปใน Selenium เนื่องจาก WebDriver ไม่สามารถจัดการกับหน้าต่างตรวจสอบสิทธิ์ที่อยู่ในเบราว์เซอร์ได้
วิธีการนี้มีความเปราะบาง: ใช้ได้เฉพาะกับ Windows เท่านั้น ต้องใช้เดสก์ท็อปแบบโต้ตอบที่ปลดล็อกแล้ว ขึ้นอยู่กับชื่อหน้าต่างและจังหวะเวลา และมักจะล้มเหลวในคอนเทนเนอร์แบบไม่มีส่วนหัวหรือเอเจนต์ CI ระยะไกล นอกจากนี้ยังอาจเปิดเผยรหัสผ่านผ่านสคริปต์หรืออาร์กิวเมนต์ของกระบวนการได้อีกด้วย
หากสภาพแวดล้อมเดิมไม่เอื้ออำนวยให้มีทางเลือกอื่น ให้คอมไพล์สคริปต์ AutoIt เก็บไว้ในตำแหน่งที่ควบคุมได้สำหรับเก็บไฟล์ทดสอบ ดึงข้อมูลรับรองอย่างปลอดภัยในระหว่างการทำงาน และรอจนกว่าจะได้รับข้อความแจ้งเตือนที่ถูกต้อง แทนที่จะใช้การหน่วงเวลาคงที่ จำกัดเทคนิคนี้ไว้เฉพาะกับเครื่องรันเนอร์ Windows ที่แยกต่างหาก สำหรับชุดทดสอบที่สามารถบำรุงรักษาได้ การอนุญาต IP เกตเวย์ หรือโหนด Grid ที่กำหนดค่าจากส่วนกลางเป็นทางเลือกที่ปลอดภัยกว่า
การใช้การแจ้งเตือน
Selenium สามารถจัดการกับข้อความแจ้งเตือน JavaScript ที่สร้างขึ้นโดยโค้ดของเว็บเพจได้:
Alert alert = new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.alertIsPresent());
alert.accept();
อย่างไรก็ตาม โดยปกติแล้วกล่องโต้ตอบการตรวจสอบสิทธิ์พร็อกซีจะเป็นส่วนประกอบของเบราว์เซอร์ ไม่ใช่การแจ้งเตือนด้วย JavaScript ดังนั้น driver.switchTo().alert() มักจะโยน NoAlertPresentException แม้ว่าจะปรากฏหน้าต่างแจ้งให้ป้อนข้อมูลประจำตัวก็ตาม ข้อจำกัดเดียวกันนี้ใช้กับกล่องโต้ตอบการตรวจสอบสิทธิ์พื้นฐาน HTTP หลายๆ แบบด้วย
ใช้ API แจ้งเตือนเฉพาะหลังจากยืนยันแล้วว่า WebDriver รู้จักข้อความแจ้งเตือนนั้น หากไม่รู้จัก ให้ลบข้อความแจ้งเตือนผ่านการกำหนดค่าเครือข่าย หรือใช้วิธีการพร็อกซีที่ต้องมีการตรวจสอบสิทธิ์แบบใดแบบหนึ่งตามที่อธิบายไว้ข้างต้น วิธีนี้มีความเสถียรมากกว่าการประสานการกดแป้นพิมพ์กับหน้าต่างที่ Selenium ไม่สามารถตรวจสอบได้
คำถามที่พบบ่อย
Selenium สามารถตั้งค่าพร็อกซีโดยตรงได้หรือไม่?
ใช่แล้ว Selenium 4 สามารถส่งผ่านการตั้งค่า HTTP, SSL หรือ SOCKS ผ่านตัวเลือกและการทำงานของพร็อกซีในเบราว์เซอร์ได้ การดำเนินการนี้จะกำหนดค่าปลายทาง แต่การดำเนินการนี้อาจไม่ทำให้การตรวจสอบสิทธิ์ที่เบราว์เซอร์กำหนดเสร็จสมบูรณ์
เหตุใดการใช้ username:password@host:port จึงล้มเหลวใน Chrome?
เบราว์เซอร์สมัยใหม่อาจบล็อกข้อมูลประจำตัวที่ฝังอยู่ใน URL และไวยากรณ์ดังกล่าวอาจทำให้ข้อมูลลับรั่วไหลไปยังบันทึกและประวัติการใช้งาน ควรใช้การกำหนดรายการ IP ที่อนุญาต เกตเวย์ที่ปลอดภัย หรือโครงสร้างพื้นฐานการทดสอบที่มีการควบคุมแทน
Selenium สามารถจัดการกับการล็อกอินผ่านพร็อกซีโดยใช้ switchTo().alert() ได้หรือไม่?
โดยปกติแล้วจะไม่ใช่ การตรวจสอบสิทธิ์พร็อกซีมักแสดงในส่วนติดต่อผู้ใช้ของเบราว์เซอร์มากกว่าการแจ้งเตือนด้วย JavaScript ดังนั้น WebDriver อาจรายงานว่าไม่มีการแจ้งเตือนใดๆ เกิดขึ้น
การตรวจสอบสิทธิ์พร็อกซีใช้งานได้ใน Chrome แบบ Headless หรือไม่?
วิธีนี้สามารถใช้งานได้เมื่อการตรวจสอบสิทธิ์เสร็จสิ้นโดยไม่ต้องมีการแจ้งเตือนแบบโต้ตอบ การกำหนดรายการ IP ที่อนุญาต เกตเวย์ภายใน หรือการกำหนดค่าระดับโหนดนั้นเหมาะสมกว่าสำหรับการทำงานแบบไร้หน้าจอ
ฉันควรใช้ AutoIt สำหรับการตรวจสอบสิทธิ์พร็อกซีของ Selenium หรือไม่?
ควรใช้เฉพาะกับเวิร์กโฟลว์ Windows รุ่นเก่าที่มีข้อจำกัดเท่านั้น เนื่องจากมีความเปราะบางในการใช้งานในระบบ CI และมีความปลอดภัยน้อยกว่าการกำจัดกล่องโต้ตอบผ่านการกำหนดค่าเครือข่าย
พร็อกซีประเภทใดเหมาะสมที่สุดสำหรับการทำงานอัตโนมัติของเบราว์เซอร์?
ขึ้นอยู่กับงานที่ได้รับอนุญาต พร็อกซี HTTP นั้นใช้งานง่ายสำหรับทราฟฟิกเว็บ พร็อกซี SOCKS5 มีความยืดหยุ่น และเครือข่ายบ้านพักอาศัยสามารถช่วยในการทดสอบตำแหน่งที่ตั้งได้ เปรียบเทียบตัวเลือกต่างๆ ในคู่มือประเภทพร็อกซี ของ เรา
