Овладяване на XPath в Selenium: Как да локализирате елементи

Тестовите инженери са от съществено значение в жизнения цикъл на разработка на софтуер, тъй като те гарантират, че екипът доставя работещи приложения без грешки. Тези инженери преминават приложенията през различни тестове, преди да могат да бъдат изпратени или обявени за готови за потребителите.

Изпитателите трябва да са квалифицирани и да могат да намират и взаимодействат с уеб елементи. Selenium е един от най-използваните инструменти за автоматизация на тестове от съвременните екипи за разработка. Този инструмент има четири компонента; Selenium Grid, Selenium WebDriver, Selenium IDE и Selenium RC.

Фокусът ни днес ще бъде върху Selenium WebDriver, тъй като съдържа XPath. Тази статия ще дефинира XPath, ще обсъди основния синтаксис на XPath и ще илюстрира как да XPath в Selenium.

Какво е XPath

XPath (XML Path Language) е език за заявки за избор и навигиране на атрибути и елементи в XML документи. XPath дефинира израз на пътя, като предлага начин за адресиране на конкретни части от XML документ и извличане на информация от него.

Неговият синтаксис прилича на пътя на файловата система. Той също така включва функции и символи, които правят избирането на елементи въз основа на техните атрибути и йерархия лесно. Можете да използвате XPath с технологии като XML, HTML и XSLT за извличане и манипулиране на данни.

Защо да използвате XPath?

  • Той е гъвкав: За разлика от CSS селекторите, които могат да локализират елементи само с помощта на име на маркер, ID или клас, XPath ви позволява да локализирате елементи с помощта на други атрибути.
  • Повторно използване: Можете да съхранявате вашия XPath в променливи и да ги използвате повторно във вашия код.
  • Прецизен избор на възел: XPath предоставя стандартизиран начин за насочване към конкретни елементи в уеб документ.

Основен синтаксис на XPath

XPath ви позволява да намерите всеки елемент на уеб страница с помощта на DOM. Въпреки това, преди да проверим синтаксиса, трябва да разберем следните XPath изрази;

  Как (и защо) да използвате функцията Outliers в Excel

ExpressionDescriptionnodename/ tagnameИзбира всички възли името ‘nodename’/ ‘tagname’/Избира от основния възел// Избира възли в текущия документ от текущия възел, съответстващ на селекцията, независимо къде се намират@Избира атрибути..Избира родителя на текущия възел. Избира текущия възел

Стандартният синтаксис за XPath е;

XPath=//tagname[@attribute="value"]

Както можете да видите, синтаксисът започва с двойна наклонена черта (//), която започва с текущия възел, както е дефиниран от името на тага/възела.

Абсолютен XPath срещу Относителен XPath

Имаме два пътя, когато работим с XPath; Абсолютен XPath и Относителен XPath;

Абсолютен XPath

Абсолютният XPath е директен път от корена до желания елемент. Започвате с основния възел и завършвате с целевия възел.

Можете да имате HTML документ със следното съдържание;

<!DOCTYPE html>
<html>
<head>
    <title>pctechbg.net</title>
</head>
<body>
    <div>
        <h1>Welcome to pctechbg.net</h1>
    </div>
</body>
</html>

Ако искаме да намерим елемента със съдържание „Добре дошли в pctechbg.net“, ще следвате този път;

/html/body/div/h1

В горния документ имаме;

  • HTML като основен възел: /html
  • Тялото е родителски възел: /html/body
  • Div като дете на възела body: /html/body/div
  • h1 като дете на възела div: /html/body/div/h1

За да получите най-вътрешния елемент, трябва да следвате този път.

Кога да използвате Absolute XPath

Absolute XPath следва „конкретна“ пътека. По този начин ще бъде идеално прилягане, когато имате няколко елемента с подобни атрибути на страница, като гарантирате, че насочвате точните елементи на документ.

XPath обаче е прекалено чувствителен към промени в структурата на HTML документа. Като такава, една проста промяна може да наруши вашия Absolute XPath.

Относителен XPath

Относителният XPath започва от всеки възел и завършва с целевия възел. Този път не се влияе от промени в документа, което го прави предпочитан в повечето случаи. С Relative XPath можете да намерите елементи от всяка част на документа. Изразът Relative XPath започва с двойни наклонени черти ‘//’.

Ако използваме HTML документа, можем да намерим нашия H1, който казва „Добре дошли в pctechbg.net“;

<!DOCTYPE html>
<html>
<head>
    <title>pctechbg.net</title>
</head>
<body>
    <div>
        <h1>Welcome to pctechbg.net</h1>
    </div>
</body>
</html>

Нашият относителен XPath към h1 ще бъде;

//body/div/h1

Кога да използвате Relative XPath

Трябва да използвате Relative XPath, когато търсите баланс между гъвкавост и специфичност. Този път е устойчив на промени в HTML документа, като се има предвид, че връзката между елементите остава специфична.

Намерете елементи с помощта на XPath в Selenium

Selenium е рамка с отворен код, която позволява на потребителите да автоматизират уеб браузърите. Рамката има колекция от библиотеки и инструменти, които помагат на тестерите да взаимодействат с уеб елементите автоматично и систематично.

  Как да направите Chrome вашият браузър по подразбиране

Ако приемем, че имаме уеб документ, който съдържа списък с песни, както следва;

<!DOCTYPE html>
<html>
<head>
    <title>Song Library</title>
</head>
<body>
    <h1>Song Library</h1>
    <ul class="song-list">
        <li class="song" title="Song Title 1">Song 1 - Artist 1</li>
        <li class="song" title="Song Title 2">Song 2 - Artist 2</li>
        <li class="song" title="Song Title 3">Song 3 - Artist 1</li>
        <li class="song" title="Song Title 4">Song 4 - Artist 3</li>
    </ul>
</body>
</html>
  • Нашият основен възел е .
  • Имаме като родителски възел.
  • Имаме

    като дете на .

  • Имаме
      като дете на .
    • Имаме
    • като дете на
        .

      Можем да използваме различни XPath локатори в горния HTML документ. Например, можем да локализираме елементи по ID, име, име на клас, съдържа, текстове, завършва с и започва с, сред много други локатори. Можете да използвате Selenium с различни езици за програмиране. Ще използваме Python за демонстрация.

      Намиране по индекс

      Ако приемем, че искаме да намерим песен номер 3, можем да имаме този код;

      third_song = driver.find_element_by_xpath("//li[@class="song"][3]")
      print("Third Song:", third_song.text)
      

      Използвахме Relative XPath и започваме с възела „li“. Когато Selenium намери третата песен в нашия списък, той ще отпечата нейния текст.

      Намиране по атрибут

      Можем да имаме XPath, който търси всички песни от „Изпълнител 1” и отпечатва заглавията им. Нашият код може да бъде както следва;

      songs_by_artist1 = driver.find_elements_by_xpath("//li[contains(@class, 'song') and contains(text(), 'Artist 1')]")
      print("Songs by Artist 1:")
      for song in songs_by_artist1:
          print(song.text)
      

      Намиране по текст

      Този локатор ви помага да намерите елементи с конкретен текст. Можем да потърсим песен с текст „Песен 4“ и да отпечатаме нейния текст. Можем да представим този локатор с помощта на този код;

      song_with_text = driver.find_element_by_xpath("//li[contains(text(), 'Song 4')]")
      print("Song with Text:", song_with_text.text)
      

      XPath оси

      Подходите, които обсъдихме досега, работят перфектно с прости уеб страници. Въпреки това има случаи, в които методите за търсене на XPath елементи като текст, ID, име на клас и име няма да работят.

      XPath Axes се използват за динамично съдържание, където нормалните локатори не работят. Тук намирате елементи въз основа на връзката им с други елементи. Това са някои от често срещаните локатори на XPath Axes;

      Прародител

      Методът Ancestor Axis е перфектен за работа с XML документи с силно вложени елементи. Можете да изберете всички елементи на предшественик като баба и дядо и родител на текущия възел от най-близкия до най-отдалечения.

      Можем да имаме следния код;

      <bookstore>
        <book>
          <title>The Great Gatsby</title>
          <author>F. Scott Fitzgerald</author>
          <genre>Fiction</genre>
        </book>
        <book>
          <title>The Biggest Dilemma</title>
          <author>George Orwell</author>
          <genre>Dystopian</genre>
        </book>
      </bookstore>
      

      Ако искаме да изберем всички предшественици на елемента ‘title’ за книгата “Най-голямата дилема”, можем да имаме този метод на Ancestor Axis;

      //title[text() = '1984']/ancestor::*

      Следване

      Методът Following Axis локализира всички възли след затварящия етикет на текущия възел. Този метод не отчита йерархията или местоположението на своите целеви възли. Например, ако имате XML документ или уеб страница с множество секции, можете да идентифицирате елемент, който се появява след определена секция, без да навигирате в цялата дървовидна структура.

      Родител

      Методът Parent Axis в XPath избира родителя на текущия възел. Можете да използвате следния път, за да намерите родителския възел;

      //tag[@attribute="value"]/parent::tagName

      Този подход работи, когато дъщерните елементи в текущия възел имат уникални атрибути, които можете лесно да намерите и искате да проверите с родителя.

      дете

      Методът Child Axis в XPath избира всички деца на текущия възел. Той остава един от най-популярните методи на XPath Axis, тъй като помага при избора на дъщерни възли на определен елемент.

      Помислете за тази част от кода;

      <section id='text'>
          <p>Paragraph one</p>
          <p>Paragraph two</p>
          <p>Paragraph three</p>
          <p>Paragraph four</p>
      </section>

      Можем да намерим всички ‘p’ елементи в нашия код с помощта на тази ос;

      //section[@id='text']/child::p

      Често задавани въпроси

      Защо да използвате XPath вместо CSS селектори?

      CSS селекторите могат да намират елементи само въз основа на техния ID, име на етикет и клас. От друга страна, можете да използвате XPath, за да локализирате елементи въз основа на тяхното местоположение, текстово съдържание и други атрибути в HTML структурата. Можете също така да съхранявате XPath изрази в променливи и да ги използвате повторно във вашето приложение.

      Кои езици поддържа XPath в Selenium?

      Можете да използвате XPath с всеки език, който поддържа Selenium. Можете да пишете вашите скриптове на JavaScript, Java, Python, Ruby, C# и PHP.

      Какви са алтернативите на XPath?

      Можете да използвате CSS селектори, разпознаване на изображения или вградените локатори на Selenium като алтернатива на XPath. CSS селекторите са най-често срещаните; можете да намерите елементи въз основа на тяхното име на етикет, ID или клас. Разпознаването на изображения ви позволява да локализирате елементи въз основа на техните изображения. Вградените локатори на Selenium са проектирани да бъдат лесни за използване.

      Заключение

      Вече можете да дефинирате XPath в Selenium, да правите разлика между абсолютен и относителен XPath и да локализирате елементи с помощта на различни XPath локатори. Изборът на локатор ще зависи от естеството на съдържанието и вашите крайни цели.

      Вижте нашата статия относно въпросите за интервю за Selenium, ако искате да успеете на следващото си интервю.