วิธีจัดการกับการโทรเข้า 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

จดหมายข่าว Guru99 รายวัน

เริ่มต้นวันใหม่ของคุณด้วยข่าวสาร AI ล่าสุดและสำคัญที่สุดที่ส่งมอบทันที