การจัดการข้อยกเว้นใน Selenium เว็บไดรเวอร์ (ประเภท)

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

การจัดการข้อยกเว้นใน Selenium WebDriver ป้องกันไม่ให้คำสั่งที่ล้มเหลวหยุดทำงานping การทดสอบทั้งหมดเสร็จสิ้นแล้ว Java try-catch, บล็อก catch หลายตัว, throw และ throws แต่ละแบบล้วนให้วิธีการกู้คืนที่แตกต่างกันแก่สคริปต์

  • 🔘 ความหมาย: ข้อยกเว้นคือข้อผิดพลาดที่เกิดขึ้นขณะที่โปรแกรมกำลังทำงาน และหากไม่จัดการกับข้อยกเว้นนั้น โปรแกรมจะหยุดทำงานโดยไม่คาดคิด
  • ☑️ ขอบเขต: Selenium WebDriver มีคลาสสำหรับจัดการข้อยกเว้นมากกว่าสี่สิบคลาส และทุกคลาสล้วนสืบทอดมาจาก WebDriverException
  • ผู้กระทำผิดซ้ำซาก: NoSuchElementException, TimeoutException, StaleElementReferenceException และ ElementNotInteractableException เป็นสาเหตุหลักของความล้มเหลวในโลกแห่งความเป็นจริง
  • 🧪 การจัดการ: บล็อก try-catch จะแยกประเภทข้อผิดพลาดเพียงประเภทเดียว บล็อก catch หลายบล็อกจะแยกข้อผิดพลาดหลายประเภท และสุดท้ายจะทำงานเสมอ
  • 🛠️ การเพิ่ม: คีย์เวิร์ด throw และ throws จะส่งข้อยกเว้นกลับไปยังผู้เรียกเมื่อเมธอดปัจจุบันไม่สามารถแก้ไขข้อยกเว้นนั้นได้
  • 📊 วินิจฉัย: พิมพ์สแต็คTracเมธอด e(), toString() และ getMessage() แต่ละเมธอดจะรายงานรายละเอียดเกี่ยวกับความล้มเหลวในระดับที่แตกต่างกัน

การจัดการข้อยกเว้นใน Selenium WebDriver ที่มี try-catch, throw และ finally

ข้อยกเว้นคืออะไร?

ข้อยกเว้นคือข้อผิดพลาดที่เกิดขึ้นในระหว่างการทำงานของโปรแกรม ขณะที่โปรแกรมกำลังทำงาน ภาษาโปรแกรมจะสร้างข้อยกเว้นขึ้นมา ซึ่งต้องได้รับการจัดการ มิฉะนั้นโปรแกรมจะหยุดทำงาน

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

ประเภทของข้อยกเว้นใน Selenium ไดรเวอร์เว็บ

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

# ข้อยกเว้น เมื่อมันเกิดขึ้น
1 องค์ประกอบ NotVisibleException องค์ประกอบที่มีอยู่แล้วใน DOM มีชุดคุณสมบัติที่ถูกซ่อนไว้
2 ElementNotSelectableException องค์ประกอบดังกล่าวอยู่ใน DOM แต่ไม่สามารถเลือกได้ ดังนั้นจึงไม่สามารถโต้ตอบได้
3 NoSuchElementException ไม่พบองค์ประกอบดังกล่าวด้วย ระบุตำแหน่ง ที่จัดมา
4 NosuchFrameException การขอ กรอบ เป้าหมายที่จะเปลี่ยนไปนั้นไม่มีอยู่จริง
5 NoAlertPresentException การเปลี่ยนไปใช้ เตือนภัย ทำงานเมื่อไม่มีการแจ้งเตือนใดๆ แสดงขึ้น
6 ไม่มีSuchWindowException หน้าต่างเป้าหมายที่จะสลับไปนั้นไม่มีอยู่จริง
7 ข้อยกเว้นการอ้างอิงองค์ประกอบที่ไม่หมดอายุ องค์ประกอบเว็บถูกแยกออกจากปัจจุบัน DOM.
8 SessionNotFoundException WebDriver จะทำงานหลังจากที่คุณปิดเบราว์เซอร์แล้ว
9 ข้อยกเว้นการหมดเวลา คำสั่งบางอย่างไม่เสร็จสมบูรณ์ภายในเวลาที่กำหนด เช่น ไม่พบองค์ประกอบที่ค้นหาภายในระยะเวลาที่กำหนด
10 WebDriverException คลาสพื้นฐานของข้อยกเว้น WebDriver อื่นๆ; ข้อยกเว้นนี้จะเกิดขึ้นเมื่อ WebDriver ทำงานทันทีหลังจากที่คุณปิดเบราว์เซอร์
11 การเชื่อมต่อปิดข้อยกเว้น เกิดการตัดการเชื่อมต่อในระบบไดรเวอร์
12 ElementClickInterceptedException องค์ประกอบที่รับเหตุการณ์นั้นกำลังบดบังองค์ประกอบที่ร้องขอให้คลิกอยู่
13 ElementNotInteractableException องค์ประกอบดังกล่าวมีอยู่ใน DOM แต่ไม่สามารถโต้ตอบกับมันได้
14 ข้อผิดพลาดในการตอบกลับ เกิดข้อผิดพลาดบางอย่างระหว่างการโต้ตอบกับ Firefox ส่วนขยายหรือเซิร์ฟเวอร์ไดรเวอร์ระยะไกล
15 ตัวจัดการข้อผิดพลาด. ข้อผิดพลาดเซิร์ฟเวอร์ที่ไม่รู้จัก ใช้เป็นตัวแทนเมื่อเซิร์ฟเวอร์ส่งคืนข้อผิดพลาดโดยไม่มีสแต็ก trace.
16 การเปิดใช้งาน Ime ล้มเหลว ข้อผิดพลาด การเปิดใช้งานระบบ IME ล้มเหลว
17 ImeNotAvailableException ไม่รองรับ IME
18 ข้อผิดพลาดใบรับรองไม่ปลอดภัย การนำทางทำให้ตัวแทนผู้ใช้ไปเจอปัญหา คำเตือนใบรับรองซึ่งอาจเกิดขึ้นได้จากใบรับรอง TLS ที่ไม่ถูกต้องหรือหมดอายุ
19 ข้อยกเว้นอาร์กิวเมนต์ที่ไม่ถูกต้อง อาร์กิวเมนต์นี้ไม่ตรงกับประเภทที่คาดไว้
20 ข้อผิดพลาดคุกกี้โดเมนไม่ถูกต้อง A คุกกี้ ถูกเพิ่มภายใต้โดเมนที่แตกต่างจากโดเมนปัจจุบัน URL.
21 ข้อผิดพลาดพิกัดไม่ถูกต้อง การดำเนินการโต้ตอบที่ตรงกันนั้นไม่ถูกต้อง
22 ข้อผิดพลาดสถานะองค์ประกอบที่ไม่ถูกต้อง ไม่สามารถดำเนินการคำสั่งให้เสร็จสิ้นได้ เนื่องจากองค์ประกอบไม่ถูกต้อง
23 ข้อผิดพลาดเซสชันไม่ถูกต้อง รหัสเซสชันที่ระบุไม่อยู่ในรายการเซสชันที่ใช้งานอยู่ ดังนั้นจึงไม่มีอยู่จริงหรืออยู่ในสถานะไม่ใช้งาน
24 สวิตช์ไม่ถูกต้องไปยังTargetข้อยกเว้น เฟรมหรือหน้าต่างเป้าหมายที่จะสลับไปนั้นไม่มีอยู่จริง
25 Javascriptข้อยกเว้น เกิดข้อผิดพลาดขณะดำเนินการ Javaสคริปต์ที่กำหนดโดยผู้ใช้
26 เจซอนเอเล็ค ระบบจะขอเข้าร่วมเซสชันหากยังไม่ได้สร้างเซสชันไว้
27 ข้อยกเว้นแอตทริบิวต์ดังกล่าว ไม่พบแอตทริบิวต์ขององค์ประกอบนั้น
28 ย้ายTargetข้อยกเว้น OutOfBoundsException เป้าหมายที่ระบุให้กับเมธอด move() ของ ActionChains ไม่ถูกต้อง เช่น อยู่นอกเอกสาร
29 NosuchContextException ContextAware ซึ่งทำการทดสอบบนอุปกรณ์เคลื่อนที่ ไม่สามารถค้นหาบริบทที่ร้องขอได้
30 NosuchCookieException ไม่พบคุกกี้ที่มีชื่อเส้นทางตรงกับที่ระบุไว้ในคุกกี้ของเอกสารที่กำลังเรียกดูอยู่
31 ไม่พบข้อยกเว้น คลาสย่อยของ WebDriverException ซึ่งเกิดขึ้นเมื่อไม่มีองค์ประกอบใน DOM อยู่จริง
32 ข้อผิดพลาดเซิร์ฟเวอร์ไดรเวอร์ระยะไกล เซิร์ฟเวอร์ไม่ตอบสนองเนื่องจากคุณสมบัติที่ระบุไว้ไม่ถูกต้อง
33 ScreenshotException ไม่สามารถจับภาพหน้าจอได้
34 SessionNotCreatedException ไม่สามารถสร้างเซสชันใหม่ได้สำเร็จ
35 ไม่สามารถตั้งค่าคุกกี้ได้ ยกเว้นข้อผิดพลาด ไดรเวอร์ไม่สามารถตั้งค่าคุกกี้ได้
36 ข้อผิดพลาด TagNameException ที่ไม่คาดคิด คลาสสนับสนุนไม่ได้รับองค์ประกอบเว็บตามที่คาดไว้
37 ข้อผิดพลาดการแจ้งเตือนที่ไม่ได้รับการจัดการ มีการแจ้งเตือนเกิดขึ้น แต่ WebDriver ไม่สามารถดำเนินการตามการแจ้งเตือนได้
38 UnexpectedAlertPresentException มีการแจ้งเตือนที่ไม่คาดคิดปรากฏขึ้น
39 ข้อผิดพลาดเมธอดไม่ทราบ คำสั่งที่ร้องขอตรงกับคำสั่งที่รู้จัก URL แต่ไม่ใช่วิธีการสำหรับเรื่องนั้นโดยเฉพาะ URL.
40 UnreachableBrowserException ไม่สามารถเปิดเบราว์เซอร์ได้ หรืออาจเกิดข้อผิดพลาดด้วยเหตุผลบางประการ
41 ข้อผิดพลาดคำสั่งที่ไม่รองรับ WebDriver ระยะไกลไม่ส่งคำสั่งที่ถูกต้องตามที่คาดไว้

มีสามข้อผิดพลาดหลักที่พบในการแก้ไขข้อผิดพลาดประจำวัน: NoSuchElementException หมายถึงข้อผิดพลาด XPath หรือองค์ประกอบที่ยังไม่แสดงผล TimeoutException หมายถึงการรอที่สั้นเกินไปสำหรับ AJAX การตอบสนอง และ StaleElementReferenceException ตามมา พลวัต เรนเดอร์ใหม่

วิธีจัดการกับข้อยกเว้นใน Selenium

ต่อไปนี้คือโครงสร้างมาตรฐานสำหรับการจัดการข้อยกเว้นใน Selenium WebDriver แต่ละอันก็เรียบง่าย Javaดังนั้นจึงใช้งานได้ในทุกกรณี สคริปต์ WebDriver โดยไม่ต้องใช้ไลบรารีเพิ่มเติม

ขั้นตอนที่ 1) ลองจับ

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

try
{
// Code
} catch (Exception e) {
// Code for Handling exception
}

ขั้นตอนที่ 2) บล็อก catch หลายอัน

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

try
{
//Code
} catch (ExceptionType1 e1) {
//Code for Handling Exception 1
} catch (ExceptionType2 e2) {
//Code for Handling Exception 2
}

ขั้นตอนที่ 3) โยน

เมื่อต้องการสร้างข้อยกเว้น คำสั่ง `throw` จะส่งต่อข้อยกเว้นนั้นไปยังระบบเพื่อจัดการในระหว่างการทำงานของโปรแกรม ใช้ `throw` เมื่อคุณส่งต่อข้อยกเว้นไปยังขั้นตอนถัดไป แทนที่จะแก้ไขข้อยกเว้นในเมธอดปัจจุบัน

public static void anyFunction() throws Exception{

try {
// write your code here
} catch (Exception b) {
// Do whatever you want to perform 
// Throw the Exception back to the system
throw(b);
}
}

ขั้นตอนที่ 4) ข้อยกเว้นหลายประการ

คุณสามารถระบุข้อยกเว้นต่างๆ ไว้ในข้อความเงื่อนไข throws ได้

public static void anyFunction() throws ExceptionType1, ExceptionType2{

try {
// write your code here
} catch (ExceptionType1 e1) {
// Code to handle exception 1
} catch (ExceptionType2 e2) {
// Code to handle exception 2
}

ขั้นตอนที่ 5) ในที่สุด

คีย์เวิร์ด finally สร้างบล็อกไว้ใต้บล็อก try โดยจะทำงานโดยไม่คำนึงถึงว่าเกิดข้อยกเว้นหรือไม่ ซึ่งทำให้เป็นสถานที่ที่เหมาะสมในการปิดไดรเวอร์หรือปล่อยการจัดการไฟล์

try {
//Code
} catch (ExceptionType1 e1) {
//Catch block
} catch (ExceptionType2 e2) {
//Catch block
} catch (ExceptionType3 e3) {
//Catch block
} finally {
//The finally block always executes.
}

วิธีการแสดงข้อมูลข้อผิดพลาด

เมื่อตรวจพบข้อผิดพลาดแล้ว ข้อมูลการวินิจฉัยจะอยู่ในวัตถุนั้น คุณสามารถใช้วิธีต่อไปนี้ในการแสดงผล:

วิธี รายงานนั้นระบุถึงอะไรบ้าง
พิมพ์สแต็คTracอี() พิมพ์สแต็ก tracเช่น ชื่อของข้อยกเว้นและคำอธิบายที่เป็นประโยชน์อื่นๆ
toString () ส่งข้อความตอบกลับที่ระบุชื่อและรายละเอียดของข้อผิดพลาด
getMessage () แสดงคำอธิบายของข้อผิดพลาดโดยลำพัง

เมื่อนำข้อมูลเหล่านี้มาประกอบกับภาพหน้าจอที่ถ่ายภายในบล็อก catch การทำงานที่ล้มเหลวจะแสดงให้เห็นทั้งสิ่งที่ผิดพลาดและลักษณะของหน้าเว็บ

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

ข้อยกเว้นของ WebDriver ทุกตัวจะไม่มีการตรวจสอบ เนื่องจากทั้งหมดสืบทอดมาจาก RuntimeException ผ่านทาง WebDriverException ดังนั้นคอมไพเลอร์จึงไม่ต้องการ try-catch ซึ่งสะดวก แต่ก็หมายความว่าความล้มเหลวของตัวระบุตำแหน่งที่ไม่มีการป้องกันจะปรากฏขึ้นก็ต่อเมื่อการทดสอบทำงานจริงเท่านั้น

ย้ายตำแหน่งขององค์ประกอบทันทีก่อนที่คุณจะดำเนินการใดๆ แทนที่จะแคชการอ้างอิง การวนลูปการลองใหม่สั้นๆ ที่ไม่สนใจข้อยกเว้นและดึงโหนดอีกครั้งจะจัดการกับการเรนเดอร์ใหม่ของ React หรือ Vue ได้อย่างน่าเชื่อถือมากกว่าการรอเป็นเวลานาน

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

Selenium เวอร์ชัน 4 ยังคงลำดับชั้นเดิม แต่คอนสตรัคเตอร์แบบรอจะรับค่า Duration แทนที่จะเป็นค่าหมดเวลาแบบจำนวนเต็ม และการตรวจสอบความถูกต้องของอาร์กิวเมนต์ตามมาตรฐาน W3C ที่เข้มงวดมากขึ้น ทำให้เกิดข้อยกเว้น InvalidArgumentException สำหรับค่าที่ไม่ถูกต้อง Selenium 3 รายได้รับการยอมรับโดยไม่มีข้อร้องเรียนใดๆ

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

Copilot มีจุดเด่นอยู่ที่โครงสร้างโค้ดพื้นฐาน เช่น โครงร่าง try-catch, ลำดับการทำงานของ catch ที่ถูกต้อง และบล็อก finally ที่ปิดการทำงานของ driver อย่างไรก็ตาม Copilot ไม่สามารถรู้ได้ว่าแอปพลิเคชันของคุณโยนข้อยกเว้นอะไรบ้าง ดังนั้นควรตรวจสอบ catch ทุกตัวที่สร้างขึ้นมา

มันช่วยเสริมกัน ITestListener จะรวมศูนย์การบันทึกและภาพหน้าจอสำหรับทุกการทดสอบที่ล้มเหลว ซึ่งทำให้เนื้อหาของการทดสอบดูเรียบร้อย ควรใช้ try-catch เฉพาะในกรณีที่สคริปต์ต้องทำงานต่อไปหลังจากเกิดข้อผิดพลาด แทนที่จะแค่รายงานข้อผิดพลาดเท่านั้น

แปลงไดรเวอร์เป็น TakesScreenshot ภายในบล็อก catch หรือ finally แล้วเขียนไฟล์ก่อนที่เซสชันจะปิดลง การตั้งชื่ออิมเมจตามชื่อเมธอดทดสอบจะทำให้สามารถอ่านการทำงานของ CI ที่ล้มเหลวได้โดยไม่ต้องจำลองข้อผิดพลาดในเครื่อง

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