كيفية التعامل مع مكالمات AJAX في برنامج تشغيل الويب السيلينيوم

ما هو اياكس؟

اياكس يعني Asyncجافا سكريبت وXML، ويسمح لصفحة الويب باسترداد كميات صغيرة من البيانات من الخادم دون إعادة تحميل الصفحة بأكملها.

Ajax هي تقنية تستخدم لإنشاء صفحات ويب سريعة وديناميكية. هذه التقنية هيsynchronous ويستخدم مزيجًا من Javascript وXML. سيقوم بتحديث جزء/أجزاء من صفحة الويب دون إعادة تحميل الصفحة بأكملها. ومن التطبيقات المشهورة التي تستخدم تقنية AJAX هي Gmail، خرائط جوجل، فيسبوك، Youtube، الخ.

كيف يعمل اياكس؟

على سبيل المثال، عند النقر على زر إرسال، جافا سكريبت سيقوم بتقديم طلب إلى الخادم، وتفسير النتيجة وتحديث الشاشة الحالية دون إعادة تحميل صفحة الويب.

كيف يعمل اياكس

  • مكالمة Ajax هي عبارة عن asyncطلب مزمن يبدأه المتصفح ولا يؤدي بشكل مباشر إلى انتقال الصفحة. وهذا يعني أنه إذا قمت بتنشيط طلب Ajax، فلا يزال بإمكان المستخدم العمل على التطبيق أثناء انتظار الطلب للاستجابة.
  • يرسل AJAX طلبات HTTP من العميل إلى الخادم ثم يعالج استجابة الخادم، دون إعادة تحميل الصفحة بأكملها. لذا، عندما تقوم بإجراء مكالمة AJAX، فإنك لست متأكدًا تمامًا من الوقت الذي يستغرقه الخادم لإرسال الرد إليك.

من وجهة نظر المختبر، إذا كنت تتحقق من المحتوى أو العنصر الذي سيتم عرضه، فستحتاج إلى الانتظار حتى تحصل على الرد. أثناء مكالمة AJAX، يتم تخزين البيانات بتنسيق XML ويتم استردادها من الخادم.

كيفية التعامل مع مكالمات Ajax في برنامج تشغيل الويب السيلينيوم

التحدي الأكبر في التعامل مع مكالمة Ajax هو knowing وقت التحميل لصفحة الويب. نظرًا لأن تحميل صفحة الويب لن يستمر إلا لجزء من الثواني، فمن الصعب على القائم بالاختبار اختبار مثل هذا التطبيق من خلال أداة التشغيل الآلي. للقيام بذلك، يجب على Selenium Webdriver استخدام طريقة الانتظار في مكالمة Ajax هذه.

لذلك، من خلال تنفيذ أمر الانتظار هذا، سيوقف السيلينيوم تنفيذ التيار حالة الاختبار وانتظر القيمة المتوقعة أو الجديدة. عندما تظهر القيمة أو الحقل الجديد، سيتم تنفيذ حالات الاختبار المعلقة بواسطة Selenium Webdriver.

فولوwing هي طرق الانتظار التي يمكن أن يستخدمها Selenium Webdriver

الموضوع.السكون ()

  • Thread.Sleep () ليس ملفًا wise الاختيار لأنه يعلق مؤشر الترابط الحالي لفترة زمنية محددة.
  • في AJAX، لا يمكنك أبدًا التأكد من وقت الانتظار الدقيق. لذلك، سيفشل الاختبار إذا لم يظهر العنصر خلال وقت الانتظار. علاوة على ذلك، فإنه يزيد الحمل لأن استدعاء Thread.sleep(t) يجعل مؤشر الترابط الحالي يتم نقله من قائمة الانتظار قيد التشغيل إلى قائمة انتظار الانتظار.
  • بعد الوصول إلى الوقت "t"، سينتقل الخيط الحالي من قائمة الانتظار إلى قائمة الانتظار الجاهزة، ثم يستغرق الأمر بعض الوقت حتى يتم التقاطه بواسطة وحدة المعالجة المركزية وتشغيله.

الانتظار الضمني ()

  • تخبر هذه الطريقة برنامج تشغيل الويب بالانتظار إذا لم يكن العنصر متاحًا على الفور، ولكن هذا الانتظار سيظل قائمًا طوال الوقت الذي يكون فيه المتصفح مفتوحًا. لذا فإن أي بحث عن العناصر الموجودة في الصفحة قد يستغرق الوقت المحدد للانتظار الضمني.

الانتظار الصريح ()

  • الانتظار الصريح يتم استخدامه لتجميد تنفيذ الاختبار حتى يتم استيفاء شرط معين أو انقضاء الحد الأقصى للوقت.

WebdriverWait

  • ويمكن استخدامه لأية شروط. يمكن تحقيق ذلك باستخدام WebDriverWait بالاشتراك مع ExpectedCondition
  • أفضل طريقة لانتظار عنصر ديناميكيًا هي التحقق من الشرط كل ثانية والاستمرار في الأمر التالي في البرنامج النصي بمجرد استيفاء الشرط.

لكن المشكلة في كل هذه الانتظارات هي أنه عليك أن تذكر وحدة المهلة. ماذا لو كان العنصر لا يزال غير موجود خلال الوقت؟ لذلك هناك انتظار آخر يسمى الانتظار بطلاقة.

الانتظار بطلاقة

  • هذا هو تطبيق لواجهة الانتظار التي لها مهلة وفاصل زمني للاستقصاء. تحدد كل نسخة من مثيلات FluentWait الحد الأقصى من الوقت لانتظار حالة ما، بالإضافة إلى عدد مرات التحقق من الحالة.

التحديات في التعامل مع Ajax Call في Selenium Webdriver

  • إن استخدام أمر "الإيقاف المؤقت" للتعامل مع مكالمات Ajax ليس موثوقًا تمامًا. وقت التوقف الطويل يجعل الاختبار بطيئًا بشكل غير مقبول ويزيد من سرعة الاختبار الاختبار وقت. بدلًا من ذلك، سيكون الأمر "waitforcondition" أكثر فائدة في اختبار تطبيقات Ajax.
  • من الصعب تقييم المخاطر المرتبطة بتطبيقات Ajax معينة
  • إن منح الحرية الكاملة للمطورين لتعديل تطبيق Ajax يجعل عملية الاختبار صعبة
  • قد يكون إنشاء طلب اختبار آلي أمرًا صعبًا بالنسبة لأدوات الاختبار لأن تطبيق AJAX غالبًا ما يستخدم تقنية تشفير أو تسلسل مختلفة لإرسال بيانات POST.

مثال على التعليمات البرمجية للتعامل مع Ajax باستخدام Selenium Webdriver

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، يجب تطبيق طرق انتظار مختلفة
    • ThreadSleep
    • الانتظار الضمني
    • الانتظار الصريح
    • WebdriverWait
    • الانتظار بطلاقة
  • قد يكون إنشاء طلب اختبار آلي أمرًا صعبًا بالنسبة لأدوات الاختبار لأن تطبيق AJAX غالبًا ما يستخدم تقنية تشفير أو تسلسل مختلفة لإرسال بيانات POST.