تحديث الصفحة باستخدام Selenium برنامج تشغيل الويب

⚡ ملخص ذكي

تحديث الصفحة في Selenium يقوم WebDriver بإعادة تحميل الوضع الحالي URL بحيث يتم عرض كل عنصر قبل تشغيل التأكيدات، ويقدم الإطار خمسة أوامر مميزة تحقق نفس إعادة التحميل بطرق مختلفة.

  • 🔘 الخيار الافتراضي: driver.navigate().refresh() هي عملية إعادة التحميل المدمجة ولا تأخذ أي وسيطات ولا تُرجع أي قيمة.
  • ☑️ المتغيرات المتكررة: يؤدي تمرير getCurrentUrl() إلى get() أو navigate().to() إلى إعادة تحميل نفس العنوان.
  • مسار لوحة المفاتيح: تقبل الدالة sendKeys القيمة Keys.F5 أو قيمة Unicode \uE035، ولكن يجب أن تستهدف عنصرًا حقيقيًا.
  • 🧪 مسار البرنامج النصي: Javascriptيعمل المنفذ الذي يقوم بتشغيل location.reload() عندما يتم حظر أمر WebDriver.
  • 🛠️ بعد إعادة التحميل: كل مرجع عنصر تم التقاطه سابقاً يصبح قديماً ويجب تحديد موقعه مرة أخرى.
  • 📊 تصميم عصري: Selenium تم إدخال المدير في الإصدار 4.6، لذلك لم يعد من الضروري تعيين مسار برنامج التشغيل يدويًا.

قم بتحديث الصفحة باستخدام Selenium أوامر WebDriver

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

كيفية تحديث الصفحة في Selenium

يمكن إجراء عملية تحديث المتصفح باستخدام الطرق التالية Selenium. وسوف نناقش الطرق المذكورة أدناه بالتفصيل طوال المقال.

  1. أمر driver.navigate().refresh()
  2. طريقة إضافية
  3. أمر إرسال المفاتيح
  4. طريقة التنقل
  5. الأمر driver.navigate().to()

1) أمر driver.navigate().refresh()

هذه هي الطريقة المدمجة لتنفيذ عملية تحديث الصفحة التي يوفرها Selenium WebDriver. يُعد هذا الأمر الأكثر استخدامًا في أتمتة الاختبارات لتحديث الصفحة. ويمكن استخدام أمر التحديث بطريقة بسيطة كما هو موضح أدناه.

driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();

تُعدّ واجهة التنقل أداةً تُستخدم لتنفيذ عملياتٍ مختلفة في المتصفح، مثل الانتقال إلى الصفحة السابقة، والانتقال إلى الصفحة التالية، وتحديث الصفحة، وإغلاق المتصفح. ويمكن الوصول إلى وظائف واجهة التنقل باستخدام الأمر driver.navigate(). ولا تأخذ وظيفة التحديث (refresh) في واجهة التنقل أيّ وسيطات، ولا تُرجع أيّ قيمة.

على سبيل المثال:

سيناريو الاختبار:

  1. افتح متصفح كروم الذي يعرض صفحة الويب https://demo.guru99.com/selenium/guru99home/
  2. بمجرد تحميل الصفحة بنجاح، قم بتحديث صفحة الويب باستخدام طريقة driver.navigate().refresh()
  3. أغلق المتصفح باستخدام الدالة driver.close()

Code

package Guru99Demo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class RefreshDemo {
public static void main(String args[]) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.manage().window().maximize();
driver.navigate().refresh();
driver.close();
}
}

⚠️ ملاحظة حول الإصدار: Selenium تم شحن المدير مع Selenium 4.6 ويقوم بتنزيل برنامج تشغيل المتصفح المتوافق تلقائيًا، لذا لم يعد سطر System.setProperty المذكور أعلاه مطلوبًا في الإصدار الحالي. new ChromeDriver() يكفي. تم الاحتفاظ بالسطر الأصلي لأنه لا يزال صحيحًا بالنسبة لـ Selenium تم كتابة المثال وفقًا لنمط الإعداد 3.

Code الإخراج:

عند تحميل الصفحة الأولى، يتم عرض الصفحة الرئيسية التجريبية كما هو موضح أدناه.

Guruالصفحة الرئيسية التجريبية رقم 99 عند التحميل الأولي قبل تشغيل أمر التحديث

بعد عملية تحديث الصفحة، تغير الفيديو الموجود على الصفحة، مما يؤكد حدوث عملية إعادة التحميل بالفعل.

Guruالصفحة الرئيسية التجريبية رقم 99 بعد تحديث الصفحة باستخدام driver.navigate().refresh() تعرض فيديو مختلفًا

طرق أخرى متعددة لتحديث الصفحة

لا تُعدّ طريقة التحديث الطريقة الوحيدة لإعادة تحميل الصفحة. فالتقنيات الأربع التالية تُعطي النتيجة نفسها، ومن المفيد معرفتها، لأنّ تطبيقًا مُقيّدًا أو متصفحًا عنيدًا قد يمنع إحداها أحيانًا.

2) طريقة الحصول على

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

على سبيل المثال:

driver.get("https://www.guru99.com");
driver.get(driver.getCurrentUrl());

3) طريقة التنقل

تستخدم هذه الطريقة نفس مفهوم الاستدعاء الذاتي المذكور أعلاه. يتم تمرير دالة getCurrentUrl() كوسيط إلى دالة driver.navigate().to().

على سبيل المثال:

driver.get("https://www.guru99.com");
driver.navigate().to(driver.getCurrentUrl());

4) طريقة إرسال المفاتيح باستخدام مفتاح F5

هذه هي الطريقة الثانية الأكثر استخدامًا لتحديث الصفحة Seleniumتأخذ هذه الدالة مفتاح التحديث (F5) كوسيط لدالة sendKeys. ولأن دالة sendKeys تعمل فقط على عناصر الويب وليس على المتصفح، يجب علينا أولاً تحديد عنصر ويب صالح على صفحة الويب ثم استخدام دالة sendKeys. ويمكن تحقيق ذلك كما هو موضح أدناه.

على سبيل المثال:

driver.get("https://www.guru99.com");
driver.findElement(By.id("username")).sendKeys(Keys.F5);

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

5) طريقة إرسال المفاتيح باستخدام ASCII Code

تستخدم هذه الطريقة نفس المفهوم المذكور أعلاه، ولكن بدلاً من تمرير مفتاح F5 كوسيط، نرسل رمز مفتاح التحديث كوسيط. ويمكن تحقيق ذلك كما هو موضح أدناه.

driver.get("https://www.guru99.com");
driver.findElement(By.id("username")).sendKeys("\uE035");

القيمة \uE035 هي نقطة رمز Unicode الخاصة بـ WebDriver التي يطابقها البروتوكول مع F5، لذا فإن هذا المقتطف والمقتطف السابق متكافئان.

كيفية تحديث الصفحة باستخدام JavaScriptExecutor

يُتيح كل متصفح وظيفة إعادة تحميل لبرامج الصفحات النصية، و Selenium يمكن الاتصال به من خلال Javascriptواجهة المُنفِّذ. هذا هو الخيار الاحتياطي المعتاد عندما يتم اعتراض أمر تحديث WebDriver بواسطة التطبيق أو بواسطة إضافة المتصفح.

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("location.reload();");

هناك نوعان جديران بالتذكر:

  1. location.reload() يقوم بإعادة تحميل الصفحة بشكل طبيعي وقد يعرضها من ذاكرة التخزين المؤقت.
  2. history.go(0) وهو مكافئ أقدم لا تزال بعض البرامج القديمة تستخدمه.

يتم تنفيذ المسار داخل الصفحة، لذا فهو لا ينتظر المستند الجديد تلقائيًا. اتبعه بانتظار صريح تمامًا كما تفعل بعد استدعاء driver.navigate().refresh()، وتذكر أن إعادة التحميل بواسطة البرنامج النصي لن تمسح مربع حوار المتصفح. إذا كان التطبيق قيد الاختبار يُحمّل محتواه بشكل غير متزامن، ينطبق عليه نفس الحذر كما في الحالة السابقة. معالجة استدعاءات AJAX في Selenium ويب درايفر.

كيفية تجنب استثناء StaleElementReferenceException بعد التحديث

يؤدي تحديث الصفحة إلى تدمير نموذج كائن المستند الحالي (DOM) وإنشاء نموذج جديد. تشير جميع عناصر الويب التي تم التقاطها قبل إعادة التحميل الآن إلى عقدة لم تعد موجودة، لذا فإن الاستدعاء التالي لها يُطلق استثناء StaleElementReferenceException. هذا هو الخطأ الأكثر شيوعًا الذي يلي تحديث الصفحة.

ثلاث عادات تقضي على معظم هذه الإخفاقات:

  1. حدد الموقع بعد ذلك، وليس قبله. قم بتخزين محدد الموقع By بدلاً من WebElement، واستدعِ findElement مرة أخرى بمجرد انتهاء إعادة التحميل.
  2. انتظر إشارة حقيقية. إن الانتظار الصريح بشأن ظهور عنصر لا يوجد إلا بعد إعادة التحميل أكثر موثوقية بكثير من الانتظار الثابت.
  3. قم بتحديث الصفحة، ثم أعد القراءة. لا تقم أبدًا بنقل قيمة نصية أو سمة تم التقاطها قبل إعادة التحميل إلى تأكيد يتم إجراؤه بعد ذلك.

ينطبق النمط أدناه على الثلاثة جميعها:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
driver.navigate().refresh();
WebElement search = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("username")));
search.sendKeys("guru99");

يستغرق WebDriverWait مدة زمنية محددة. Selenium 4، وهو تغيير عن مُنشئ الثواني الصحيحة المستخدم في Selenium 3. تُغطى التقنيات الأوسع نطاقًا لهذه الإخفاقات في دليلنا الخاص بـ معالجة الاستثناءات في Selenium.

مقارنة بين Selenium طرق تحديث الصفحة

جميع الأوامر الستة تعيد تحميل الصفحة، لكنها تختلف في ما تعتمد عليه وفي كيفية فشلها.

الأسلوب يعتمد على إعادة التحميل عبر عندما يكون هذا هو الخيار الصحيح
driver.navigate().refresh() لا شيء إضافي أمر إعادة تحميل المتصفح في أغلب الأحيان — الوضع الافتراضي
driver.get(driver.getCurrentUrl()) تيار قابل للقراءة URL نظام ملاحة جديد عندما تريد أيضًا حذف سجل التاريخ
driver.navigate().to(driver.getCurrentUrl()) تيار قابل للقراءة URL نظام ملاحة جديد كما هو مذكور أعلاه، مكتوب من خلال واجهة التنقل
sendKeys(Keys.F5) عنصر قابل للتركيز ضغطة مفتاح عندما تقوم باختبار مسار لوحة المفاتيح عن قصد
sendKeys(“\uE035”) عنصر قابل للتركيز ضغطة مفتاح مطابق لـ F5، مكتوب كنقطة رمزية
Javascriptإعادة تحميل موقع المنفذ() تم تفعيل البرمجة النصية نص الصفحة عندما يتم حظر أمر WebDriver

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

الأسئلة الشائعة

نعم، يمكن ذلك. إذا تم إنشاء الصفحة الحالية بواسطة طلب POST، فقد يطلب المتصفح إعادة إرسال البيانات، وتتوقف عملية إعادة التحميل خلف نافذة الحوار هذه. الانتقال إلى URL استخدام الدالة get() مرة أخرى يتجنب ظهور المطالبة تمامًا.

تختلف أسماء الربط، لكن الأمر واحد: driver.refresh() in Python، driver.Navigate().Refresh() في لغة C# و driver.navigate().refresh() في Javaجميعها الثلاثة تصدر نفس تعليمات WebDriver.

لا. إعادة تحميل الصفحة تُبقي ملفات تعريف الارتباط، وبيانات الجلسة، والبيانات المخزنة محليًا لنفس المصدر، ولذلك فإن تحديث الصفحة ليس طريقة فعّالة لإعادة ضبط الحالة. احذف ملفات تعريف الارتباط صراحةً أو ابدأ جلسة تصفح جديدة.

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

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

لا يوجد أمر مخصص لذلك. تقوم الفرق بتقريب الأمر عن طريق إرسال مفتاحي Ctrl و F5 معًا من خلال فئة الإجراءات، أو عن طريق تعطيل ذاكرة التخزين المؤقت من خلال خيارات المتصفح، وهو المسار الأكثر موثوقية.

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

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

تلخيص هذه التدوينة بـ: