ReCaptcha bypass em testes de selênio

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.

imagem

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:

  1. Crie um perfil de navegador "limpo"
  2. Insira manualmente o captcha e efetue login no recurso desejado
  3. 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:

//   FirefoxProfile profile = new FirefoxProfile(new File("////")); //      FirefoxOptions options = new FirefoxOptions(); options.setProfile(profile); //   WebDriver driver = new FirefoxDriver(options); 

Chrome:

 //      ChromeOptions options = new ChromeOptions(); options.addArgument("--user-data-dir=/////"); options.addArgument("--profile-directory=____"); //   WebDriver driver = new ChromeDriver(options); 

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:

  1. Faça o login manualmente
  2. Através da rede, procuramos Cabeçalhos de solicitação -> Cookies que nosso navegador envia

Adicione-os aos nossos testes da seguinte maneira:

 //  cookie private static final Cookie COOKIE = new Cookie("", "", "", "", new Date("")); //   WebDriver driver = new ChromeDriver(options); //  cookie   driver.manage().addCookie(COOKIE); 

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:

  1. 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.
  2. 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.

Source: https://habr.com/ru/post/pt442034/


All Articles