Meteen naar de inhoud

Elementen zoeken via XPath in Selenium (uitgebreide gids)

Als expert op het gebied van webscraping en proxy's met meer dan 5 jaar ervaring, heb ik ervaren dat XPath een van de nuttigste en meest veelzijdige technieken is voor het lokaliseren van webelementen. Door XPath-selectors te beheersen, kunt u met precisie gegevens uit zelfs de meest complexe webpagina's extraheren.

In deze uitgebreide gids van meer dan 3200 woorden deel ik alles wat ik heb geleerd over het vinden van en omgaan met elementen met behulp van XPath in Selenium.

Wat is XPath precies?

Voordat we ingaan op het gebruik, is het belangrijk om te begrijpen wat XPath eigenlijk is.

XPath staat voor XML Path Language. Het is een querytaal voor het selecteren van knooppunten uit een XML-document. In wezen biedt XPath een syntaxis voor het beschrijven van delen van een XML-structuur.

Omdat HTML is gestructureerd als XML, met elementen die zijn genest zoals openings- en sluitingstags, kan XPath ook worden gebruikt om delen van een HTML-document te targeten.

Volgens w3schools enkele belangrijke feiten over XPath:

  • XPath gebruikt padexpressies om knooppunten of knooppuntsets in een XML-document te selecteren
  • Deze padexpressies lijken erg op de padexpressies die u ziet als u met een traditioneel computerbestandssysteem werkt
  • XPath bevat meer dan 100 ingebouwde functies voor het manipuleren van tekenreeksen, getallen, booleans, knooppuntsets, enz.
  • XPath is een belangrijk element in XSLT (Extensible Stylesheet Language Transformations)

Samenvattend is XPath een krachtige query- en extractietaal die is ontworpen voor het navigeren door XML-documenten.

Hoe verhoudt XPath zich tot selenium?

Selenium is een automatiseringsframework voor het besturen van webbrowsers. Wanneer u een webpagina in Selenium laadt, wordt de HTML-inhoud geparseerd in een DOM-structuur (Document Object Model).

De DOM geeft de pagina visueel weer als een boom van geneste HTML-elementen.

XPath kan worden gebruikt om de DOM te doorkruisen om specifieke elementen op de pagina te vinden en ermee te communiceren.

Beschouw bijvoorbeeld deze vereenvoudigde HTML:

<html>
<body>

  <div>
    <p>Hello World!</p>
  </div>

  <div>
    <img src="logo.png"/>
  </div>

</body>
</html>

De DOM zou er ongeveer zo uit kunnen zien:

       html
       /  \
     body   
     / \     
    div  div
      |    |
     p    img

U kunt vervolgens XPath-expressies gebruiken om elementen binnen deze structuur op te vragen:

/html/body/div[1]/p
//div/img

Dit maakt XPath ongelooflijk handig voor het automatiseren van acties op specifieke delen van een pagina met Selenium.

Basisbeginselen van de XPath-syntaxis

Nu u de rol van XPath begrijpt, gaan we dieper in op de syntaxis.

XPath gebruikt padexpressies om elementen en attributen in een XML-document te selecteren. De expressies lijken erg op paden in een bestandssysteem zoals op uw computer:

/Users/jsmith/Documents/letter.docx

De schuine streep / navigeert omlaag door geneste mappen.

Enkele basis XPath-patronen:

  • nodename – Selecteert alle knooppunten met de naam knooppuntnaam
  • / – Selecteert vanaf het hoofdknooppunt
  • // – Selecteert knooppunten op elke diepte
  • . – Selecteert het huidige knooppunt
  • .. – Selecteert het bovenliggende knooppunt
  • @ – Selecteert attributen

Bijvoorbeeld:

/html/body/div - Selects all div tags under body
//div - Selects all div tags anywhere 
div[@class=‘header‘] - Selects div tags with matching class attribute

Er zijn nog veel meer gespecialiseerde syntaxis die we in deze handleiding behandelen. Maar met deze basispatronen kunt u beginnen met het maken van gerichte XPath-selectors.

Volgens mijn ervaring kun je met het beheersen van slechts 5-10 fundamentele XPath-expressies elementen op de meeste websites lokaliseren.

Webelementen zoeken met find_element en find_elements

Selenium biedt twee primaire methoden voor het lokaliseren van elementen met behulp van XPath:

  • find_element() – Retourneert een enkel WebElement dat overeenkomt met de XPath
  • find_elements() – Retourneert een lijst met alle overeenkomende WebElements

Hier is een eenvoudig gebruiksvoorbeeld:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# Find single element
element = driver.find_element(By.XPATH, ‘//img‘) 

# Find multiple elements 
elements = driver.find_elements(By.XPATH, ‘//div‘)

Met deze twee methoden kunt u de kracht van XPath gaan benutten om op geautomatiseerde wijze met specifieke delen van een webpagina te communiceren.

Tips voor het vinden van elementen

Gebaseerd op mijn jarenlange ervaring, volgen hier enkele belangrijke tips bij het bouwen van XPath-selectors:

  • HTML-bron inspecteren – Door de onbewerkte HTML-inhoud te bekijken, kunt u unieke kenmerken en patronen identificeren om elementen te targeten. Alle moderne browsers beschikken over ontwikkelaarstools waarmee u de bron kunt bekijken.

  • Kopieer XPath in de browser – De meeste browserontwikkeltools bevatten ook functionaliteit voor het kopiëren van het volledige XPath van een element. Vervolgens kunt u deze basislijnkiezers aanpassen en vereenvoudigen.

  • Focus op identiteit – Het id-attribuut van een pagina-element biedt de meest directe en unieke selector-achtige //input[@id=‘search‘].

  • Klassen helpen – Klassekenmerken maken flexibelere zoekopdrachten mogelijk, zoals //div[@class=‘results‘] ook al is het niet helemaal uniek.

  • Vermijd indexen – Het bouwen van afhankelijkheid van positionele indexen zoals [1], [2] leidt tot brosse locators.

  • Korter is beter – Beknopte XPath met minimale geneste stappen helpt trage zoekopdrachten of onjuiste overeenkomsten te voorkomen.

Als u deze richtlijnen onder de knie heeft, kunt u robuuste XPath-selectors bouwen die op elegante wijze de vereiste pagina-elementen targeten.

Algemene XPath-patronen en recepten

Nu u de basisbeginselen begrijpt, gaan we eens kijken naar enkele veelvoorkomende voorbeelden van XPath-patronen:

Selecteer op attribuutwaarde

//input[@type=‘submit‘]
//a[@href=‘contact.html‘]

Gedeeltelijke attribuutmatching

//input[contains(@name, ‘search‘)]
//div[starts-with(@class, ‘result‘)]

Selecteer Tekstmatch

//p[text()=‘Hello World‘] 
//h2[contains(text(), ‘Welcome‘)]

Selecteer kinderen

/div/p
//tbody/tr/td

Geïndexeerde selectie

(//input[@type=‘button‘])[2]

Geketende selectie

//div[@id=‘nav‘]/ul/li/a 

Broers en zussen volgen

//h1[text()=‘Articles‘]/following-sibling::p

Ik raad aan om vertrouwd te raken met elk van deze veel voorkomende technieken. Ze vormen een toolkit met XPath-vaardigheden die u goed van pas zullen komen bij het samenstellen van robuuste query's.

Voorbeeld van schrapen

Laten we een voorbeeld van een webscraping-script bekijken met Selenium en XPath in Python.

We extraheren productgegevens van een e-commercesite:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# Initialize driver 
driver = webdriver.Chrome(‘/path/to/chromedriver‘)

# Load page
driver.get(‘https://www.example.com‘)

# Click shop link
shop_link = driver.find_element(By.LINK_TEXT, ‘Shop‘)
shop_link.click()

# Wait for new page to load
time.sleep(5)  

# Extract product details
product = driver.find_element(By.XPATH, ‘//div[@class="product"][1]‘)
name = product.find_element(By.XPATH, ‘.//h2‘).text
description = product.find_element(By.XPATH, ‘.//p‘).text 
price = product.find_element(By.XPATH, ‘.//span[@class="price"]‘).text

print(name, description, price)

# Close browser
driver.quit()

Dit laat zien hoe XPath kan worden gebruikt om elementen nauwkeurig te targeten voor het schrapen van geneste paginagegevens.

Veelvoorkomende problemen en oplossingen

Hier volgen enkele veelvoorkomende problemen die kunnen optreden bij het gebruik van XPath-locators in Selenium, samen met risicobeperkingsstrategieën:

Time-outs

Als pagina's tijd nodig hebben om te laden, gebruik dan impliciete en expliciete wachttijden:

from selenium.webdriver.common.by import WebDriverWait 

driver.implicitly_wait(10) 

WebDriverWait(driver, 20).until(expected_conditions)

Verouderde elementen

Als de DOM verandert, verplaatst u de elementen om verouderde elementuitzonderingen te voorkomen:

elements = driver.find_elements(By.XPATH, ‘//div‘)
# DOM updates, elements now stale
elements = driver.find_elements(By.XPATH, ‘//div‘) 

Browser compatibiliteit

Sommige geavanceerde XPath-functies werken mogelijk niet in alle browsers. Test gedrag en vereenvoudig indien nodig.

Trage prestaties

Zeer complexe XPath-expressies kunnen de testuitvoering vertragen. Vereenvoudig de structuur waar mogelijk.

Zichtbaarheid

Overeenkomende elementen zijn mogelijk niet noodzakelijkerwijs zichtbaar. Zorg ervoor dat ze worden weergegeven voordat u interactie aangaat.

Ervaring helpt bij het anticiperen op deze problemen; ze worden in de loop van de tijd veel gemakkelijker te hanteren.

XPath-alternatieven

Hoewel XPath krachtig is, is het niet altijd de beste oplossing. Hier zijn enkele veelvoorkomende alternatieven:

CSS-kiezers

CSS-selectors bieden een eenvoudige, vertrouwde manier om elementen te vinden:

driver.find_element(By.CSS_SELECTOR, ‘input[type="submit"]‘)
driver.find_element(By.CSS_SELECTOR, ‘.search-box‘) 

ID- en naamkenmerken

Als ID's of namen echt uniek zijn, gebruik dan:

driver.find_element(By.ID, ‘search‘)
driver.find_element(By.NAME, ‘query‘) 

Link Text

Door de volledige linktekst te matchen, kunnen complexe zoekopdrachten worden vermeden:

driver.find_element(By.LINK_TEXT, ‘Logout‘)

Evalueer elke optie op basis van uw specifieke behoeften. Ik merk vaak dat een combinatie van XPath-, CSS-, ID- en linktekstlocators maximale robuustheid biedt.

Vergelijking van locatiestrategieën

Hier is een vergelijking van XPath met enkele veelgebruikte alternatieve elementlocatiestrategieën:

MethodeVoorbeeldVOORDELENNADELEN
XPath//div/pZeer flexibele vragenComplexe syntaxis
CSS-kiezerdiv.resultaten pBekende syntaxisRicht zich alleen op klasse/id/attributen
ID#aanmeldformulierZeer snel en uniekVereist ID's
Naamnaam=vraagUniekVertrouw op naamgevingsconventies
verbind tekstUitloggenEenvoudig voor linksAlleen voor linktekst

Zoals u kunt zien, heeft elke strategie afwegingen. Het gebruik van XPath samen met CSS-selectors en attributen kan robuuste locatorflexibiliteit bieden.

Geavanceerd gebruik met lxml en parsel

Hoewel Selenium erg handige ingebouwde zoekmethoden heeft, bieden speciale parseerbibliotheken zoals lxml en parsel extra kracht voor complexe scraptaken.

Deze bibliotheken bieden robuuste XPath-ondersteuning naast vele andere functies, zoals:

  • Snelle HTML- en XML-parsers
  • Ondersteuning voor XPath 1.0 en 2.0+
  • Een breed scala aan XPath-functies en operators
  • Handige bindingen voor het parseren van HTML
  • Integratie met populaire frameworks zoals Scrapy

Enkele voorbeelden van gebruik:

from lxml import html

tree = html.parse(‘page.html‘)
p_elements = tree.xpath(‘//p‘)

from parsel import Selector
sel = Selector(text=html_text)
links = sel.xpath(‘//a/@href‘).getall() 

Voor zwaardere scrapklussen gebruik ik vaak deze bibliotheken als aanvulling op de ingebouwde mogelijkheden van Selenium.

Conclusie en belangrijkste lessen

Het vinden van elementen via XPath is een essentiële techniek voor iedereen die Selenium gebruikt voor testautomatisering of webscraping.

Hier zijn enkele belangrijke lessen die ik heb geleerd in de ruim vijf jaar waarin ik XPath heb gebruikt voor interactie met complexe sites:

  • Begin met het leren van een paar kernpatronen van XPath, zoals het matchen van attributen, tekstselectie, kindselectie, enz. Het meeste gebruik bouwt voort op deze basisprincipes.

  • Het vinden van een evenwicht tussen beknopte maar unieke vragen vergt oefening. Het is zowel een kunst als een wetenschap.

  • Raak vertrouwd met browserontwikkelaarstools voor het inspecteren van de broncode en het kopiëren van initiële XPath-tekenreeksen.

  • Vul XPath aan met CSS-selectors en id/name-attributen indien nodig. Het combineren van benaderingen leidt tot maximale robuustheid.

  • Overweeg geavanceerde XPath-parseerbibliotheken zoals lxml en parsel voor verbeterde scrapmogelijkheden die verder gaan dan Selenium.

  • Leer door ervaring te anticiperen op veelvoorkomende problemen, zoals verouderde elementen en time-outs, en deze in de loop van de tijd aan te pakken.

Ik hoop dat deze handleiding een uitgebreid naslagwerk heeft geboden voor het ontsluiten van de kracht van XPath-elementselectie met Selenium. Laat het me weten als je nog andere specifieke vragen hebt!

Doe mee aan het gesprek

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *