Ir para o conteúdo

Como encontrar elementos por XPath no Selenium (guia completo)

Como especialista em web scraping e proxies com mais de 5 anos de experiência, descobri que o XPath é uma das técnicas mais úteis e versáteis para localizar elementos da web. Dominar os seletores XPath pode ajudá-lo a extrair dados com precisão até mesmo das páginas da web mais complexas.

Neste guia abrangente com mais de 3200 palavras, compartilharei tudo o que aprendi sobre como encontrar e interagir com elementos usando XPath no Selenium.

O que exatamente é XPath?

Antes de mergulharmos no uso, é importante entender o que realmente é o XPath.

XPath significa XML Path Language. É uma linguagem de consulta para selecionar nós de um documento XML. Essencialmente, XPath fornece uma sintaxe para descrever partes de uma estrutura XML.

Como o HTML é estruturado como XML, com elementos aninhados como tags de abertura e fechamento, o XPath também pode ser usado para direcionar partes de um documento HTML.

De acordo com w3schools, alguns fatos importantes sobre XPath:

  • XPath usa expressões de caminho para selecionar nós ou conjuntos de nós em um documento XML
  • Essas expressões de caminho se parecem muito com as expressões de caminho que você vê ao trabalhar com um sistema de arquivos de computador tradicional
  • XPath contém mais de 100 funções integradas para manipular strings, números, booleanos, conjuntos de nós, etc.
  • XPath é um elemento importante em XSLT (Extensible Stylesheet Language Transformations)

Em resumo, XPath é uma poderosa linguagem de consulta e extração projetada para navegar em documentos XML.

Como o XPath se relaciona com o Selênio?

Selenium é uma estrutura de automação para controlar navegadores web. Quando você carrega uma página da web no Selenium, o conteúdo HTML é analisado em uma estrutura DOM (Document Object Model).

O DOM representa a página visualmente como uma árvore de elementos HTML aninhados.

XPath pode ser usado para percorrer o DOM para encontrar e interagir com elementos específicos na página.

Por exemplo, considere este HTML simplificado:

<html>
<body>

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

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

</body>
</html>

O DOM pode ser parecido com isto:

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

Você pode então usar expressões XPath para consultar elementos nesta estrutura:

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

Isso torna o XPath incrivelmente útil para automatizar ações em partes específicas de uma página com Selenium.

Noções básicas de sintaxe XPath

Agora que você entende a função do XPath, vamos nos aprofundar na sintaxe.

XPath usa expressões de caminho para selecionar elementos e atributos em um documento XML. As expressões são muito semelhantes aos caminhos em um sistema de arquivos como no seu computador:

/Users/jsmith/Documents/letter.docx

A barra / navega para baixo pelas pastas aninhadas.

Alguns padrões XPath básicos:

  • nodename – Seleciona todos os nós com o nome nodename
  • / – Seleciona do nó raiz
  • // – Seleciona nós em qualquer profundidade
  • . – Seleciona o nó atual
  • .. – Seleciona o nó pai
  • @ – Seleciona atributos

Por exemplo:

/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

Existem muitas outras sintaxes especializadas que abordaremos ao longo deste guia. Mas esses padrões básicos permitem que você comece a criar seletores XPath direcionados.

De acordo com minha experiência, dominar apenas 5 a 10 expressões XPath básicas permitirá localizar elementos na maioria dos sites.

Encontrando Elementos da Web com find_element e find_elements

O Selenium fornece dois métodos principais para localizar elementos usando XPath:

  • find_element() – Retorna um único WebElement correspondente ao XPath
  • find_elements() – Retorna uma lista de todos os WebElements correspondentes

Aqui está um exemplo de uso simples:

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‘)

Com esses dois métodos, você pode começar a aproveitar o poder do XPath para interagir com partes específicas de uma página da web de forma automatizada.

Dicas para encontrar elementos

Com base em meus anos de experiência, aqui estão algumas dicas importantes ao construir seletores XPath:

  • Inspecione a fonte HTML – A visualização do conteúdo HTML bruto permite identificar atributos e padrões exclusivos para elementos de destino. Todos os navegadores modernos possuem ferramentas de desenvolvedor para visualizar o código-fonte.

  • Copie XPath no navegador – A maioria das ferramentas de desenvolvimento de navegador também inclui funcionalidade para copiar o XPath completo de um elemento. Você pode então ajustar e simplificar esses seletores de linha de base.

  • Concentre-se na identificação – O atributo id de um elemento de página fornece o seletor mais direto e exclusivo, como //input[@id=‘search‘].

  • Ajuda nas aulas – Os atributos de classe permitem consultas mais flexíveis como //div[@class=‘results‘] mesmo que não seja completamente único.

  • Evite índices – Construir confiança em índices posicionais como [1], [2] leva a localizadores frágeis.

  • Quanto mais curto, melhor – XPath conciso com etapas aninhadas mínimas ajuda a evitar consultas lentas ou correspondências incorretas.

Dominar essas diretrizes o ajudará a construir seletores XPath robustos que segmentam com elegância os elementos necessários da página.

Padrões e receitas XPath comuns

Como agora você entende o básico, vejamos alguns exemplos comuns de padrões XPath:

Selecione por valor de atributo

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

Correspondência parcial de atributos

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

Selecione correspondência de texto

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

Selecione as crianças

/div/p
//tbody/tr/td

Seleção Indexada

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

Seleção encadeada

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

Seguindo irmãos

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

Recomendo se familiarizar com cada uma dessas técnicas comuns. Eles formam um kit de ferramentas de habilidades XPath que será útil na construção de consultas robustas.

Exemplo de raspagem

Vamos examinar um exemplo de script de web scraping usando Selenium e XPath em Python.

Extrairemos dados de produtos de um site de comércio eletrônico:

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()

Isso demonstra como o XPath pode ser usado para direcionar elementos com precisão para extrair dados de páginas aninhadas.

Problemas e soluções comuns

Aqui estão alguns problemas comuns que podem ocorrer ao usar localizadores XPath no Selenium junto com estratégias de mitigação:

Tempos limite

Se as páginas demorarem para carregar, use esperas implícitas e explícitas:

from selenium.webdriver.common.by import WebDriverWait 

driver.implicitly_wait(10) 

WebDriverWait(driver, 20).until(expected_conditions)

Elementos obsoletos

Se o DOM mudar, realoque os elementos para evitar exceções de elementos obsoletos:

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

Compatibilidade do navegador

Alguns recursos XPath avançados podem não funcionar em todos os navegadores. Teste o comportamento e simplifique, se necessário.

Desempenho lento

Expressões XPath muito complexas podem retardar a execução do teste. Simplifique a estrutura sempre que possível.

Visibilidade

Os elementos correspondentes podem não estar necessariamente visíveis. Certifique-se de que eles sejam exibidos antes de interagir.

A experiência ajuda a antecipar esses problemas – eles se tornam muito mais fáceis de lidar com o tempo.

Alternativas XPath

Embora o XPath seja poderoso, nem sempre é a melhor solução. Aqui estão algumas alternativas comuns:

Seletores CSS

Os seletores CSS fornecem uma maneira simples e familiar de encontrar elementos:

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

Atributos de ID e Nome

Se IDs ou nomes forem verdadeiramente exclusivos, use:

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

link Text

A correspondência do texto completo do link pode evitar consultas complexas:

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

Avalie cada opção para suas necessidades específicas. Costumo descobrir que uma combinação de XPath, CSS, ID e localizadores de texto de link fornece robustez máxima.

Comparação de estratégias de localização

Aqui está uma comparação do XPath com algumas estratégias comuns de localização de elementos alternativos:

FormaExemploPrósDesvantagens
XPath//div/pConsultas muito flexíveisSintaxe complexa
Seletor de CSSdiv.resultados pSintaxe familiarSegmenta apenas classe/id/atributos
ID#formulário de inscriçãoMuito rápido e únicoRequer IDs
Nomenome=consultaÚnicoConfie nas convenções de nomenclatura
Texto do linkSairSimples para linksSomente para texto do link

Como você pode ver, cada estratégia tem vantagens e desvantagens. Usar XPath junto com seletores e atributos CSS pode fornecer flexibilidade robusta ao localizador.

Uso avançado com lxml e parsel

Embora o Selenium tenha métodos de localização integrados muito úteis, bibliotecas de análise dedicadas, como lxml e parsel, oferecem poder adicional para tarefas complexas de raspagem.

Essas bibliotecas fornecem suporte XPath robusto junto com muitos outros recursos como:

  • Analisadores rápidos de HTML e XML
  • Suporte para XPath 1.0 e 2.0+
  • Uma ampla gama de funções e operadores XPath
  • Vinculações convenientes para análise de HTML
  • Integração com frameworks populares como Scrapy

Alguns exemplos de uso:

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() 

Para trabalhos de raspagem mais pesados, costumo recorrer a essas bibliotecas para complementar os recursos integrados do Selenium.

Conclusão e lições principais

Encontrar elementos por XPath é uma técnica essencial para qualquer pessoa que usa Selenium para automação de testes ou web scraping.

Aqui estão algumas lições importantes que aprendi em mais de 5 anos aproveitando o XPath para interagir com sites complexos:

  • Comece aprendendo alguns padrões XPath básicos, como correspondência de atributos, seleção de texto, seleção de filhos, etc.

  • Encontrar um equilíbrio entre consultas concisas, mas exclusivas, requer prática. É uma arte tanto quanto uma ciência.

  • Familiarize-se com as ferramentas de desenvolvedor do navegador para inspecionar a origem e copiar strings XPath iniciais.

  • Complemente o XPath com seletores CSS e atributos de id/nome quando apropriado. A combinação de abordagens leva à robustez máxima.

  • Considere bibliotecas avançadas de análise XPath, como lxml e parsel, para capacidade aprimorada de raspagem além do Selenium.

  • Aprenda a antecipar e lidar com problemas comuns, como elementos obsoletos e tempos limite ao longo do tempo, por meio da experiência.

Espero que este guia tenha fornecido uma referência abrangente para desbloquear o poder da seleção de elementos XPath com Selenium. Deixe-me saber se você tiver alguma outra dúvida específica!

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *