تحديث الصفحة باستخدام Selenium برنامج تشغيل الويب
⚡ ملخص ذكي
تحديث الصفحة في Selenium يقوم WebDriver بإعادة تحميل الوضع الحالي URL بحيث يتم عرض كل عنصر قبل تشغيل التأكيدات، ويقدم الإطار خمسة أوامر مميزة تحقق نفس إعادة التحميل بطرق مختلفة.
أثناء أتمتة اختبار تطبيق ويب، تبرز الحاجة إلى تحديث الصفحة عدة مرات لتحميل جميع عناصر الويب بالكامل. عند تحميل الصفحة لأول مرة، قد يتم تحميل بعض عناصر الويب، بينما يتطلب الأمر تحديثًا ثانيًا للصفحة حتى تظهر جميعها. يمكن القيام بذلك باستخدام أمر التحديث الذي توفره Selenium برنامج تشغيل الويب.
كيفية تحديث الصفحة في Selenium
يمكن إجراء عملية تحديث المتصفح باستخدام الطرق التالية Selenium. وسوف نناقش الطرق المذكورة أدناه بالتفصيل طوال المقال.
- أمر driver.navigate().refresh()
- طريقة إضافية
- أمر إرسال المفاتيح
- طريقة التنقل
- الأمر driver.navigate().to()
1) أمر driver.navigate().refresh()
هذه هي الطريقة المدمجة لتنفيذ عملية تحديث الصفحة التي يوفرها Selenium WebDriver. يُعد هذا الأمر الأكثر استخدامًا في أتمتة الاختبارات لتحديث الصفحة. ويمكن استخدام أمر التحديث بطريقة بسيطة كما هو موضح أدناه.
driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();
تُعدّ واجهة التنقل أداةً تُستخدم لتنفيذ عملياتٍ مختلفة في المتصفح، مثل الانتقال إلى الصفحة السابقة، والانتقال إلى الصفحة التالية، وتحديث الصفحة، وإغلاق المتصفح. ويمكن الوصول إلى وظائف واجهة التنقل باستخدام الأمر driver.navigate(). ولا تأخذ وظيفة التحديث (refresh) في واجهة التنقل أيّ وسيطات، ولا تُرجع أيّ قيمة.
على سبيل المثال:
سيناريو الاختبار:
- افتح متصفح كروم الذي يعرض صفحة الويب https://demo.guru99.com/selenium/guru99home/
- بمجرد تحميل الصفحة بنجاح، قم بتحديث صفحة الويب باستخدام طريقة driver.navigate().refresh()
- أغلق المتصفح باستخدام الدالة 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 الإخراج:
عند تحميل الصفحة الأولى، يتم عرض الصفحة الرئيسية التجريبية كما هو موضح أدناه.
بعد عملية تحديث الصفحة، تغير الفيديو الموجود على الصفحة، مما يؤكد حدوث عملية إعادة التحميل بالفعل.
طرق أخرى متعددة لتحديث الصفحة
لا تُعدّ طريقة التحديث الطريقة الوحيدة لإعادة تحميل الصفحة. فالتقنيات الأربع التالية تُعطي النتيجة نفسها، ومن المفيد معرفتها، لأنّ تطبيقًا مُقيّدًا أو متصفحًا عنيدًا قد يمنع إحداها أحيانًا.
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();");
هناك نوعان جديران بالتذكر:
- location.reload() يقوم بإعادة تحميل الصفحة بشكل طبيعي وقد يعرضها من ذاكرة التخزين المؤقت.
- history.go(0) وهو مكافئ أقدم لا تزال بعض البرامج القديمة تستخدمه.
يتم تنفيذ المسار داخل الصفحة، لذا فهو لا ينتظر المستند الجديد تلقائيًا. اتبعه بانتظار صريح تمامًا كما تفعل بعد استدعاء driver.navigate().refresh()، وتذكر أن إعادة التحميل بواسطة البرنامج النصي لن تمسح مربع حوار المتصفح. إذا كان التطبيق قيد الاختبار يُحمّل محتواه بشكل غير متزامن، ينطبق عليه نفس الحذر كما في الحالة السابقة. معالجة استدعاءات AJAX في Selenium ويب درايفر.
كيفية تجنب استثناء StaleElementReferenceException بعد التحديث
يؤدي تحديث الصفحة إلى تدمير نموذج كائن المستند الحالي (DOM) وإنشاء نموذج جديد. تشير جميع عناصر الويب التي تم التقاطها قبل إعادة التحميل الآن إلى عقدة لم تعد موجودة، لذا فإن الاستدعاء التالي لها يُطلق استثناء StaleElementReferenceException. هذا هو الخطأ الأكثر شيوعًا الذي يلي تحديث الصفحة.
ثلاث عادات تقضي على معظم هذه الإخفاقات:
- حدد الموقع بعد ذلك، وليس قبله. قم بتخزين محدد الموقع By بدلاً من WebElement، واستدعِ findElement مرة أخرى بمجرد انتهاء إعادة التحميل.
- انتظر إشارة حقيقية. إن الانتظار الصريح بشأن ظهور عنصر لا يوجد إلا بعد إعادة التحميل أكثر موثوقية بكثير من الانتظار الثابت.
- قم بتحديث الصفحة، ثم أعد القراءة. لا تقم أبدًا بنقل قيمة نصية أو سمة تم التقاطها قبل إعادة التحميل إلى تأكيد يتم إجراؤه بعد ذلك.
ينطبق النمط أدناه على الثلاثة جميعها:
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 الأصلي ويعتبر مسار البرنامج النصي بمثابة الخيار الاحتياطي.


