كيفية التعامل مع مكالمات AJAX Selenium برنامج تشغيل الويب
⚡ ملخص ذكي
تُحدّث استدعاءات AJAX جزءًا من الصفحة دون إعادة تحميلها، لذا Selenium يجب على WebDriver الانتظار حتى يتم الحصول على المحتوى الجديد بدلاً من افتراض وجوده، وتحدد استراتيجية الانتظار ما إذا كان الاختبار سينجح بشكل موثوق.
ما هو اياكس؟
AJAX تعني غير متزامن JavaScript & XML، ويسمح لصفحة الويب باسترداد كميات صغيرة من البيانات من الخادم دون إعادة تحميل الصفحة بأكملها.
AJAX هي تقنية لبناء صفحات ويب سريعة وديناميكية. وهي غير متزامنة، وتجمع بين Javaسيناريو باستخدام تنسيق بيانات، ويقوم بتحديث أجزاء من الصفحة بدلاً من الصفحة بأكملها. Gmail, Google الخرائط، فيسبوك و YouTube الجميع يستخدمه.
كيف يعمل AJAX؟
على سبيل المثال، عند النقر على زر الإرسال، Javaيرسل البرنامج النصي طلبًا إلى الخادم، ويفسر النتيجة، ثم يُحدّث الشاشة الحالية دون إعادة تحميلها. يوضح الرسم البياني أدناه هذه العملية.
- يُعدّ طلب AJAX طلبًا غير متزامن من المتصفح لا يُسبب انتقالًا بين صفحات الموقع. يمكن للمستخدم الاستمرار في استخدام التطبيق أثناء انتظار الرد على الطلب.
- يقوم AJAX بإرسال طلبات HTTP إلى الخادم ويعالج الاستجابة دون إعادة تحميل الصفحة، لذلك لا يمكنك التنبؤ بالمدة التي سيستغرقها الخادم للرد.
من وجهة نظر المختبر، يعني فحص المحتوى أو عنصر ما انتظار وصول الاستجابة. كانت البيانات المرسلة في الأصل بتنسيق XML، كما يشير الاسم؛ أما الآن، فإن معظم واجهات برمجة التطبيقات (APIs) تُرجع JSON.
كيفية التعامل مع مكالمات AJAX Selenium ويب درايفر
يُعدّ معرفة وقت التحميل التحدي الأكبر في التعامل مع استدعاء AJAX. ولأن التحديث يستغرق جزءًا من الثانية، يصعب اختبار التطبيق باستخدام أداة أتمتة، لذا Selenium يجب على WebDriver تطبيق طريقة انتظار على الاستدعاء.
يؤدي تنفيذ أمر الانتظار هذا إلى تعليق العملية الحالية حالة الاختبار إلى أن تظهر القيمة المتوقعة أو الجديدة؛ Selenium ثم يستأنف برنامج WebDriver الخطوات المعلقة.
فيما يلي طرق الانتظار التي Selenium يمكن لـ WebDriver استخدام
Thread.sleep ()
- إن استخدام Thread.sleep () ليس خيارًا حكيمًا لأنه يعلق الخيط الحالي لفترة زمنية محددة.
- في تقنية AJAX، لا يمكنك التأكد من وقت الانتظار بدقة، لذا يفشل الاختبار إذا لم يظهر العنصر خلاله. كما أنه يُضيف عبئًا إضافيًا، لأن استدعاء Thread.sleep(t) ينقل الخيط الحالي من قائمة الانتظار قيد التشغيل إلى قائمة الانتظار.
- بعد مرور الوقت 't' ينتقل الخيط إلى قائمة الانتظار الجاهزة، ثم ينتظر مرة أخرى ليتم التقاطه بواسطة وحدة المعالجة المركزية.
ملاحظة: القادم Java الطريقة Thread.sleep () بأحرف صغيرة؛ أما الصيغة المكتوبة بأحرف كبيرة فلا يتم تجميعها.
الانتظار الضمني ()
- تُخبر هذه الطريقة برنامج WebDriver بالانتظار عندما لا يكون العنصر متاحًا على الفور، ويبقى هذا الإعداد ساريًا طوال جلسة المتصفح. وبالتالي، يمكن أن تستغرق كل عملية بحث عن عنصر المدة التي يسمح بها الانتظار الضمني.
الانتظار الصريح ()
- الانتظار الصريح يتم استخدامه لتجميد تنفيذ الاختبار حتى يتم استيفاء شرط معين أو انقضاء الحد الأقصى للوقت.
WebDriverWait
- يمكن استخدامه لأي شرط، من خلال الجمع بين WebDriverWait و ExpectedCondition.
- أفضل طريقة هي التحقق من الشرط كل ثانية والانتقال إلى الأمر التالي بمجرد تحقيقه.
لكن المشكلة في كل هذه الانتظارات هي أنه عليك أن تذكر وحدة المهلة. ماذا لو كان العنصر لا يزال غير موجود خلال الوقت؟ لذلك هناك انتظار آخر يسمى الانتظار بطلاقة.
الانتظار بطلاقة
- هذا تطبيق لواجهة الانتظار (Wait) مع مهلة زمنية وفترة استطلاع خاصة بها. يحدد كل مثيل من FluentWait الحد الأقصى للوقت الذي ينتظره الشرط وعدد مرات التحقق منه.
تحديات في التعامل مع استدعاءات AJAX Selenium ويب درايفر
- استخدام أمر "الإيقاف المؤقت" غير موثوق. فالإيقاف المؤقت الطويل يجعل الاختبار بطيئًا بشكل غير مقبول ويزيد من وقت الانتظار. الاختبار لذلك تم التوصية باستخدام "waitforcondition" لتطبيقات AJAX بدلاً من ذلك.
- من الصعب تقييم المخاطر المرتبطة بتطبيقات AJAX معينة
- إن منح المطورين حرية كاملة لتعديل تطبيق AJAX يجعل عملية الاختبار صعبة.
- قد يكون إنشاء طلب اختبار آلي أمرًا صعبًا بالنسبة لأدوات الاختبار، لأن تطبيقات AJAX غالبًا ما تستخدم تقنية ترميز أو تسلسل مختلفة لإرسال بيانات POST.
ملاحظة: "التوقف المؤقت" و "انتظار الشرط" هما السيلينيين تمت إزالة الأوامر في Selenium 3؛ المكافئ في WebDriver هو انتظار صريح.
Code مثال على معالجة AJAX باستخدام Selenium ويب درايفر
استخدم TestNG تقوم الفئة أدناه بقراءة النص، والنقر على زر الاختيار، وانتظار استجابة AJAX، والتأكد من أن النص قد تغير.
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(); } }
ملاحظة: on Selenium 4 مرور المدة بالثواني (5) إلى WebDriverWait وحذف سطر System.setProperty، لأن Selenium يقوم المدير بحل مشكلة برنامج تشغيل Chrome.

