سؤال

أنا أستعمل مستعرض XPather للتحقق من تعبيرات XPath الخاصة بي على صفحة HTML.

هدفي النهائي هو استخدام هذه التعبيرات في السيلينيوم لاختبار واجهات المستخدم الخاصة بي.

حصلت على ملف HTML مع محتوى مشابه لهذا:

<tr>
  <td>abc</td>
  <td>&nbsp;</td>
</tr>

أريد تحديد عقدة بنص يحتوي على السلسلة "&nbsp;".

مع سلسلة عادية مثل "ABC" لا توجد مشكلة. يمكنني استخدام XPath مماثل //td[text()="abc"].

عندما أحاول مع xpath مثل //td[text()="&nbsp;"] لا يعيد شيئًا. هل هناك قاعدة خاصة فيما يتعلق بالنصوص "مع"&" ?

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

المحلول

يبدو أن Openqa, ، الرجال وراء السيلينيوم ، تناولوا هذه المشكلة بالفعل. حددوا بعض المتغيرات لمطابقة مساحات بيضاء. في حالتي ، أحتاج إلى استخدام XPath مماثل //td[text()="${nbsp}"].

لقد استنسخت هنا النص من OpenQa فيما يتعلق بهذه المشكلة (وجدت هنا):

تقوم HTML تلقائيًا بتطبيع المسافة البيضاء داخل العناصر ، وتجاهل المساحات الرائدة/المتخلف وتحويل المساحات الإضافية وعلامات التبويب والخطوط الجديدة إلى مساحة واحدة. عندما يقرأ السيلينيوم النص خارج الصفحة ، فإنه يحاول تكرار هذا السلوك ، بحيث يمكنك تجاهل جميع علامات التبويب والخطوط الجديدة في HTML الخاص بك وتؤكد بناءً على كيفية ظهور النص في المتصفح عند تقديمه. نحن نفعل ذلك من خلال استبدال جميع المساحة البيضاء غير المرئية (بما في ذلك المساحة غير المتقنة "&nbsp;") بمساحة واحدة. جميع الخطوط الجديدة المرئية (<br>, <p>, ، و <pre> يجب الحفاظ على خطوط جديدة منسقة).

نستخدم نفس منطق التطبيع على نص جداول حالة اختبار HTML Selenese. هذه لديها عدد من المزايا. أولاً ، لا تحتاج إلى إلقاء نظرة على مصدر HTML للصفحة لمعرفة ما يجب أن تكون عليه تأكيداتك ؛ "&nbsp;"الرموز غير مرئية للمستخدم النهائي ، وبالتالي لا يجب أن تقلق بشأنها عند كتابة اختبارات Selenese. (لا تحتاج إلى وضع"&nbsp;"علامات في حالة الاختبار الخاصة بك للتأكيد على حقل يحتوي على"&nbsp;".) يمكنك أيضًا وضع خطوط ومساحات إضافية في سيلينيك <td> العلامات نظرًا لأننا نستخدم نفس منطق التطبيع في حالة الاختبار كما نفعل على النص ، يمكننا التأكد من أن التأكيدات والنص المستخرج ستتطابق تمامًا.

هذا يخلق مشكلة في تلك المناسبات النادرة عندما تريد/تحتاج حقًا إلى إدراج مساحة بيضاء إضافية في حالة الاختبار. على سبيل المثال ، قد تحتاج إلى كتابة النص في حقل مثل هذا: "foo ". لكن إذا كنت تكتب ببساطة <td>foo </td> في حالة الاختبار السيليني ، سنستبدل مساحاتك الإضافية بمساحة واحدة فقط.

هذه المشكلة لها حل بديل بسيط. لقد حددنا متغيرًا في السيليني ، ${space}, ، والتي قيمتها هي مساحة واحدة. يمكنك استخدام ${space} لإدراج مساحة لن يتم قطعها تلقائيًا ، مثل هذا: <td>foo${space}${space}${space}</td>. لقد قمنا أيضًا بتضمين متغير ${nbsp}, ، يمكنك استخدامه لإدراج مساحة غير متجانسة.

لاحظ أن XPaths تفعل ليس تطبيع المسافة البيضاء بالطريقة التي نفعلها. إذا كنت بحاجة إلى كتابة XPath مثل //div[text()="hello world"] لكن HTML من الرابط هو حقا "hello&nbsp;world"، ستحتاج إلى إدراج حقيقي"&nbsp;"في حالة الاختبار السيلينية الخاصة بك للحصول على مطابقة ، مثل هذا: //div[text()="hello${nbsp}world"].

نصائح أخرى

لقد وجدت أنني أستطيع أن أجعل المطابقة عندما أقوم بإدخال مساحة غير مشفرة (U+00a0) عن طريق كتابة Alt+0160 على Windows بين اثنين من الاقتباس ...

//table[@id='TableID']//td[text()=' ']

عملت بالنسبة لي مع شار الخاص.

من ما فهمته ، لا يتعامل معيار XPath 1.0 الذي يلتزم بالهروب من Unicode. يبدو أن هناك وظائف لذلك في XPath 2.0 ، لكن يبدو أن Firefox لا يدعمها (أو أسيء فهم شيء ما). لذلك عليك أن تفعل مع codepage المحلية. قبيح ، وأنا أعلم.

في الواقع ، يبدو أن المعيار يعتمد على لغة البرمجة باستخدام XPath لتوفير تسلسل Enicode Escape الصحيح ... لذا ، لقد فعلت الشيء الصحيح بطريقة أو بأخرى.

حاول استخدام الكيان العشري &#160; بدلا من الكيان المسماة. إذا لم ينجح ذلك ، فيجب أن تكون قادرًا على استخدام ببساطة حرف Unicode لمساحة غير متجانسة بدلا من ال &nbsp; كيان.

(ملاحظة: لم أجرب هذا في Xpather ، لكنني جربته في الأكسجين.)

ضع في اعتبارك أن معالج XML المتوافق مع المعايير سيحل محل أي مراجع كيان بخلاف XML الخمس القياسي (&amp;, &gt;, &lt;, &apos;, &quot;) مع الحرف المقابل في الترميز الهدف بحلول الوقت يتم تقييم تعبيرات XPath. بالنظر إلى هذا السلوك ، فإن اقتراحات Philho's و Jsulak هي الطريق للذهاب إذا كنت ترغب في العمل مع أدوات XML. عند الدخول &#160; في تعبير XPath ، يجب تحويله إلى تسلسل البايت المقابل قبل تطبيق تعبير XPath.

لا يمكنني الحصول على تطابق باستخدام XPather ، لكن ما يلي عمل بالنسبة لي مع ملفات XML و XSL العادية في Microsoft's XML Notepad:

<xsl:value-of select="count(//td[text()='&nbsp;'])" />

القيمة التي تم إرجاعها هي 1 ، وهي القيمة الصحيحة في حالة الاختبار الخاصة بي.

ومع ذلك ، كان علي أن أعلن NBSP ككيان داخل XML و XSL باستخدام ما يلي:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

لست متأكدًا مما إذا كان ذلك يساعدك ، لكنني تمكنت من ذلك في الحقيقة تجد NBSP باستخدام تعبير XPath.

تحرير: نموذج الكود الخاص بي يحتوي بالفعل على الأحرف '' ' لكن بناء جملة JavaScript يحوله إلى حرف الفضاء. لا تضلل!

البحث عن &nbsp; أو فقط nbsp - هل جربت هذا؟

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