Como esperar para uma página carregar com selênio

Como esperar para uma página carregar com selênio
Embora a automação da web ou a raspagem da web com o Selenium Web Driver, 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.

A razão pela qual isso acontece é que 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 gerou o conteúdo de um site, e o navegador acabou de baixá -lo e renderizá -lo. Hoje em dia, temos muitos aplicativos da Web de uma página que funcionam um pouco diferente. Em aplicativos da web de página única (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 o Ajax para solicitar dados da API ao servidor da web. Uma vez que o front -end recebe os dados da API, ele os renderiza no navegador. Então, mesmo que o navegador tenha terminado de baixar e renderizar a página da web, a página da web ainda não está pronta. Você deve esperar que ele receba os dados da API e os renderize também. Portanto, a solução para esse problema é esperar que os dados estejam disponíveis antes de fazer 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 do Selenium para esperar que vários segundos para o DOM (modelo de objeto de documento) estejam prontos (a página da web está pronta).

2) Espera explícita: Isso é um pouco complexo do que a espera implícita. Em espera explícita, você diz ao driver da web do Selenium o que esperar. O selênio espera que essa condição específica seja cumprida. Uma vez cumprido, o driver da web de Selenium estará pronto para receber outros comandos. Geralmente, 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á o tempo que a espera implícita.

Neste artigo, vou mostrar como esperar (implícito e explícito) para uma página carregar com selênio. 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) Mozilla Firefox ou Google Chrome Web navegadores instalados no seu computador.
6) Deve saber como instalar o driver do Firefox Gecko ou o Chrome Web Driver.

Para cumprir os requisitos 4, 5 e 6, leia meu artigo Introdução ao selênio com Python 3 no Linuxhint.com.

Você pode encontrar muitos artigos sobre os outros tópicos no Linuxhint.com. Não deixe de conferir se precisar de alguma assistência.

Configurando um diretório de projeto:

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

$ mkdir -pv Selenium -wait/drivers

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

$ CD Selenium-Wait/

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

$ virtualenv .Venv

Ative o ambiente virtual da seguinte forma:

$ fonte .venv/bin/ativar

Instale o selênio usando o PIP3 da seguinte forma:

$ PIP3 Instale o selênio

Baixar e instalar todo o driver da web necessário 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 selênio com Python 3. Se você precisar de ajuda, pesquise em Linuxhint.com Para esse artigo.

Usarei o navegador do Google Chrome para a demonstração neste artigo. Então, eu estarei usando 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 seu diretório de projeto e digite as seguintes linhas de códigos nesse arquivo.

do selênio importar webdriver
de selênio.WebDriver.comum.teclas de importação
opções = webdriver.Chromeoptions ()
opções.sem cabeça = verdadeiro
navegador = webdriver.Chrome (executável_path = "./Drivers/Chromedriver ", Options = Options)
navegador.Implicitamente_wait (10)
navegador.Get ("https: // www.unixtimestamp.com/")
Timestamp = navegador.find_element_by_xpath ("// h3 [@class = 'text-danger'] [1]")
Print ('Timestamp atual: % S' % (registro de data e hora.texto.Split (") [0]))
navegador.fechar()

Depois de terminar, salve o Ex01.py Script Python.

A linha 1 e 2 importa todos os componentes de selênio necessários.

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

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

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

A linha 8 é usada para dizer ao selênio para esperar implicitamente por 10 segundos usando o implícita_wait () Método do navegador.

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

A linha 12 encontra o elemento Timestamp usando o seletor XPath // h3 [@class = 'textanger'] [1] e o armazena no Timestamp variável.

Recebi o seletor XPath da ferramenta de desenvolvedor do Chrome. Como você pode ver, o registro de data e hora está no primeiro H3 elemento com o nome da classe Danger de texto. Há 2 H3 Elementos com a classe Danger de texto.

A linha 13 imprime apenas o registro de data e hora que eu selecionei usando o seletor XPath e armazenado no Timestamp variável.

A linha 14 fecha o navegador.

Depois de terminar, execute o script python Ex01.py do seguinte modo:

$ python3 ex01.py

Como você pode ver, o registro atual é extraído do Unixtimestamp.com e impresso no console.

Trabalhando com espera explícita:

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

do selênio importar webdriver
de selênio.WebDriver.comum.teclas de importação
de selênio.WebDriver.comum.por importação por
de selênio.WebDriver.apoiar.UI importar webdriverwait
de selênio.WebDriver.Suporte importação esperada_condições
opções = webdriver.Chromeoptions ()
opções.sem cabeça = verdadeiro
navegador = webdriver.Chrome (executável_path = "./Drivers/Chromedriver ", Options = Options)
navegador.Get ("https: // www.unixtimestamp.com/")
tentar:
Timestamp = WebDriverWait (navegador, 10).até(
Esperado_condições.presença_of_element_located ((por.Xpath, "
// h3 [@class = 'textanger'] [1] ")))
)
Print ('Timestamp atual: % S' % (registro de data e hora.texto.Split (") [0]))
finalmente:
navegador.fechar()

Depois de terminar, salve o ex02.py Script Python.

A linha 1-5 importa todos os componentes necessários da Biblioteca Selênio.

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

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

A linha 10 cria um objeto de 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 é 10 segundos neste caso.

No até() bloquear, Esperado_condições.presença_of_element_located () O método é usado para garantir que o elemento esteja presente antes de tentar selecionar o elemento. Aqui, Por.Xpath é usado para dizer o presença_of_element_located () Método que usamos um seletor XPath para selecionar o elemento. O seletor XPath é // h3 [@class = 'textanger'] [1].

Depois que o elemento é encontrado, ele é armazenado no Timestamp variável.

A linha 18 imprime apenas o registro de data e hora do elemento selecionado.

Finalmente, a linha 19-20 fecha o navegador.

Depois de terminar, execute o ex02.py Script Python da seguinte maneira:

$ python3 ex02.py

Como você pode ver, o atual registro de data e hora da Unixtimestamp.com é impresso no console.

Selecionando elementos em esperas explícitas:

Na seção anterior, eu usei Por.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:

Por.Xpath - Seleciona elemento/elementos usando o seletor XPath.

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

Por.CSS_SELECTOR - Seleciona elemento/elementos usando seletor CSS.

Por.EU IA - Seleciona elemento por id

Por.NOME - Seleciona elemento/elementos por nome.

Por.Tag_name - Seleciona elemento/elementos por nome da tag html.

Por.TEXTO DO LINK - Seleciona elemento/elementos por texto de link de a (âncora) tag html.

Por.Parcial_link_text - Seleciona elemento/elementos por texto de link parcial de a (âncora) tag html.

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

Condições esperadas em esperas explícitas:

No exemplo de espera explícito anterior, eu usei o presença_of_element_located () método de Esperado_condições Como a condição de espera explícita para garantir que o elemento que eu estava procurando existe antes de selecioná -lo.

Ha outro Esperado_condições 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 (parcial_title) - Verifica se o título da página contém uma parte do título parcial_title.

visibilidade_of (elemento) - Verifica se o elemento é visível na página que é o elemento tem largura e altura maior que 0.

visibilidade_of_element_located (locator) -

presença_of_element_located (localizador) - Verifique se 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.

presença_of_all_element_located () - Garante que todo o elemento correspondente pelo localizador está presente na página. O localizador é um (Por, seletor) tupla.

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

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

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

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

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

Conclusão:

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

Para obter mais informações sobre o selênio espera, visite a página oficial de documentação da Biblioteca de Selenium Python.