Python Web Scraping - Teste com Scrapers
Este capítulo explica como realizar testes usando web scrapers em Python.
Introdução
Em grandes projetos da web, o teste automatizado de back-end do site é executado regularmente, mas o teste de front-end é frequentemente ignorado. A principal razão por trás disso é que a programação de sites é como uma rede de várias linguagens de marcação e programação. Podemos escrever um teste de unidade para um idioma, mas se torna um desafio se a interação estiver sendo feita em outro idioma. É por isso que devemos ter um conjunto de testes para garantir que nosso código esteja funcionando de acordo com nossa expectativa.
Teste usando Python
Quando falamos de teste, isso significa teste de unidade. Antes de mergulhar fundo nos testes com Python, devemos conhecer os testes de unidade. A seguir estão algumas das características dos testes de unidade -
Pelo menos um aspecto da funcionalidade de um componente seria testado em cada teste de unidade.
Cada teste de unidade é independente e também pode ser executado de forma independente.
O teste de unidade não interfere no sucesso ou falha de qualquer outro teste.
Os testes de unidade podem ser executados em qualquer ordem e devem conter pelo menos uma afirmação.
Unittest - Módulo Python
O módulo Python denominado Unittest para teste de unidade vem com toda a instalação padrão do Python. Só precisamos importá-lo e o resto fica a cargo da classe unittest.TestCase que fará o seguinte -
As funções SetUp e tearDown são fornecidas pela classe unittest.TestCase. Essas funções podem ser executadas antes e depois de cada teste de unidade.
Ele também fornece instruções assert para permitir que os testes sejam aprovados ou reprovados.
Ele executa todas as funções que começam com test_ como teste de unidade.
Exemplo
Neste exemplo, vamos combinar web scraping com unittest. Vamos testar a página da Wikipedia para pesquisar a string 'Python'. Basicamente, ele fará dois testes: primeiro, se a página de título for igual à string de pesquisa, ou seja, 'Python' ou não, e o segundo teste verificará se a página tem um div de conteúdo.
Primeiro, importaremos os módulos Python necessários. Estamos usando o BeautifulSoup para web scraping e, claro, teste de unidade para teste.
from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest
Agora precisamos definir uma classe que estenderá unittest.TestCase. O objeto global bs seria compartilhado entre todos os testes. Uma função setUpClass especificada por unittest fará isso. Aqui definiremos duas funções, uma para testar a página de título e outra para testar o conteúdo da página.
class Test(unittest.TestCase):
bs = None
def setUpClass():
url = '<a target="_blank" rel="nofollow" href="https://en.wikipedia.org/wiki/Python">https://en.wikipedia.org/wiki/Python'</a>
Test.bs = BeautifulSoup(urlopen(url), 'html.parser')
def test_titleText(self):
pageTitle = Test.bs.find('h1').get_text()
self.assertEqual('Python', pageTitle);
def test_contentExists(self):
content = Test.bs.find('div',{'id':'mw-content-text'})
self.assertIsNotNone(content)
if __name__ == '__main__':
unittest.main()
Depois de executar o script acima, obteremos a seguinte saída -
----------------------------------------------------------------------
Ran 2 tests in 2.773s
OK
An exception has occurred, use %tb to see the full traceback.
SystemExit: False
D:\ProgramData\lib\site-packages\IPython\core\interactiveshell.py:2870:
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Testando com Selênio
Vamos discutir como usar o Python Selenium para testes. É também chamado de teste de selênio. Ambos Pythonunittest e Seleniumnão têm muito em comum. Sabemos que o Selenium envia os comandos padrão do Python para diferentes navegadores, apesar das variações no design de seus navegadores. Lembre-se de que já instalamos e trabalhamos com o Selenium nos capítulos anteriores. Aqui, criaremos scripts de teste no Selenium e os usaremos para automação.
Exemplo
Com a ajuda do próximo script Python, estamos criando um script de teste para a automação da página de login do Facebook. Você pode modificar o exemplo para automatizar outros formulários e logins de sua escolha, porém o conceito seria o mesmo.
Primeiro, para conectar ao navegador da web, vamos importar o driver da web do módulo selenium -
from selenium import webdriver
Agora, precisamos importar chaves do módulo de selênio.
from selenium.webdriver.common.keys import Keys
Em seguida, precisamos fornecer nome de usuário e senha para fazer login em nossa conta do Facebook
user = "[email protected]"
pwd = ""
Em seguida, forneça o caminho para o driver da web do Chrome.
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get("http://www.facebook.com")
Agora vamos verificar as condições usando a palavra-chave assert.
assert "Facebook" in driver.title
Com a ajuda da seguinte linha de código, estamos enviando valores para a seção de e-mail. Aqui estamos pesquisando por seu id, mas podemos fazer isso pesquisando por nome comodriver.find_element_by_name("email").
element = driver.find_element_by_id("email")
element.send_keys(user)
Com a ajuda da seguinte linha de código, estamos enviando valores para a seção de senha. Aqui estamos pesquisando por seu id, mas podemos fazer isso pesquisando por nome comodriver.find_element_by_name("pass").
element = driver.find_element_by_id("pass")
element.send_keys(pwd)
A próxima linha de código é usada para pressionar enter / login após inserir os valores no campo e-mail e senha.
element.send_keys(Keys.RETURN)
Agora vamos fechar o navegador.
driver.close()
Depois de executar o script acima, o navegador Chrome será aberto e você poderá ver o e-mail e a senha sendo inseridos e clicado no botão de login.
Comparação: unittest ou selênio
A comparação de teste de unidade e selênio é difícil porque se você deseja trabalhar com grandes suítes de teste, a rigidez sintática das unidades é necessária. Por outro lado, se você for testar a flexibilidade do site, o teste Selenium seria nossa primeira escolha. Mas e se pudermos combinar os dois. Podemos importar selênio para o teste de unidade Python e obter o melhor de ambos. O Selenium pode ser usado para obter informações sobre um site e o unittest pode avaliar se essas informações atendem aos critérios para passar no teste ou não.
Por exemplo, estamos reescrevendo o script Python acima para automação de login do Facebook, combinando os dois da seguinte maneira -
import unittest
from selenium import webdriver
class InputFormsCheck(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(r'C:\Users\gaurav\Desktop\chromedriver')
def test_singleInputField(self):
user = "[email protected]"
pwd = ""
pageUrl = "http://www.facebook.com"
driver=self.driver
driver.maximize_window()
driver.get(pageUrl)
assert "Facebook" in driver.title
elem = driver.find_element_by_id("email")
elem.send_keys(user)
elem = driver.find_element_by_id("pass")
elem.send_keys(pwd)
elem.send_keys(Keys.RETURN)
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()