Selênio

Como esperar que uma página carregue com selênio

Como esperar que uma página carregue com selênio
Enquanto a automação da web ou web scraping com o driver da web Selenium, você pode enfrentar problemas como o elemento que deseja selecionar não está disponível ou o botão que deseja pressionar não está pronto para ser clicado e assim por diante.

Isso acontece porque o driver da web do Selenium deve baixar a página da web e terminar de renderizar a página antes que você possa fazer qualquer coisa nela. No passado, o servidor da web gerava o conteúdo de um site, e o navegador apenas baixava e renderizava. Atualmente, temos muitos aplicativos da web de página única que funcionam de maneira um pouco diferente. Em Single Page Web Apps (SPAs), o servidor da web serve apenas os códigos de front-end. Depois que o código do front-end é renderizado no navegador, o código do front-end usa AJAX para solicitar dados da API para o servidor da web. Depois que o front-end recebe os dados da API, ele os renderiza no navegador. Portanto, embora o navegador tenha concluído o download e a renderização da página da web, ela ainda não está pronta. Você deve esperar que ele receba os dados da API e os renderize também. Então, a solução para este problema é esperar que os dados estejam disponíveis antes de fazermos qualquer coisa com o Selenium.

No Selênio, existem 2 tipos de espera:
1) Espera implícita
2) Espera explícita

1) Espera implícita: Este é o mais fácil de implementar. Uma espera implícita diz ao driver da web Selenium para aguardar vários segundos para que o DOM (modelo de objeto de documento) esteja pronto (a página da web deve estar pronta).

2) Espera explícita: Isso é um pouco mais complexo do que a espera implícita. Na espera explícita, você diz ao driver da web Selenium o que esperar. O selênio espera que essa condição específica seja satisfeita. Assim que for cumprido, o driver da web Selenium estará pronto para receber outros comandos. Normalmente, o tempo de espera explícito é variável. Depende da rapidez com que as condições são satisfeitas. No pior cenário, a espera explícita esperará tanto quanto a espera implícita.

Neste artigo, vou mostrar como esperar (implícito e explícito) para uma página carregar com Selenium. Então vamos começar.

Pré-requisitos:

Para experimentar os comandos e exemplos deste artigo, você deve ter,

1) Uma distribuição Linux (de preferência Ubuntu) instalada no seu computador.
2) Python 3 instalado em seu computador.
3) PIP 3 instalado no seu computador.
4) Python virtualenv pacote instalado no seu computador.
5) Navegadores Mozilla Firefox ou Google Chrome instalados em seu computador.
6) Deve saber como instalar o Firefox Gecko Driver ou Chrome Web Driver.

Para cumprir os requisitos 4, 5 e 6, leia meu artigo Introdução ao Selenium com Python 3 na Linuxhint.com.

Você pode encontrar muitos artigos sobre outros tópicos no LinuxHint.com. Certifique-se de verificá-los se precisar de alguma ajuda.

Configurando um diretório de projeto:

Para manter tudo organizado, crie um novo diretório de projeto selênio-esperar / do seguinte modo:

$ mkdir -pv selenium-wait / drivers

Navegue até o selênio-esperar / diretório do projeto da seguinte forma:

$ cd selenium-wait /

Crie um ambiente virtual Python no diretório do projeto da seguinte maneira:

$ virtualenv .venv

Ative o ambiente virtual da seguinte maneira:

$ source .venv / bin / activate

Instale o Selenium usando PIP3 da seguinte forma:

$ pip3 install selenium

Baixe e instale todos os drivers da web necessários no motoristas / diretório do projeto. Eu expliquei o processo de download e instalação de drivers da web em meu artigo Introdução ao Selenium com Python 3. Se você precisar de alguma ajuda, pesquise LinuxHint.com para aquele artigo.

Usarei o navegador Google Chrome para a demonstração neste artigo. Então, vou usar o cromedriver binário do motoristas / diretório.

Trabalhando com Espera Implícita:

Para experimentar a espera implícita, crie um novo script Python ex01.py no diretório do seu projeto e digite as seguintes linhas de códigos nesse arquivo.

from selenium import webdriver
de selênio.driver da web.comum.chaves importar chaves
options = webdriver.ChromeOptions ()
opções.sem cabeça = verdadeiro
navegador = webdriver.Chrome (executable_path = "./ drivers / chromedriver ", options = options)
navegador.implicitly_wait (10)
navegador.get ("https: // www.unixtimestamp.com / ")
timestamp = navegador.find_element_by_xpath ("// h3 [@ class = 'text-danger'] [1]")
print ('timestamp atual:% s'% (timestamp.texto.dividir (") [0]))
navegador.perto()

Quando terminar, salve o ex01.py Script Python.

As linhas 1 e 2 importam todos os componentes necessários do Selenium.

A linha 4 cria um objeto Opções do Chrome.

A linha 5 ativa o modo sem cabeça para o driver da web do Chrome.

A linha 7 cria um objeto do navegador Chrome usando o cromedriver binário do motoristas / diretório.

A linha 8 é usada para dizer ao Selenium para esperar implicitamente por 10 segundos usando o implicitly_wait () método de navegador.

A linha 10 carrega o www.unixtimestamp.com no navegador.

A linha 12 encontra o elemento de carimbo de data / hora usando o seletor XPath // h3 [@ class = 'text-danger'] [1] e armazena-o no carimbo de data / hora variável.

Peguei o seletor XPath da Chrome Developer Tool. Como você pode ver, o carimbo de data / hora está no primeiro h3 elemento com o nome da classe perigo de texto. Há 2 h3 elementos com a classe perigo de texto.

A linha 13 imprime apenas o carimbo de data / hora do elemento que selecionei usando o seletor XPath e armazenado no carimbo de data / hora variável.

A linha 14 fecha o navegador.

Assim que terminar, execute o script Python ex01.py do seguinte modo:

$ python3 ex01.py

Como você pode ver, o carimbo de data / hora atual é extraído de unixtimestamp.com e impresso no console.

Trabalho com espera explícita:

Para experimentar a espera explícita, crie um novo script Python ex02.py no diretório do seu projeto e digite as seguintes linhas de códigos nesse arquivo.

from selenium import webdriver
de selênio.driver da web.comum.chaves importar chaves
de selênio.driver da web.comum.por importação por
de selênio.driver da web.Apoio, suporte.ui import WebDriverWait
de selênio.driver da web.suporte importação condição_esperada
options = webdriver.ChromeOptions ()
opções.sem cabeça = verdadeiro
navegador = webdriver.Chrome (executable_path = "./ drivers / chromedriver ", options = options)
navegador.get ("https: // www.unixtimestamp.com / ")
tentar:
carimbo de data / hora = WebDriverWait (navegador, 10).até(
condições_esperadas.Presence_of_element_located ((Por.XPATH, "
// h3 [@ class = 'text-danger'] [1] "))
)
print ('timestamp atual:% s'% (timestamp.texto.dividir (") [0]))
finalmente:
navegador.perto()

Quando terminar, salve o ex02.py Script Python.

A linha 1-5 importa todos os componentes necessários da biblioteca Selenium.

A linha 7 cria um objeto Opções do Chrome.

A linha 8 ativa o modo sem cabeça para o driver da web do Chrome.

A linha 10 cria um objeto do navegador Chrome usando o cromedriver binário do motoristas / diretório.

A linha 12 carrega o www.unixtimestamp.com no navegador.

A espera explícita é implementada no bloco try-finally (da linha 14-20)

A linha 15-17 usa cria WebDriverWait () objeto. O primeiro argumento de WebDriverWait () é o objeto do navegador e o segundo argumento é o tempo máximo permitido (pior cenário) para cumprir a condição, que é de 10 segundos neste caso.

No até() quadra, condições_esperadas.Presence_of_element_located () método é usado para se certificar de que o elemento está presente antes de tentar selecionar o elemento. Aqui, De.XPATH é usado para dizer ao Presence_of_element_located () método que usamos um seletor XPath para selecionar o elemento. O seletor XPath é // h3 [@ class = 'text-danger'] [1].

Uma vez que o elemento é encontrado, ele é armazenado no carimbo de data / hora variável.

A linha 18 imprime apenas o carimbo de data / hora do elemento selecionado.

Finalmente, a linha 19-20 fecha o navegador.

Assim que terminar, execute o ex02.py Script Python da seguinte forma:

$ python3 ex02.py

Como você pode ver, o carimbo de data / hora atual de unixtimestamp.com está impresso no console.

Selecionando Elementos em Esperas Explícitas:

Na seção anterior, usei De.XPATH para selecionar o elemento usando o seletor XPath. Você também pode selecionar os elementos usando ID, nome da tag, nome da classe CSS, seletor CSS, etc.

Os métodos de seleção suportados são fornecidos abaixo:

De.XPATH - Seleciona elemento / elementos usando o seletor XPath.

De.NOME DA CLASSE - Seleciona elemento / elementos usando o nome da classe CSS.

De.CSS_SELECTOR - Seleciona elemento / elementos usando o seletor CSS.

De.EU IA - Seleciona o elemento por ID

De.NOME - Seleciona elemento / elementos por nome.

De.TAG_NAME - Seleciona elemento / elementos pelo nome da tag HTML.

De.TEXTO DO LINK - Seleciona elemento / elementos pelo texto do link de uma (âncora) tag HTML.

De.PARTIAL_LINK_TEXT - Seleciona elemento / elementos por texto de link parcial de uma (âncora) tag HTML.

Para obter mais informações sobre isso, visite a página de documentação da API Python Selenium.

Condições esperadas em esperas explícitas:

No exemplo anterior de espera explícita, usei o Presence_of_element_located () método de condições_esperadas como condição de espera explícita para ter certeza de que o elemento que eu estava procurando existe antes de selecioná-lo.

Ha outro condições_esperadas você pode usar como uma condição de espera explícita. Alguns deles são:

title_is (título) - verifica se o título da página é título.

title_contains (partial_title) - verifica se o título da página contém uma parte do título parcial_título.

visibilidade_de (elemento) - verifica se o elemento está visível na página em que o elemento tem largura e altura maiores que 0.

visible_of_element_located (localizador) -

Presence_of_element_located (localizador) - Certifique-se de que o elemento localizado (pelo localizador) está presente na página. O localizador é uma tupla de (Por, seletor), como mostrei no exemplo de espera explícito.

Presence_of_all_element_located () - Garante que todos os elementos correspondam ao localizador está presente na página. O localizador é um (Por, seletor) tupla.

text_to_be_present_in_element (localizador, texto) - Verifica se o texto está presente no elemento localizado pelo localizador. O localizador é um (Por, seletor) tupla.

element_to_be_clickable (localizador) - Verifica se o elemento localizado pelo localizador é visível e clicável. O localizador é um (Por, seletor) tupla.

element_to_be_selected (localizador) - Verifica se o elemento localizado pelo localizador é selecionado. O localizador é um (Por, seletor) tupla.

alert_is_present () - espere que uma caixa de diálogo de alerta esteja presente na página.

Há muitos mais condições_esperadas disponível para você usar. Para obter mais informações sobre isso, visite a página de documentação da API Python Selenium.

Conclusão:

Neste artigo, discuti as esperas implícitas e explícitas do Selenium. Também mostrei como trabalhar com uma espera implícita e explícita. Você deve sempre tentar usar a espera explícita em seus projetos Selenium, pois Selenium tentará reduzir o tempo de espera tanto quanto possível. Dessa forma, você não terá que esperar um número específico de segundos cada vez que executar seus projetos Selenium. A espera explícita deve economizar muitos segundos.

Para obter mais informações sobre as esperas do Selenium, visite a página de documentação oficial do Selenium Python Library espera.

SuperTuxKart para Linux
SuperTuxKart é um ótimo título projetado para trazer a você a experiência Mario Kart gratuitamente em seu sistema Linux. É bastante desafiador e diver...
Tutorial de Battle for Wesnoth
The Battle for Wesnoth é um dos jogos de estratégia de código aberto mais populares que você pode jogar no momento. Este jogo não está apenas em desen...
0 A.D. Tutorial
Dos muitos jogos de estratégia que existem, 0 A.D. consegue se destacar como um título abrangente e um jogo muito profundo e tático, apesar de ser de ...