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

Selenium Java مثال
باستخدام Java فئة "myclass" التي أنشأناها في البرنامج التعليمي السابق، فلنحاول إنشاء برنامج نصي WebDriver من شأنه:
الخطوة 1 : جلب Mercury الصفحة الرئيسية للجولات
الخطوة 2 : التحقق من عنوانها
الخطوة 3 : طباعة نتيجة المقارنة
الخطوة 4 : أغلقه قبل إنهاء البرنامج بأكمله.
Selenium نموذج WebDriver Code
يوجد أدناه رمز WebDriver الفعلي للمنطق الذي قدمه السيناريو أعلاه
package newproject; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; //comment the above line and uncomment below line to use Chrome //import org.openqa.selenium.chrome.ChromeDriver; public class PG1 { public static void main(String[] args) { // declaration and instantiation of objects/variables System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); //comment the above 2 lines and uncomment below 2 lines to use Chrome //System.setProperty("webdriver.chrome.">driver","G:\\chromedriver.exe"); //WebDriver driver = new ChromeDriver(); String baseUrl = "https://demo.guru99.com/test/newtours/"; String expectedTitle = "Welcome: Mercury Tours"; String actualTitle = ""; // launch Fire fox and direct it to the Base URL driver.get(baseUrl); // get the actual value of the title actualTitle = driver.getTitle(); /* * compare the actual title of the page with the expected one and print * the result as "Passed" or "Failed" */ if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); } //close Fire fox driver.close(); } }
ملاحظة: البدء Firefox 35، تحتاج إلى استخدام برنامج تشغيل gecko الذي أنشأته Mozilla لاستخدام Web Driver. Selenium 3.0، يواجه gecko وfirefox مشكلات في التوافق، وقد يصبح ضبطهما بشكل صحيح مهمة شاقة. إذا لم يعمل الكود، فقم بالترقية إلى Firefox الإصدار 47 أو أقل. وبدلاً من ذلك، يمكنك تشغيل البرامج النصية الخاصة بك على Chrome. Selenium يعمل البرنامج النصي الخاص بك مع Chrome. ما عليك سوى تغيير 3 أسطر من التعليمات البرمجية لجعل البرنامج النصي الخاص بك يعمل مع Chrome أو Firefox
شرح الكود
استيراد الحزم
للبدء، تحتاج إلى استيراد الحزمتين التاليتين:
- org.openqa.selenium.*- يحتوي على فئة WebDriver اللازمة لإنشاء متصفح جديد محمّل ببرنامج تشغيل محدد
- org.openqa.selenium.firefox.Firefoxسائق - يحتوي على Firefoxفئة برنامج التشغيل اللازمة لإنشاء مثيل لـ a Firefox- برنامج تشغيل محدد على المتصفح الذي تم إنشاء مثيل له بواسطة فئة WebDriver
إذا كان اختبارك يحتاج إلى إجراءات أكثر تعقيدًا مثل الوصول إلى فصل دراسي آخر، أو التقاط لقطات شاشة للمتصفح، أو معالجة الملفات الخارجية، فستحتاج بالتأكيد إلى استيراد المزيد من الحزم.
إنشاء مثيل للكائنات والمتغيرات
عادةً، هذه هي الطريقة التي يتم بها إنشاء كائن برنامج التشغيل.
WebDriver driver = new FirefoxDriver();
A Firefoxفئة برنامج التشغيل بدون معلمات تعني أن الإعداد الافتراضي Firefox سيتم إطلاق الملف الشخصي من قبلنا Java برنامج. الافتراضي Firefox الملف الشخصي مشابه للإطلاق Firefox في الوضع الآمن (لا يتم تحميل أي ملحقات).
ولتسهيل الأمر، قمنا بحفظ القاعدة URL والعنوان المتوقع كمتغيرات.
إطلاق جلسة المتصفح
WebDriver's احصل على() تُستخدم هذه الطريقة لبدء جلسة متصفح جديدة وتوجيهها إلى URL التي تحددها كمعامل لها.
driver.get(baseUrl);
احصل على عنوان الصفحة الفعلي
تحتوي فئة WebDriver على getTitle () الطريقة المستخدمة دائمًا للحصول على عنوان الصفحة المحملة حاليًا.
actualTitle = driver.getTitle();
قارن بين القيم المتوقعة والفعلية
يستخدم هذا الجزء من الكود ببساطة قاعدة أساسية Java هيكل if-else لمقارنة العنوان الفعلي بالعنوان المتوقع.
if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); }
إنهاء جلسة المتصفح
في "أغلق()يتم استخدام الطريقة لإغلاق نافذة المتصفح.
driver.close();
إنهاء البرنامج بأكمله
إذا استخدمت هذا الأمر دون إغلاق جميع نوافذ المتصفح أولاً، فسيتم إغلاق جميع نوافذ المتصفح. Java سينتهي البرنامج أثناء ترك نافذة المتصفح مفتوحة.
System.exit(0);
إجراء الاختبار
هناك طريقتان لتنفيذ التعليمات البرمجية Eclipse IDE
- On Eclipseفي شريط القوائم، انقر فوق تشغيل > تشغيل.
- الإعلام CTRL + F11 لتشغيل الكود بأكمله.
إذا فعلت كل شيء بشكل صحيح ، Eclipse سيخرج "تم الاختبار بنجاح!"
تحديد موقع عناصر واجهة المستخدم الرسومية
يتم تحديد موقع العناصر في WebDriver باستخدام "العثور على العنصر (بواسطة.لتحديد المواقع())" طريقة. جزء "محدد المواقع" من الكود هو نفسه أي من محددات المواقع التي تمت مناقشتها مسبقًا في Selenium IDE فصول هذه الدروس. في الواقع، يوصى بتحديد موقع عناصر واجهة المستخدم الرسومية باستخدام IDE وبمجرد تحديدها بنجاح، قم بتصدير الكود إلى WebDriver.
نقدم لك هذه الخدمة Selenium نموذج برمجي يحدد موقع عنصر باستخدام معرّفه. يُستخدم فيسبوك كقاعدة بيانات. URL.
package newproject; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG2 { public static void main(String[] args) { System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); String baseUrl = "http://www.facebook.com"; String tagName = ""; driver.get(baseUrl); tagName = driver.findElement(By.id("email")).getTagName(); System.out.println(tagName); driver.close(); System.exit(0); } }
استخدمنا getTagName() طريقة لـtract اسم الوسم الخاص بالعنصر المحدد الذي يحمل المعرّف "email". عند تشغيل هذا الكود، يجب أن يكون قادرًا على تحديد اسم الوسم "input" بشكل صحيح وطباعته على Eclipseنافذة وحدة التحكم.
ملخص لتحديد العناصر
| الاختلافات / التنوعات | الوصف | عينة |
|---|---|---|
| بواسطة.اسم الفئة | يبحث عن العناصر بناءً على قيمة السمة "الفئة". | findElement(By.className("someClassName")) |
| بواسطة.cssSelector | يعثر على العناصر بناءً على محرك CSS Selector الأساسي لبرنامج التشغيل | ابحث عن العنصر (By.cssSelector ("إدخال#البريد الإلكتروني")) |
| بواسطة.id | يحدد موقع العناصر حسب قيمة السمة "id" الخاصة بها |
findElement(By.id("someId")) |
| بواسطة.linkText | يعثر على عنصر الارتباط بالنص الدقيق الذي يعرضه |
findElement(By.linkText("التسجيل")) |
| بالاسم | يحدد موقع العناصر حسب قيمة السمة "الاسم". |
findElement(By.name("someName")) |
| بواسطة.partialLinkText | يحدد موقع العناصر التي تحتوي على نص الرابط المحدد |
findElement(By.partialLinkText("REG")) |
| بواسطة.tagName | يحدد موقع العناصر حسب اسم العلامة الخاصة بها |
findElement(By.tagName("div")) |
| بواسطة.xpath | يحدد موقع العناصر عبر XPath |
findElement(By.xpath(“//html/body/div/table/tbody/tr/td[2]/table/ tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[3]/ form/table/tbody/tr[5]”)) |
ملاحظة حول استخدام findElement(By.cssSelector())
By.cssSelector() لا يدعم ميزة "يحتوي على". النظر في Selenium رمز IDE أدناه -
In Selenium IDE أعلاه، نجح الاختبار بأكمله. ومع ذلك في Selenium WebDriver أدناه، أدى نفس الاختبار إلى حدوث خطأ لأن WebDriver لا يدعم الكلمة الأساسية "يحتوي على" عند استخدامها في أسلوب By.cssSelector().
أوامر مشتركة
إنشاء مثيل لعناصر الويب
بدلاً من استخدام صيغة "driver.findElement(By.locator())" الطويلة في كل مرة تقوم فيها بالوصول إلى عنصر معين، يمكننا إنشاء كائن WebElement له. توجد فئة WebElement في الحزمة "org.openqa.selenium.*".
النقر على عنصر
ربما يكون النقر هو الطريقة الأكثر شيوعًا للتفاعل مع عناصر الويب. ال click() يتم استخدام الطريقة لمحاكاة النقر على أي عنصر. فيما يلي Selenium Java المثال يوضح كيف click() تم استخدامه للنقر على Mercury زر "تسجيل الدخول" الخاص بالجولات.
يجب ملاحظة الأمور التالية عند استخدام طريقة click()
- لا يأخذ أي معلمة/وسيطة.
- تنتظر الطريقة تلقائيًا تحميل صفحة جديدة إن أمكن.
- يجب أن يكون العنصر المراد النقر عليه مرئيًا (يجب ألا يساوي الارتفاع والعرض الصفر).
الحصول على الأوامر
احصل على أوامر لجلب معلومات مهمة متنوعة حول الصفحة/العنصر. فيما يلي بعض أوامر "الحصول على" المهمة التي يجب أن تكون على دراية بها.
| أوامر | الأستعمال |
|---|---|
| احصل على()
استخدام العينة: |
|
| getTitle ()
استخدام العينة: |
|
| getPageSource ()
استخدام العينة: |
|
| getCurrentUrl ()
استخدام العينة: |
|
| الحصول على النص()
استخدام العينة: |
|
التنقل في الأوامر
تسمح لك هذه الأوامر بالتحديث والدخول والتبديل بين صفحات الويب المختلفة.
| انتقل إلى()
استخدام العينة: |
|
| التنقل ().تحديث ()
استخدام العينة: |
|
| التنقل ().العودة ()
استخدام العينة: |
|
| التنقل ().إلى الأمام ()
استخدام العينة: |
|
إغلاق وإنهاء المتصفح Windows
| أغلق()
استخدام العينة: |
|
| استقال()
استخدام العينة: |
|
لتوضيح الفرق بين close() و quit()، حاول تنفيذ الكود أدناه. يستخدم صفحة ويب تنبثق تلقائيًا نافذة عند تحميل الصفحة وتفتح نافذة أخرى بعد الخروج.
لاحظ أنه تم إغلاق نافذة المتصفح الرئيسي فقط وليس النافذتين المنبثقتين.
ولكن إذا استخدمت quit()، فسيتم إغلاق جميع النوافذ - وليس فقط النافذة الرئيسية. حاول تشغيل الكود أدناه وستلاحظ أن النافذتين المنبثقتين أعلاه سيتم إغلاقهما تلقائيًا أيضًا.
package newproject; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG3 { public static void main(String[] args) { System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("http://www.popuptest.com/popuptest2.html"); driver.quit(); // using QUIT all windows will close } }
التبديل بين الإطارات
للوصول إلى عناصر واجهة المستخدم الرسومية في الإطار، يجب علينا أولاً توجيه WebDriver للتركيز على الإطار أو النافذة المنبثقة أولاً قبل أن نتمكن من الوصول إلى العناصر الموجودة بداخلها. لنأخذ، على سبيل المثال، صفحة الويب https://demo.guru99.com/selenium/deprecated.html
تحتوي هذه الصفحة على 3 إطارات تمت الإشارة إلى سمات "اسمها" أعلاه. نرغب في الوصول إلى الرابط "موقوف" المحاط بدائرة باللون الأصفر أعلاه. وللقيام بذلك، يجب علينا أولاً أن نطلب من WebDriver التبديل إلى إطار "classFrame" باستخدام الملف "التبديل إلى ().الإطار ()" طريقة. سوف نستخدم سمة اسم الإطار كمعلمة للجزء "frame()".
package newproject; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG4 { public static void main(String[] args) { System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("https://demo.guru99.com/selenium/deprecated.html"); driver.switchTo().frame("classFrame"); driver.findElement(By.linkText("Deprecated")).click(); driver.close(); } }
بعد تنفيذ هذا الكود، سترى أن إطار "classFrame" تم نقله إلى صفحة "Deprecated API"، مما يعني أن الكود الخاص بنا تمكن بنجاح من الوصول إلى الرابط "Deprecated".
التبديل بين النوافذ المنبثقة Windows
يتيح لك WebDriver عرض النوافذ المنبثقة مثل التنبيهات، على عكس Selenium بيئة تطوير متكاملة. للوصول إلى العناصر الموجودة في التنبيه (مثل الرسالة التي يحتوي عليها)، يجب علينا استخدام "switchTo().alert()" الطريقة. في الكود أدناه، سنستخدم هذه الطريقة للوصول إلى مربع التنبيه ثم استرداد رسالته باستخدام "getText()" الطريقة، ثم قم بإغلاق مربع التنبيه تلقائيًا باستخدام "switchTo().alert().accept()" الأسلوب.
أولاً، توجه إلى https://output.jsbin.com/usidix/1 وانقر يدويًا على "اذهب!" زر هناك وانظر بنفسك نص الرسالة.
دعونا نرى Selenium رمز المثال للقيام بذلك-
package mypackage; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class myclass { public static void main(String[] args) { System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); String alertMessage = ""; driver.get("http://jsbin.com/usidix/1"); driver.findElement(By.cssSelector("input[value=\"Go!\"]")).click(); alertMessage = driver.switchTo().alert().getText(); driver.switchTo().alert().accept(); System.out.println(alertMessage); driver.quit(); } }
على Eclipse وحدة التحكم، لاحظ أن رسالة التنبيه المطبوعة هي:
ينتظر
هناك نوعان من الانتظار.
- الانتظار الضمني – يُستخدم لتعيين وقت الانتظار الافتراضي خلال البرنامج
- الانتظار الصريح - يُستخدم لتعيين وقت الانتظار لمثيل معين فقط
الانتظار الضمني
- يعد البرمجة أسهل من الانتظار الصريح.
- يتم الإعلان عنه عادة في جزء إنشاء مثيل من التعليمات البرمجية.
- سوف تحتاج فقط إلى حزمة إضافية واحدة لاستيرادها.
للبدء في استخدام الانتظار الضمني، سيتعين عليك استيراد هذه الحزمة إلى التعليمات البرمجية الخاصة بك.
ثم في جزء إنشاء مثيل من التعليمات البرمجية الخاصة بك، قم بإضافة هذا.
الانتظار الصريح
تتم عمليات الانتظار الصريحة باستخدام فئتي WebDriverWait وExppectedCondition. لما يلي Selenium على سبيل المثال WebDriver، سننتظر ما يصل إلى 10 ثوانٍ حتى يصبح العنصر الذي معرفه هو "اسم المستخدم" مرئيًا قبل المتابعة إلى الأمر التالي. وهنا الخطوات.
الخطوة 1 :
قم باستيراد هاتين الحزمتين:
الخطوة 2 :
قم بتعريف متغير WebDriverWait. في هذا المثال، سوف نستخدم "myWaitVar" كاسم للمتغير.
الخطوة 3 :
استخدم myWaitVar مع ExpectedConditions على الأجزاء التي تحتاج إلى الانتظار الصريح لحدوثها. في هذه الحالة، سوف نستخدم الانتظار الصريح على "اسم المستخدم" (Mercury Tours HomePage) أدخل قبل أن نكتب النص "البرنامج التعليمي" عليه.
الشروط
تُستخدم الطرق التالية في العبارات الشرطية و...ping العمليات —
- ممكّن () يتم استخدامه عندما تريد التحقق مما إذا كان عنصر معين ممكّنًا أم لا قبل تنفيذ الأمر.
- يتم عرضه يتم استخدامه عندما تريد التحقق من عرض عنصر معين أم لا قبل تنفيذ أمر ما.
- تم الإختيار() يتم استخدامه عندما تريد التحقق مما إذا كان معينًا مربع الاختيار أو زر الاختيار أو الخيار في مربع القائمة المنسدلة تم الإختيار. ولا يعمل على العناصر الأخرى.
باستخدام الشروط المتوقعة
توفر فئة ExpectedConditions مجموعة واسعة من الشروط التي يمكنك استخدامها مع طريقة WebDriverWait until().
فيما يلي بعض الطرق المتوقعة الأكثر شيوعًا.
- تنبيهIsPresent() - ينتظر حتى يتم عرض مربع التنبيه.
- elementToBeClickable() - ينتظر حتى يصبح العنصر مرئيًا ويتم تمكينه في نفس الوقت. العينة Selenium Code سينتظر الكود أدناه حتى يصبح العنصر الذي يحمل المعرف "username" مرئيًا ومفعلاً أولاً قبل تعيين هذا العنصر كمتغير WebElement باسم "txtUserName".
- FrameToBeAvailableAndSwitchToIt() - ينتظر حتى يصبح الإطار المحدد متاحًا بالفعل، ثم يتحول إليه تلقائيًا.
اصطياد الاستثناءات
عند استخدام isEnabled() وisDisplayed() وisSelected()، يفترض WebDriver أن العنصر موجود بالفعل على الصفحة. وإلا، فسوف يطرح خطأ NoSuchElementException. لتجنب ذلك، يجب علينا استخدام كتلة محاولة الالتقاط حتى لا يتم مقاطعة البرنامج.
WebElement txtbox_username = driver.findElement(By.id("username")); try{ if(txtbox_username.isEnabled()){ txtbox_username.sendKeys("tutorial"); } } catch(NoSuchElementException nsee){ System.out.println(nsee.toString()); }
إذا كنت تستخدم انتظارًا صريحًا، فإن نوع الاستثناء الذي يجب عليك التقاطه هو "TimeoutException".

.png)
.png)
.png)
.png)
.png)
.png)

.png)


.png)
.png)
.png)
.png)
.png)
.png)

.png)
.png)
.png)