كيفية التعامل مع مكالمات AJAX Selenium برنامج تشغيل الويب
ما هو اياكس؟
اياكس يعني غير متزامن Javaالنصوص البرمجية وXML، ويسمح لصفحة الويب باسترداد كميات صغيرة من البيانات من الخادم دون إعادة تحميل الصفحة بأكملها.
Ajax هي تقنية تستخدم لإنشاء صفحات ويب سريعة وديناميكية. هذه التقنية غير متزامنة وتستخدم مزيجًا من Javascript وXML. سيقوم بتحديث جزء/أجزاء من صفحة الويب دون إعادة تحميل الصفحة بأكملها. بعض التطبيقات الشهيرة التي تستخدم تقنية AJAX هي Gmail وGoogle Maps وFacebook وYoutube وما إلى ذلك.
كيف يعمل اياكس؟
على سبيل المثال، عند النقر على زر إرسال، Javaسيناريو سيقوم بتقديم طلب إلى الخادم، وتفسير النتيجة وتحديث الشاشة الحالية دون إعادة تحميل صفحة الويب.
- استدعاء Ajax هو طلب غير متزامن يبدأه المتصفح ولا يؤدي بشكل مباشر إلى انتقال الصفحة. هذا يعني أنه إذا قمت بتشغيل طلب Ajax، فسيظل المستخدم قادرًا على العمل على التطبيق أثناء انتظار الطلب للاستجابة.
- يرسل AJAX طلبات HTTP من العميل إلى الخادم ثم يعالج استجابة الخادم، دون إعادة تحميل الصفحة بأكملها. لذا، عندما تقوم بإجراء مكالمة AJAX، فإنك لست متأكدًا تمامًا من الوقت الذي يستغرقه الخادم لإرسال الرد إليك.
من وجهة نظر المختبر، إذا كنت تقوم بفحص المحتوى أو العنصر المراد عرضه، فأنت بحاجة إلى الانتظار حتى تحصل على الاستجابة. أثناء استدعاء AJAX، يتم تخزين البيانات بتنسيق XML واسترجاعها من الخادم.
كيفية التعامل مع مكالمات أجاكس Selenium برنامج تشغيل الويب
تشير التحدي الأكبر في التعامل مع استدعاء Ajax هو معرفة وقت تحميل صفحة الويب. نظرًا لأن تحميل صفحة الويب لن يستمر إلا لجزء من الثواني، فمن الصعب على القائم بالاختبار اختبار مثل هذا التطبيق من خلال أداة التشغيل الآلي. من أجل هذا، Selenium يتعين على Webdriver استخدام طريقة الانتظار في مكالمة Ajax هذه.
لذا، من خلال تنفيذ أمر الانتظار هذا، سيقوم السيلينيوم بتعليق تنفيذ الأمر الحالي حالة الاختبار وانتظر القيمة المتوقعة أو الجديدة. عندما تظهر القيمة أو الحقل الجديد، سيتم تنفيذ حالات الاختبار المعلقة بواسطة Selenium برنامج تشغيل الويب.
فيما يلي طرق الانتظار التي Selenium يمكن استخدام برنامج تشغيل الويب
الموضوع.السكون ()
- لا يعد خيار Thread.Sleep() خيارًا حكيمًا لأنه يقوم بتعليق الخيط الحالي لمدة زمنية محددة.
- في AJAX، لا يمكنك أبدًا التأكد من وقت الانتظار الدقيق. لذلك، سيفشل الاختبار إذا لم يظهر العنصر خلال وقت الانتظار. علاوة على ذلك، فإنه يزيد الحمل لأن استدعاء Thread.sleep(t) يجعل مؤشر الترابط الحالي يتم نقله من قائمة الانتظار قيد التشغيل إلى قائمة انتظار الانتظار.
- بعد الوصول إلى الوقت "t"، سينتقل الخيط الحالي من قائمة الانتظار إلى قائمة الانتظار الجاهزة، ثم يستغرق الأمر بعض الوقت حتى يتم التقاطه بواسطة وحدة المعالجة المركزية وتشغيله.
الانتظار الضمني ()
- تخبر هذه الطريقة برنامج تشغيل الويب بالانتظار إذا لم يكن العنصر متاحًا على الفور، ولكن هذا الانتظار سيظل قائمًا طوال الوقت الذي يكون فيه المتصفح مفتوحًا. لذا فإن أي بحث عن العناصر الموجودة في الصفحة قد يستغرق الوقت المحدد للانتظار الضمني.
الانتظار الصريح ()
- الانتظار الصريح يتم استخدامه لتجميد تنفيذ الاختبار حتى يتم استيفاء شرط معين أو انقضاء الحد الأقصى للوقت.
WebdriverWait
- ويمكن استخدامه لأية شروط. يمكن تحقيق ذلك باستخدام WebDriverWait بالاشتراك مع ExpectedCondition
- أفضل طريقة لانتظار عنصر ديناميكيًا هي التحقق من الشرط كل ثانية والاستمرار في الأمر التالي في البرنامج النصي بمجرد استيفاء الشرط.
لكن المشكلة في كل هذه الانتظارات هي أنه عليك أن تذكر وحدة المهلة. ماذا لو كان العنصر لا يزال غير موجود خلال الوقت؟ لذلك هناك انتظار آخر يسمى الانتظار بطلاقة.
الانتظار بطلاقة
- هذا هو تطبيق لواجهة الانتظار التي لها مهلة وفاصل زمني للاستقصاء. تحدد كل نسخة من مثيلات FluentWait الحد الأقصى من الوقت لانتظار حالة ما، بالإضافة إلى عدد مرات التحقق من الحالة.
التحديات في التعامل مع مكالمة Ajax Selenium برنامج تشغيل الويب
- إن استخدام أمر "الإيقاف المؤقت" للتعامل مع مكالمات Ajax ليس موثوقًا تمامًا. وقت التوقف الطويل يجعل الاختبار بطيئًا بشكل غير مقبول ويزيد من سرعة الاختبار الاختبار وقت. بدلًا من ذلك، سيكون الأمر "waitforcondition" أكثر فائدة في اختبار تطبيقات Ajax.
- من الصعب تقييم المخاطر المرتبطة بتطبيقات Ajax معينة
- إن منح الحرية الكاملة للمطورين لتعديل تطبيق Ajax يجعل عملية الاختبار صعبة
- قد يكون إنشاء طلب اختبار آلي أمرًا صعبًا بالنسبة لأدوات الاختبار لأن تطبيق AJAX غالبًا ما يستخدم تقنية تشفير أو تسلسل مختلفة لإرسال بيانات POST.
مثال على التعليمات البرمجية للتعامل مع Ajax باستخدام 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، يجب تطبيق طرق انتظار مختلفة
- ThreadSleep
- الانتظار الضمني
- الانتظار الصريح
- WebdriverWait
- الانتظار بطلاقة
- قد يكون إنشاء طلب اختبار آلي أمرًا صعبًا بالنسبة لأدوات الاختبار لأن تطبيق AJAX غالبًا ما يستخدم تقنية تشفير أو تسلسل مختلفة لإرسال بيانات POST.