المواقع النسبية في السيلينيوم 4

تحية ، خابروفسك. تحسبًا لبدء دورة Java QA Engineer ، قمنا بإعداد ترجمة لمواد مثيرة للاهتمام لك.





المواقع النسبية


جلب لنا Selenium 4 محددات المواقع النسبية - محددات المواقع النسبية (التي كانت تسمى في الأصل مواقع محددة). تمت إضافة هذه الوظيفة لمساعدتك في العثور على العناصر المجاورة للعناصر الأخرى.

الخيارات المتاحة:

  • أعلاه () : عنصر البحث فوق العنصر المحدد
  • أدناه () : العنصر الذي تم البحث عنه أسفل العنصر المحدد
  • toLeftOf () : يقع عنصر البحث على يسار العنصر المحدد
  • toRightOf () : يقع عنصر البحث على يمين العنصر المحدد
  • near () : العنصر الذي تبحث عنه لا يزيد عن 50 بكسل من العنصر المحدد. هناك أيضًا طريقة مثقلة لتحديد المسافة.

يتم تحميل كل هذه الطرق بشكل زائد على قبول بواسطة أو WebElement.

باستخدام محدد المواقع النسبية


باستخدام تطبيق متجر الكتب هذا كمثال ، نريد التحقق من أن الكتاب الموجود على يسار السيلينيوم المتقدم في جافا هو Java For Testers. تسمح لنا المواقع النسبية بالقيام بذلك.


فيما يلي جزء DOM لكتب


"السيلينيوم المتقدم في جافا" ممثلة في DOM بالمعرف pid6 ، و "Java For Testers" بواسطة pid5.

وهناك طريقة WebDriver::findElementيمكن أن تتخذ طريقة withTagName()التي تقوم بإرجاع كائن RelativeLocator.RelativeBy(سليل بواسطة).

driver.findElement(withTagName("li")


هنا يمكنني بالفعل تحديد المواقع النسبية. أعلم أن "Java للمختبرين" على يسار "السيلينيوم المتقدم في Java" (pid6) وأقل من "Automation Test in the Real World" (pid1). لذا ، يمكنني أن أشير من كليهما:

driver.findElement(withTagName("li")
                .toLeftOf(By.id("pid6"))
                .below(By.id("pid1")));

وأحصل على Java للمختبرين (pid5).

@Test
public void test_book5_is_left_of_book6_and_below_book1(){
    String id = driver.findElement(withTagName("li")
            .toLeftOf(By.id("pid6"))
            .below(By.id("pid1")))
            .getAttribute("id");
 
    assertEquals(id, "pid5");
}

يمكننا استخدام above()و سائل toRightOf()لإيجاد تجارب أتمتة اختبار (pid2):

@Test
public void test_book2_is_above_book6_and_right_of_book1(){
    String id = driver.findElement(withTagName("li")
                    .above(By.id("pid6"))
                    .toRightOf(By.id("pid1")))
            .getAttribute("id");
 
    assertEquals(id, "pid2");
}

كيف تعمل؟


لم أتمكن من العثور على "Java For Testers " إلا من خلال الاتصال بـ LeftOf (By.id ("pid6")) . وحده ، سيعيد اختبار الأتمتة في العالم الحقيقي (pid1). هذا لأنه driver.findElement()يبحث من جذر DOM ، والعنصر الأول على <li>يسار السيلينيوم المتقدم في Java هو اختبار الأتمتة في العالم الحقيقي.

يستخدم السيلينيوم وظيفة JavaScript getBoundingClientRect()للبحث عن العناصر النسبية. تُرجع هذه الوظيفة خصائص العنصر ، مثل اليمين واليسار والأسفل والجزء العلوي.

بالنظر إلى خصائص هذه الكتب الثلاثة ، نرى أن كلا من اختبار الأتمتة في العالم الحقيقي (pid1) و Java For Testers (pid5) كلاهما لهما نفس موضع المحور السيني.



وبالتالي ، كلاهما على يسار Java For Testers ، مع أول اختبار تم اكتشافه في العالم الحقيقي (pid1)

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



لقد واجهت أيضًا مشكلة مع محدد المواقع الودود عندما حاولت استخدام لهم في هذا التطبيق تودو .



لقد حاولت استخدام الطريقة toLeftOf()للعثور على مفتاح الإدخال بجوار عنصر "وداعًا للعالم". بصريا ، يقع مفتاح الإدخال هذا على يسار تسمية "وداعا العالم". هنا هذا div في DOM:

<div class="view" data-reactid=".0.1.2.$645c3b67-884e-4e4f-aecd-8f9367e670f8.0">
    <input class="toggle" type="checkbox" data-reactid=".0.1.2.$645c3b67-884e-4e4f-aecd-8f9367e670f8.0.0">
    <label data-reactid=".0.1.2.$645c3b67-884e-4e4f-aecd-8f9367e670f8.0.1">goodbye world</label>
    <button class="destroy" data-reactid=".0.1.2.$645c3b67-884e-4e4f-aecd-8f9367e670f8.0.2"></button>
</div>

في ما يلي الرمز الذي استخدمته للعثور على عنصر الإدخال على يسار التصنيف:

driver.findElement(withTagName("input")
      .toLeftOf(By.xpath("//label[text()='goodbye world']")))
      .click();

ومع ذلك ، فقد واجهت استثناء: يبدو أنه على الرغم من أن هذا هو على يسار الصورة ، فإن هذا ليس هو الحال في الواقع. دعوت وظيفة لكل من هذه العناصر ، وهي في الواقع تتداخل. لاحظ أن كلاهما له موضع x 838 ، لذا من الناحية الفنية ليس إلى يسار . وعندما أحدد العنصر ، أرى الآن أنه يتداخل مع العنصر . <img src = " habrastorage.org/webt/hj/aa/46/hjaa46ps-of5_hhlplqaldclc7s.png " /

org.openqa.selenium.NoSuchElementException: Cannot locate an element using [unknown locator]

<input><label>getBoundingClientRect()<input><label>



<label><input>


ملاحظة : هذه نسخة ألفا من Selenium WebDriver. تحدثت مع مدير مشروع Selenium Simon Stewart ووجدت أن التنفيذ قد يتغير اعتمادًا على التعليقات.

هذا كل شئ. نراكم في الدورة !

All Articles