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ênioBaixar 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.
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 webdriverDepois 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.pyComo 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 webdriverDepois 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.pyComo 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.