วิธีจัดการกับการโทรเข้า AJAX Selenium ไดรเวอร์เว็บ
อาแจ็กซ์คืออะไร?
อาแจ็กซ์ ย่อมาจาก ไม่ตรงกัน Javaสคริปต์และ XML และช่วยให้เว็บเพจดึงข้อมูลจำนวนเล็กน้อยจากเซิร์ฟเวอร์โดยไม่ต้องโหลดทั้งหน้าซ้ำ
Ajax เป็นเทคนิคที่ใช้ในการสร้างหน้าเว็บที่รวดเร็วและไดนามิก เทคนิคนี้เป็นแบบอะซิงโครนัสและใช้การผสมผสานของ Javascript และ XML จะอัปเดตบางส่วนของหน้าเว็บโดยไม่ต้องโหลดหน้าเว็บทั้งหมดซ้ำ แอปพลิเคชันที่มีชื่อเสียงบางตัวที่ใช้เทคนิค AJAX ได้แก่ Gmail, Google Maps, Facebook, Youtube เป็นต้น
อาแจ็กซ์ทำงานอย่างไร?
ตัวอย่างเช่น เมื่อคุณคลิกที่ปุ่มส่ง Javaต้นฉบับ จะส่งคำขอไปยังเซิร์ฟเวอร์ ตีความผลลัพธ์ และอัปเดตหน้าจอปัจจุบันโดยไม่ต้องโหลดหน้าเว็บซ้ำ
- การเรียกใช้ Ajax คือคำขอแบบอะซิงโครนัสที่เริ่มต้นโดยเบราว์เซอร์ซึ่งไม่ส่งผลให้เกิดการเปลี่ยนหน้าโดยตรง ซึ่งหมายความว่าหากคุณเรียกใช้คำขอ Ajax ผู้ใช้ยังคงสามารถทำงานกับแอปพลิเคชันได้ในขณะที่คำขอกำลังรอการตอบกลับ
- AJAX ส่งคำขอ HTTP จากไคลเอ็นต์ไปยังเซิร์ฟเวอร์ จากนั้นประมวลผลการตอบสนองของเซิร์ฟเวอร์ โดยไม่ต้องโหลดทั้งหน้าซ้ำ ดังนั้นเมื่อคุณโทร AJAX คุณ ไม่ค่อยแน่ใจเกี่ยวกับเวลาที่เซิร์ฟเวอร์ใช้ในการส่งคำตอบถึงคุณ.
จากมุมมองของผู้ทดสอบ หากคุณกำลังตรวจสอบเนื้อหาหรือองค์ประกอบที่จะแสดง คุณต้องรอจนกว่าจะได้รับการตอบกลับ ในระหว่างการเรียกใช้ AJAX ข้อมูลจะถูกจัดเก็บในรูปแบบ XML และเรียกค้นจากเซิร์ฟเวอร์
วิธีจัดการกับการโทร Ajax Selenium ไดรเวอร์เว็บ
เค้ก ความท้าทายที่ใหญ่ที่สุดในการจัดการการเรียกใช้ Ajax คือการรู้เวลาโหลดของหน้าเว็บ เนื่องจากการโหลดหน้าเว็บจะใช้เวลาเพียงเสี้ยววินาที จึงเป็นเรื่องยากสำหรับผู้ทดสอบที่จะทดสอบแอปพลิเคชันดังกล่าวผ่านเครื่องมืออัตโนมัติ สำหรับการที่, Selenium Webdriver ต้องใช้วิธีการรอใน Ajax Call นี้
ดังนั้นการดำเนินการคำสั่งรอนี้ Selenium จะระงับการดำเนินการปัจจุบัน กรณีทดสอบ และรอค่าที่คาดหวังหรือค่าใหม่ เมื่อค่าหรือฟิลด์ใหม่ปรากฏขึ้น กรณีการทดสอบที่ถูกระงับจะถูกดำเนินการโดย Selenium เว็บไดรเวอร์
ต่อไปนี้เป็นวิธีการรอที่ Selenium เว็บไดร์เวอร์ก็ใช้ได้
Thread.นอน()
- Thread.Sleep () ไม่ใช่ตัวเลือกที่ชาญฉลาด เนื่องจากจะระงับเธรดปัจจุบันตามระยะเวลาที่ระบุ
- ใน AJAX คุณไม่สามารถแน่ใจเกี่ยวกับเวลารอที่แน่นอนได้ ดังนั้น การทดสอบของคุณจะล้มเหลวหากองค์ประกอบไม่แสดงภายในเวลารอ ยิ่งไปกว่านั้น ยังเพิ่มโอเวอร์เฮดเนื่องจากการเรียก Thread.sleep(t) ทำให้เธรดปัจจุบันถูกย้ายจากคิวที่รันอยู่ไปยังคิวที่รอ
- หลังจากถึงเวลา 'ไม่' เธรดปัจจุบันจะย้ายจากคิวที่รอไปยังคิวที่พร้อม จากนั้น CPU จะเลือกและใช้เวลาสักครู่จึงจะเริ่มทำงาน
รอโดยนัย ()
- เมธอดนี้บอกให้เว็บไดรเวอร์รอหากองค์ประกอบไม่พร้อมใช้งานทันที แต่การรอนี้จะคงอยู่ตลอดเวลาที่เปิดเบราว์เซอร์ ดังนั้นการค้นหาองค์ประกอบบนเพจอาจต้องใช้เวลาในการตั้งค่าการรอโดยนัย
รออย่างชัดเจน ()
- การรอคอยที่ชัดเจน ใช้เพื่อหยุดการดำเนินการทดสอบจนถึงเวลาที่ตรงตามเงื่อนไขเฉพาะหรือช่วงเวลาสูงสุด
เว็บไดรเวอร์รอสักครู่
- ใช้ได้กับทุกสภาวะ ซึ่งสามารถทำได้ด้วย WebDriverWait ร่วมกับ ExpectedCondition
- วิธีที่ดีที่สุดในการรอองค์ประกอบแบบไดนามิกคือการตรวจสอบเงื่อนไขทุกวินาทีและดำเนินการคำสั่งถัดไปในสคริปต์ทันทีที่ตรงตามเงื่อนไข
แต่ปัญหาของการรอเหล่านี้คือ คุณต้องพูดถึงหน่วยการหมดเวลา จะเกิดอะไรขึ้นถ้าองค์ประกอบนั้นยังไม่ปรากฏภายในเวลานั้น? จึงมีอีกสิ่งหนึ่งที่เรียกว่าการรอคอยอย่างคล่องแคล่ว
รอได้อย่างคล่องแคล่ว
- นี่คือการใช้งานอินเทอร์เฟซ Wait ซึ่งมีการหมดเวลาและช่วงเวลาการโพล อินสแตนซ์ FluentWait แต่ละรายการจะกำหนดระยะเวลาสูงสุดในการรอเงื่อนไข รวมถึงความถี่ในการตรวจสอบเงื่อนไข
ความท้าทายในการจัดการกับ Ajax Call in Selenium ไดรเวอร์เว็บ
- การใช้คำสั่ง "หยุดชั่วคราว" เพื่อจัดการการโทร Ajax นั้นไม่น่าเชื่อถืออย่างสมบูรณ์ เวลาหยุดชั่วคราวนานทำให้การทดสอบช้าอย่างไม่อาจยอมรับได้และเพิ่ม การทดสอบ เวลา. แต่ "waitforcondition" จะมีประโยชน์มากกว่าในการทดสอบแอปพลิเคชัน Ajax
- เป็นการยากที่จะประเมินความเสี่ยงที่เกี่ยวข้องกับแอปพลิเคชัน Ajax โดยเฉพาะ
- การให้อิสระอย่างเต็มที่แก่นักพัฒนาในการปรับเปลี่ยนแอปพลิเคชัน Ajax ทำให้กระบวนการทดสอบมีความท้าทาย
- การสร้างคำขอทดสอบอัตโนมัติอาจเป็นเรื่องยากสำหรับเครื่องมือทดสอบ เนื่องจากแอปพลิเคชัน AJAX ดังกล่าวมักใช้เทคนิคการเข้ารหัสหรือการทำให้เป็นอนุกรมที่แตกต่างกันในการส่งข้อมูล POST
ตัวอย่างโค้ดสำหรับ Ajax HANDLING โดยใช้ Selenium ไดรเวอร์เว็บ
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class Ajaxdemo { private String URL = "https://demo.guru99.com/test/ajax.html"; WebDriver driver; WebDriverWait wait; @BeforeClass public void setUp() { System.setProperty("webdriver.chrome.driver",".\\chromedriver.exe"); //create chrome instance driver = new ChromeDriver(); driver.manage().window().maximize(); driver.navigate().to(URL); } @Test public void test_AjaxExample() { By container = By.cssSelector(".container"); wait = new WebDriverWait(driver, 5); wait.until(ExpectedConditions.presenceOfElementLocated(container)); //Get the text before performing an ajax call WebElement noTextElement = driver.findElement(By.className("radiobutton")); String textBefore = noTextElement.getText().trim(); //Click on the radio button driver.findElement(By.id("yes")).click(); //Click on Check Button driver.findElement(By.id("buttoncheck")).click(); /*Get the text after ajax call*/ WebElement TextElement = driver.findElement(By.className("radiobutton")); wait.until(ExpectedConditions.visibilityOf(TextElement)); String textAfter = TextElement.getText().trim(); /*Verify both texts before ajax call and after ajax call text.*/ Assert.assertNotEquals(textBefore, textAfter); System.out.println("Ajax Call Performed"); String expectedText = "Radio button is checked and it's value is Yes"; /*Verify expected text with text updated after ajax call*/ Assert.assertEquals(textAfter, expectedText); driver.close(); } }
สรุป
- AJAX อนุญาตให้เว็บเพจดึงข้อมูลจำนวนเล็กน้อยจากเซิร์ฟเวอร์โดยไม่ต้องโหลดทั้งหน้าซ้ำ
- หากต้องการทดสอบแอปพลิเคชัน Ajax ควรใช้วิธีการรอที่แตกต่างกัน
- เธรดสลีป
- รอโดยปริยาย
- รออย่างชัดแจ้ง
- เว็บไดรเวอร์รอสักครู่
- รอได้อย่างคล่องแคล่ว
- การสร้างคำขอทดสอบอัตโนมัติอาจเป็นเรื่องยากสำหรับเครื่องมือทดสอบ เนื่องจากแอปพลิเคชัน AJAX ดังกล่าวมักใช้เทคนิคการเข้ารหัสหรือการทำให้เป็นอนุกรมที่แตกต่างกันในการส่งข้อมูล POST