2017-01-09 3 views
0

Хорошо, я пытаюсь оптимизировать свои тесты. Это может быть просто ограничение Selenium Webdriver, но я так и не смог получить надежный ответ на этот вопрос, поэтому я задаю вопрос напрямую. Причина, по которой это происходит, заключается в том, что для моих тестов я должен использовать селекторы xpath. Недавно мне приходилось возвращаться и менять все мои селекторы на всех моих тестах, потому что div был добавлен где-то, или мы обновили до extJS 6, который переписал структуру. По существу, в приведенном ниже примере я пошел с использованиемКак лучше всего заменить селекторы xpath на элементы, созданные EXTJS с помощью Selenium Webdriver в Java

driver.findElement(By.xpath("html/body/div/div/div/table/tbody/tr[1]/td/span")).getText(); 

в

driver.findElement(By.xpath("html/body/div/div/div/table[1]/tbody/tr/td/span")).getText(); 

Как вы можете видеть изменения были небольшие, но я должен был сделать их более сотни тестов, некоторые из которых были гораздо более сложно. Вот пример кода, с которым я тестирую.

<html> 
    <body> 
     <div id="syn-scheduletree-body" class="class="x-panel-body x-grid-no-row-lines x-grid-body x-panel-body-default x-panel-body-default""> 
      <div class="x-tree-view x-fit-item x-tree-view-default x-unselectable x-scroller"> 
       <div class="x-grid-item-container"> 
//Here is Example 1 
        <table id="treeview-1068-record-158"> 
         <tbody> 
          <tr class="x-grid-tree-node-leaf x-grid-row"> 
           <td class="x-grid-tree-node-leaf x-grid-row"> 
            <span class="x-tree-node-text"> 
             Example 1 
            </span> 
           </td> 
          </tr> 
         </tbody> 
        </table> 
//Here is Example 2 
        <table id="treeview-1068-record-159"> 
         <tbody> 
          <tr class="x-grid-tree-node-leaf x-grid-row"> 
           <td class="x-grid-tree-node-leaf x-grid-row"> 
            <span class="x-tree-node-text"> 
             Example 2 
            </span> 
           </td> 
          </tr> 
         </tbody> 
        </table> 
//Here is Example 3 
        <table id="treeview-1068-record-160"> 
         <tbody> 
          <tr class="x-grid-tree-node-leaf x-grid-row"> 
           <td class="x-grid-tree-node-leaf x-grid-row"> 
            <span class="x-tree-node-text"> 
             Example 3 
            </span> 
           </td> 
          </tr> 
         </tbody> 
        </table> 
       </div> 
      </div> 
     </div> 
    </body> 
</html> 

В одном из моих тестов я должен пройти и нажмите на кнопку Сохранить, которая создала новый экземпляр в списке в таблице. Из-за этого я не могу полагаться на какой-либо жестко закодированный xpath, поскольку числовое число, сгенерированное вместе с новым div, будет отличаться каждый раз. Поэтому я включил следующую логику

String i = 1; 
while (i < 100) { 
    String temp = driver.findElement(By.xpath("html/body/div/div/div/table[" + i + "]/tbody/tr/td/span")).getText(); 
    if (temp.contains("Example 2")) { 
     break; 
    } 
    i++; 
} 

Это включает в себя Java логику, чтобы найти элемент в списке, а также сберегать расположение этого элемента с String, я.

Вопрос, который у меня есть, - это лучший способ. У меня был сотрудник, который недавно упомянул, что если я могу использовать селектор, чтобы выбрать что-то в javascript, все это может быть упрощено, и для этого потребуется меньше обслуживания, чем xpath. Я просто не знаю, как это сделать, с чего начать, если это возможно. При необходимости я могу предоставить дополнительную информацию. Пожалуйста, дайте мне знать, если у вас есть предложения. Это еще не выпущенный продукт, поэтому я смотрю на множество изменений и дополнений в течение коротких промежутков времени, заставляя меня переписать большинство тестов из-за характера xpath.

ответ

0

можно найти элементы на основе их текст с Селеной XPaths, это должно дать вам Youre Элемента ищут:

driver.findElement(By.xpath("html/body/div/div/div/table/tbody/tr/td/span[contains(text(), 'Example 2')]")); 
+0

Хорошо, что кажется, что работает, хотя я вынул все в xpath до диапазона, например driver.findElement (By.xpath ("// span [содержит (текст(), '" + report + " . «)]")) нажмите(); У меня есть вопрос, хотя. Что, если мне нужно было щелкнуть якорь ? Я уже пробовал и нажатие на пробел внутри якоря не работает. Как я могу применить код, который вы мне дали, чтобы щелкнуть якорь, содержащий пробел, который содержит определенный набор текста? – Senator1891

+0

@ Senator1891 Я не знаю точно, вы могли бы попробовать решение acikojevics, но я не знаю, работает ли оно. Что я нашел, так что вы можете перейти к элементу xpath с помощью «..», ваша строка будет выглядеть так : "driver.findElement (By.xpath (" // span [содержит (текст(), '"+ report +"')]/.. ")). click();" –

0

@ Senator1891 Я не могу сделать комментарий, так что я положу это здесь.

Как я могу применить код, который вы мне дали, чтобы щелкнуть якорь, что содержит пролет, который содержит определенный набор текста?

Хорошее решение в этом случае является xpath("//a[contains(., '" + report + "')]")

Это . найти текст в элементе внутри <a>, что в вашем случае <span>.

 Смежные вопросы

  • Нет связанных вопросов^_^