1. Fundamentos de busca de elementos na página
Usando métodos de busca de elementos
Quando você começar a usar Selenium em projetos reais, uma das primeiras tarefas será buscar elementos na página. Isso pode ser comparado a procurar o botão do elevador em um hotel: você precisa saber onde ele está localizado para apertar e ir para o andar desejado.
O Selenium oferece vários métodos para buscar
elementos. Dependendo das suas preferências, você pode usar find_element_by_id
,
find_element_by_name
,
find_element_by_xpath
,
find_element_by_css_selector
, e assim por diante.
Vamos relembrar o que já sabemos - e escrever um exemplo simples:
from selenium import webdriver
# Criando uma instância do navegador (aqui usamos Chrome)
driver = webdriver.Chrome()
# Abrindo a página
driver.get('http://example.com')
# Buscando elemento pelo ID
element_by_id = driver.find_element_by_id('main')
# Buscando elemento pelo nome
element_by_name = driver.find_element_by_name('username')
# Buscando elemento pelo XPath
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# Buscando elemento pelo CSS Selector
element_by_css = driver.find_element_by_css_selector('div.content')
Diferenças entre find_element e find_elements
Quando você tem vários elementos que deseja
capturar (tipo, todos os botões com a classe btn
),
você vai precisar do método find_elements
. A diferença
entre find_element
e find_elements
é que o primeiro retorna um único elemento, enquanto o segundo
retorna uma lista de elementos.
# Buscando um único elemento
single_element = driver.find_element_by_class_name('btn')
# Buscando vários elementos
multiple_elements = driver.find_elements_by_class_name('btn')
# Iterando sobre os elementos encontrados
for element in multiple_elements:
print(element.text)
Como você pode ver, find_elements
é perfeito para
trabalhar com coleções de elementos, que podem ser muitos
na página. Cada método
find_element_xxx
tem o seu
find_elements_xxx
, que retorna uma lista
de elementos.
2. Interação interativa com os elementos
Interagindo com botões, links e campos de entrada
Agora que você relembrou como encontrar os elementos, é hora de lembrar como interagir com eles! É tipo brincar com LEGO: você precisa encaixar as peças certas para montar o que quer.
A interação com elementos pode ser feita usando os métodos que o Selenium oferece. Vamos dar outra olhada em como isso funciona:
# Clicando em um botão
button = driver.find_element_by_id('submit')
button.click()
# Inserindo texto em um campo de entrada
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# Obtendo o texto de um elemento
header = driver.find_element_by_tag_name('h1')
print(header.text)
Trabalhando com eventos e elementos dinâmicos
Quando o assunto é trabalhar com elementos dinâmicos,
tipo botões que só aparecem depois de
uma certa ação,
é importante considerar atrasos e esperas. O Selenium
oferece maneiras de esperar por esses elementos.
Uma delas é usar a classe
WebDriverWait
junto com
expected_conditions
.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Esperando pelo botão por até 10 segundos
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
Nota. Para não precisar escrever
expected_conditions
toda hora, renomeamos ele na
hora de importar para EC
.
Usar esperas torna o seu script mais robusto e evita que quebre por causa de atrasos temporários ou carregamento lento da página. E na prática, isso acontece bastante - quase sempre :)
3. O que pode dar errado?
Tudo. Tudo pode dar errado. Você está todo empolgado para interagir com os elementos, mas aí, pá, algo dá errado. Vamos discutir alguns erros típicos que podem surgir nesse caminho.
Primeiro, NoSuchElementException
— essa
mensagem de erro você vai ver bastante,
especialmente se o elemento que você procura não
existe na página. Ela acontece quando você tenta
buscar um elemento que não está lá. Para evitar
essas situações, você pode usar o método
try-except
para tratar exceções.
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("Ops, parece que o elemento não foi encontrado!")
Também podem ocorrer problemas com elementos dinâmicos e
tempo de carregamento. Nesse caso, espere pelo carregamento dos elementos
usando WebDriverWait
, como discutimos anteriormente.
GO TO FULL VERSION