هل يمكن للسيلينيوم تقييم جميع عناصر XPath؟

StackOverflow https://stackoverflow.com/questions/1405368

  •  05-07-2019
  •  | 
  •  

سؤال

هل من الممكن للسيلينيوم تقييم جميع العناصر التي قد تتطابق مع بعض XPath?

على سبيل المثال ، أود تقييم ما إذا كان الجميع مربعات الاختيار يتم فحصها مع //input[type='checkbox']-المشكلات هي أنني أحصل على عنصر واحد فقط.

هل كانت مفيدة؟

المحلول

يمكنك استخدام أمر getxpathcount لتحديد عدد عناصر المطابقة. يمكنك بعد ذلك حلقة من خلالها باستخدام زيادة لتحديد كل عنصر على حدة. من شأن مثال Java (testng/junit) التالي التحقق من أن جميع مربعات الاختيار في صفحة يتم التحقق منها:

int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue();
for (int i = 1; i < totalCheckboxes+1; i++) {
    assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]"));
}

نصائح أخرى

لقد جربت النهج أعلاه وكان السيلينيوم يرمي استثناءات أنه لم يتم العثور على العنصر.

مثال

xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2] 

مع

/descendant::input[@type='text'][1]
/descendant::input[@type='text'][2]

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

طريقة أفضل هي:

(/form/div/input[@type='text'])[1]
(/form/div/input[@type='text'])[2]

والتي ستعود النتيجة رقم 1 ، #2 إلخ. من تعبير XPath داخل الأقواس.

بالطبع يمكنك أيضا القيام به

(//input[@type='text'])[1]

هذا مفيد تمامًا حيث يستخدم السيلينيوم المباراة الأولى ولا يمكنه التعامل مع مجموعة النتائج ، وهو ما يعوده XPath عادة.

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

Dave Answer هو أفضل بديل لما تبحث عنه.

أحاول أن أفعل نفس الشيء بالضبط في السيلينيوم وحاولت استخدام مثال @Dave-Hunt ، لكنه طريقة غير صحيحة للعثور على عنصر فردي في مجموعة.

النظر في المثال التالي:

<form>
 <div>
  <input type="text" name="field1" />
 </div>
 <div>
  <input type="text" name="field2" />
 </div>
</form>

إذا كنت تستخدم تعبيرًا مثل:

//input[@type='text'][1]

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

ومع ذلك ، إذا كنت تستخدم تعبيرًا مثل:

/descendant::input[@type='text'][1]

أو

/descendant::input[@type='text'][2]

سيحصل التعبير الأول على الإدخال الأول وسيحصل التعبير الثاني على الإدخال الثاني. من المهم جدًا أن تستخدم "/" وليس مزدوجًا "//".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top