وجود بعض المشاكل في فهم لماذا: يحتوي على () الطبقة الزائفة في محددات المغلق يعمل بالطريقة التي يعمل بها?

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

سؤال

أنا باستخدام محددات كس مع السيلينيوم والخيار.عندما لا يعمل محدد المواقع أنا اختبار بها باستخدام وحدة التحكم من أدوات المطور كروم.ما زلت أواجه سلوكا لا أفهمه (كما هو الحال في سبب قيامه بما يفعله وليس ما أحتاجه للقيام به...).يرجى إلقاء نظرة على هذه المواقع:

  1. div.view_header ~ div input.my_button

  2. div:contains(My Header Title) ~ div input.my_button

  3. div:contains(My Header Title) ~ div div div input.my_button

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

<div class="view_header foo">    My Header Title  </div>

تكمن المشكلة في أن محددات المواقع رقم 1 ورقم 3 أعلاه فقط هي التي تتطابق فعليا مع أي شيء.لا أحد يعرف لماذا هذا صحيح.أدرك ذلك div:contains(foo) سوف تتطابق ليس فقط ديف الذي يحتوي في الواقع فو ولكن جميع الانقسامات الأم كذلك ولكن يبدو لي أن بقية عناصر تحديد المواقع يجب أن يكون الفرز بها بحيث يجب أن تعمل.

أنا فقط أبحث عن أي فكرة وربما اقتراحات لطريقة للتأكد من أن 'بلدي زر' أنا النقر هو واحد تحت 'عنوان رأس بلدي' وليس 'بلدي زر' في مكان آخر على الصفحة (والطريقة الوحيدة السهلة لتمييزها هي من قبل رأس هم تحت) في حين القضاء على هيكل دوم على ما يبدو الزائدة في محدد المواقع وذلك لجعله أكثر عرضة لتكون قابلة لإعادة الاستخدام.

<head>
<body class="bp">
  <div style="left: -100em; position: absolute; width: 100em;"></div>
  <input class="refresh_marker" type="text" value="no" style="display:none">
  <div class="container">
    <div id="nav_bar">
    <div id="user_bar">
    <div id="wrapper" style="border-radius: 10px 10px 10px 10px;">
      <div class="content">
        <div class="page_title"> Title </div>
        <div></div>
        <a class="change_tracker_link"> &nbsp; </a>
        <div class="breadcrumb_trail">
        <style type="text/css">
        <div id="dialog_no_new_assoc" class="hide" title="No Associations Selected"></div>
        <div class="organizer_widget root_organizer" title="WorkflowItem" style="">
          <input id="data_classifier" type="hidden" value="Workflow::WorkflowItem">
          <input id="data_id" type="hidden" value="34">
          <input id="data_getter" type="hidden">
          <input id="collection_vertex_id" type="hidden" value="4cb1ecc300fa5f77844b1e87431d0a25390c1c77">
          <input id="view-name" type="hidden" value="EnterPaperInformation">
          <div class="object organizer">
            <div class="clear"></div>
            <div class="interior">
              <form method="POST" enctype="multipart/form-data">
                <input type="hidden" value="4cb1ecc300fa5f77844b1e87431d0a25390c1c77" name="vertex_id">
                <input type="submit" value="Save" style="display: none;" name="submit_form">
                <div class="organizer_header view_header"> My Header Title </div>
                <div class="organizer_widget" title="Citation" style="">
                  <input id="data_classifier" type="hidden" value="Bibliography::Citation">
                  <input id="data_id" type="hidden" value="10">
                  <input id="data_getter" type="hidden" value="citation">
                  <input id="collection_vertex_id" type="hidden" value="5376dcc81102a5d76bf829513b096be8f67e560d">
                  <input id="view-name" type="hidden" value="CitationEntrySummary">
                  <div id="citation" class="object organizer">
                    <div class="clear"></div>
                    <div class="interior">
                      <div id="Citation___id_widget" class="widget_row numeric">
                      <div id="Citation___title_widget" class="widget_row string">
                      <div id="Citation___abbreviated_title_widget" class="widget_row string">
                      <div id="Citation___authors_display_string_widget" class="widget_row string">
                      <div id="Citation___language_widget" class="widget_row choice">
                      <div id="Citation___link_widget" class="widget_row link">
                      <input type="hidden" value="Bibliography::JournalArticle___10" name="check_5376dcc81102a5d76bf829513b096be8f67e560d[]">
                      <input id="ba_citation" class="my_button" type="button" value="Break Associations" name="break_assoc_5376dcc81102a5d76bf829513b096be8f67e560d">
                      <div class="clear"></div>
                      <input type="hidden" value="5376dcc81102a5d76bf829513b096be8f67e560d" name="vertices[]">
                    </div>
                  ...
هل كانت مفيدة؟

المحلول

الشيء المعتاد الذي أفعله عندما أجد نفسي في هذا النوع من المشاكل هو إلقاء نظرة على المواصفات.

كما تعلمون على الأرجح, لا يوجد شيء ل :contains() في المواصفات الحالية وبالتالي فإنك تعتمد على ميزات غير موثقة وغير محددة لمتصفح/محلل معين.ذلك ينبغي العمل ، لكنه لا - من الواضح أن التنفيذ لم يكتمل.والآن ذهبت الطبقة الزائفة.

هل يمكن أن تذهب ل زباث في حين أن?إما عن طريق طرق السيلينيوم الداخلية أو جافا سكريبت.هذا زباث هو نفس رقم محدد كس الخاص بك 2:

//div[contains(text(),'My Header Title')]/following-sibling::div//input[contains(@class,'my_button')]

تحرير

بعد تعليقك أظهر لي أننا نتحدث عن السيلينيوم أرسي ، وبالتالي ، همسة ، أنا حفرت أعمق.

أخذت المثال هتمل الخاص بك ، جردته من العناصر الخفية و (على ما يبدو) لا داعي لها ، وترك مع هذا:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8" />
    <script src="sizzle.js" type="text/javascript"></script>
</head>

<body class="bp">
  <div class="container">
    <div id="nav_bar">
    <div id="user_bar">
    <div id="wrapper" style="border-radius: 10px 10px 10px 10px;">
      <div class="content">
        <div class="breadcrumb_trail">
        <div class="organizer_widget root_organizer" title="WorkflowItem" style="">
          <div class="object organizer">
            <div class="interior">
              <form method="POST" enctype="multipart/form-data">
                <div class="organizer_header view_header">    My Header Title  </div>
                <div class="organizer_widget" title="Citation" style="">
                  <div id="citation" class="object organizer">
                    <div class="clear"></div>
                    <div class="interior">
                      <div id="Citation___id_widget" class="widget_row numeric">
                      <div id="Citation___title_widget" class="widget_row string">
                      <div id="Citation___abbreviated_title_widget" class="widget_row string">
                      <div id="Citation___authors_display_string_widget" class="widget_row string">
                      <div id="Citation___language_widget" class="widget_row choice">
                      <div id="Citation___link_widget" class="widget_row link">
                      <input id="ba_citation" class="my_button" type="button" value="Break Associations" name="break_assoc_5376dcc81102a5d76bf829513b096be8f67e560d" />
                      <div class="clear"></div>
                      </div></div></div></div></div></div>
                    </div>
                  </div>
                </div>
              </form>
            </div>
          </div>
        </div>
        </div>
      </div>
    </div>
    </div>
    </div>
  </div>
</body>

</html>

أنا تحميل أحدث همسة وحصلت على نسخة من همسة التي يتم استخدامها في الواقع من قبل السيلينيوم في الإصدار الحالي.

تبين هذين مختلفة جدا.

على سبيل المثال.ال contains تنفيذ همسة الحالية:

return ~( elem.textContent || elem.innerText || getText( elem ) ).indexOf( match[3] );

ويستخدم السيلينيوم التنفيذ:

return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;

لقد جربت كلا التطبيقين في مستند الاختبار الخاص بي ، ويمكن رؤية النتائج هنا (انقر للتكبير):

همسة الحالية-مباريات جميع تماما Current Sizzle Results

أزيز السيلينيوم-مباريات 1 بعيدا عن المكان 4 Selenium's Sizzle Results


النتائج تقول كل شيء.يستخدم السيلينيوم نسخة قديمة من الأزيز غير كاملة إلى حد ما في التعامل مع :contains() الطبقة الزائفة.لا يعاني إصدار الأزيز الحالي من الخطأ وهو قادر على العثور على جميع العناصر جيدا.

الآن ، يمكنك القيام بأي من هذه:

  1. ملف علة السيلينيوم.
  2. استخدام زباث كحل بديل.
  3. تبديل sizzle.js ملف في حزمة السيلينيوم الخاص بك.

نصائح أخرى

#Selenium #Webdriver handle only HTML elements but with using java script executor It's possible to handle #pseudo elements in selenium #webdriver. 

Ex: :after , :before etc

String script = "return window.getComputedStyle(document.querySelector('Enter root classname here'),':after / :before').getPropertyValue('content')";
Thread.sleep(3000);
JavascriptExecutor js = (JavascriptExecutor) driver;
String content = (String) js.executeScript(script);
System.out.println(content);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top