O ReCaptcha (é o popular
"captcha" ) é uma das coisas mais dolorosas que um autômato de teste pode encontrar a caminho. Milhares de vídeos gravados por imigrantes da ensolarada Índia estão andando na Web sobre o que dança com um pandeiro, é possível enganar esta fera. De fato, é bastante difícil tentar interagir com os scripts programados com algo cujo objetivo principal é garantir que "você não seja um robô".
Um aviso muito importante:
é impossível enganar um captcha.Se você já encontrou esse problema e está lendo este artigo tentando pesquisar no Google uma receita para uma panacéia, saiba que ele não existe. Além disso, na sua cabeça, provavelmente surgiram idéias inovadoras sobre como simular o comportamento realista do usuário usando o WebDriver, através da sobrecarga aleatória de elementos do mouse, cliques nas entradas e colocação cuidadosa do Thread.sleep (). É absolutamente sabido que essa abordagem não funcionará, não perca seu tempo em vão.
Acontece que não há saída?Nem tudo é tão pessimista. Às vezes, basta tentar dar a resposta mais precisa à pergunta "Qual é o desafio que estou enfrentando?" e olhar para a situação mais ampla. Na maioria dos casos, você entenderá que seu objetivo não é enganar o captcha, mas ignorá-lo para testar a funcionalidade oculta por trás dele. No exemplo do meu caso, compartilharei com você as opções que encontrei para resolver a tarefa.
Contexto: integramos parte de nosso produto a um serviço de terceiros e queríamos monitorar se está tudo bem do seu lado, porque eles não cobrem partes de terceiros de sua plataforma. Para ter acesso à nossa funcionalidade, primeiro você precisava fazer login. Foi então que me encontrei com o captcha cara a cara. Em seguida, dou todas as opções que tentei contornar esse problema.
Não trabalhando
Entrar via Google ou Facebook
Além da autenticação clássica, havia o Login canônico com o Google / Facebook. Obviamente, seus "captcha" também estavam presentes lá, então essa opção não ajudou a resolver o problema.
Simule o comportamento do usuário
Sim, eu também tentei. Era engraçado, mas ingênuo demais.
Trabalhadores
Perfis do Chrome / Firefox
Vamos falar sobre a primeira opção "ao vivo". Os drivers para esses navegadores (chromedriver / geckodriver) têm a capacidade de inicializar sob um perfil de usuário predefinido. Ele armazena todas as senhas, cookies, sessões e até o histórico e os favoritos do navegador armazenados. I.e. portanto, simplesmente perdemos a etapa de login absolutamente sem importância para nossa tarefa e, assim, chegamos diretamente à página com o objeto de teste. É implementado da seguinte maneira:
- Crie um perfil de navegador "limpo"
- Insira manualmente o captcha e efetue login no recurso desejado
- Copie o perfil necessário para o nosso projeto (HOWTO para Firefox e Chrome )
Depois disso, precisamos informar ao driver que ele deve ser carregado a partir do perfil especificado:
Firefox:
Chrome:
Essa abordagem mostrou-se boa ao testar em uma máquina local com um navegador instalado e o gecko- / cromedriver'ami usual, mas houve problemas ao executar no Jenkins. Como estamos elevando o hub e os nós do Selenium no cluster Kubernetes, enfrentamos problemas na forma de um diretório que era muito longo para montar o diretório dentro do contêiner (um perfil limpo pesa cerca de 25 MB em média, o que é bastante), além de alguns problemas com os direitos CRUD do navegador, que não pôde fazer alterações no perfil em tempo de execução e caiu com uma execução "erro desconhecido: falha ao gravar o arquivo prefs". Além disso, a atualização do perfil após os cookies e as sessões atingirem suas datas de validade é bastante inconveniente, e eu não queria manter uma pasta enorme com os perfis internos do projeto, portanto, a opção a seguir foi escolhida.
Cookies
“E a caixa acabou de abrir” - foi assim que foi possível descrever a situação, depois de adicionarmos os cookies recebidos manualmente ao driver. O algoritmo de ações é o mais simples possível e não depende do navegador selecionado:
- Faça o login manualmente
- Através da rede, procuramos Cabeçalhos de solicitação -> Cookies que nosso navegador envia
Adicione-os aos nossos testes da seguinte maneira:
O menos óbvio dessa abordagem é a necessidade de alterar manualmente os cookies após o término do período de validade. Mas, como esse período é de 3 meses na plataforma testada, escolhemos esta solução.
E se eu não precisar fazer login?
Mas e a situação em que não se trata de autorização e sessões, mas da execução de uma ação única (por exemplo, fazer um pedido da cesta, registrar um novo usuário etc.)? Aqui a situação é ainda pior. Duas opções que eu poderia encontrar são:
- Concorde com seus desenvolvedores para fornecer algum tipo de solução alternativa. O Google oferece essa oportunidade , mas lembre-se de que você conscientemente faz um pequeno furo na segurança.
- Aproveite os serviços pagos de terceiros que capturam uma captura de tela da sua parte, tente decodificá-la e envie um valor descriptografado. Eu mesmo não tentei esse método e não posso recomendá-lo totalmente.
Resumir
Como você pode ver, não há situações desesperadoras. No entanto, seria tolice negar que absolutamente todas as opções acima tenham suas próprias desvantagens, bastante significativas, portanto a escolha é sua.
Obrigado pela atenção.
PS Se você conhece outras soluções que funcionam na vida real - descreva-as nos comentários, será muito interessante ler.