Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

3
respostas

[Bug] Erro nos testes do PHPUnit

Olá

Estou tendo dois erros ao executar os testes do PHPUnit. Eu segui a recomendação do https://cursos.alura.com.br/forum/topico-falha-nos-testes-227160, porém mesmo assim tive este erro. Poderia me ajudar?

  1. CViniciusSDias\GoogleCrawler\Tests\Functional\DefaultCrawlerTest::testSearchResultsWithoutProxy
    CViniciusSDias\GoogleCrawler\Exception\InvalidGoogleHtmlException: No parsable element found

  2. CViniciusSDias\GoogleCrawler\Tests\Functional\PersonalizedCrawlerTest::testSearchOnBrazilianGoogleWithoutProxy
    CViniciusSDias\GoogleCrawler\Exception\InvalidGoogleHtmlException: No parsable element found

public function testSearchResultsWithoutProxy()
    {
        $searchTerm = new SearchTerm('Test');
        $crawler = new Crawler();

        $results = $crawler->getResults($searchTerm);
        $this->checkResults($results);
    }
public function testSearchOnBrazilianGoogleWithoutProxy()
    {
        $searchTerm = new SearchTerm('Test');
        $crawler = new Crawler(new NoProxy());

        $results = $crawler->getResults($searchTerm, 'google.com.br', 'BR');
        $this->checkResults($results);
    }
public function getResults(
        SearchTermInterface $searchTerm,
        string $googleDomain = 'google.com',
        string $countryCode = ''
    ): ResultList {
        if (stripos($googleDomain, 'google.') === false || stripos($googleDomain, 'http') === 0) {
            throw new \InvalidArgumentException('Invalid google domain');
        }

        $googleUrl = "https://$googleDomain/search?q={$searchTerm}&num=100";
        if (!empty($countryCode)) {
            $googleUrl .= "&gl={$countryCode}";
        }

        $response = $this->proxy->getHttpResponse($googleUrl);
        $stringResponse = (string) $response->getBody();
        $domCrawler = new DomCrawler($stringResponse);
        $googleResultList = $this->createGoogleResultList($domCrawler);

        $resultList = new ResultList($googleResultList->count());

        foreach ($googleResultList as $googleResultElement) {
            try {
                $parsedResult = $this->parseDomElement($googleResultElement);
                $resultList->addResult($parsedResult);
            } catch (InvalidResultException $exception) {
                error_log(
                    'Error parsing the following result: ' . print_r($googleResultElement, true),
                    3,
                    __DIR__ . '/../var/log/crawler-errors.log'
                );
            }
        }

        return $resultList;
    }
private function createGoogleResultList(DomCrawler $domCrawler): DomCrawler
    {
        $googleResultList = $domCrawler->filterXPath('//div[@class="Gx5Zad fP1Qef xpd EtOod pkphOe"]');
        if ($googleResultList->count() === 0) {
            throw new InvalidGoogleHtmlException('No parsable element found');
        }

        return $googleResultList;
    }
3 respostas

Olá, Leonardo! Tudo bem?

Sobre os erros nos testes do PHPUnit durante a execução do projeto, a mensagem InvalidGoogleHtmlException: No parsable element found indica que o código não encontrou os elementos HTML esperados na página retornada pelo Google.

O problema aqui é que esses testes funcionais dependem da estrutura atual da página do Google. Como o Google altera seu HTML com frequência, o seletor XPath utilizado no método createGoogleResultList() pode ter deixado de corresponder aos elementos existentes atualmente.

Veja este exemplo:

O método procura elementos com este XPath:


$googleResultList = $domCrawler->filterXPath('//div[@class="Gx5Zad fP1Qef xpd EtOod pkphOe"]');

Esse trecho tenta localizar uma <div> com uma combinação específica de classes CSS. Se o Google alterar qualquer uma dessas classes, a busca retorna 0 elementos, fazendo com que a exceção seja lançada.

Uma forma de confirmar isso é salvar a resposta recebida antes da criação do DomCrawler para inspecionar o HTML retornado:


file_put_contents('google.html', $stringResponse);

Esse código grava o conteúdo da resposta em um arquivo, permitindo verificar se:

  • O Google alterou a estrutura da página;
  • Foi retornada uma página de verificação (CAPTCHA);
  • Houve algum bloqueio da requisição em vez da página de resultados.

Importante: como esse curso utiliza uma página externa para os testes, é possível que eles deixem de funcionar ao longo do tempo devido a mudanças realizadas pelo próprio Google. Nesses casos, costuma ser necessário atualizar os seletores XPath utilizados pelo crawler para refletir a estrutura atual da página.

Você chegou a abrir o conteúdo retornado pelo Google para verificar se ele ainda contém os resultados da pesquisa ou se está exibindo uma página diferente, como um CAPTCHA ou uma tela de bloqueio?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!
Conteúdos relacionados

Olá Armano

Essa é a URL (Valor da variável $googleUrl): https://google.com.br/search?q=Test&num=100&gl=BR
Imagem da pesquisa do Google

Gerei o arquivo google.html e abri no navegador:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá, Leonardo! Tudo bem?

Sobre os erros nos testes do PHPUnit, a imagem confirma o motivo da exceção. Na última mensagem, você mostrou que a URL está retornando uma página do Google com verificação de segurança, e não a página de resultados da pesquisa. Dessa forma, o método createGoogleResultList() não encontra os elementos esperados e lança a exceção InvalidGoogleHtmlException. :contentReference[oaicite:0]{index=0}

O problema aqui é que o teste depende de uma requisição real ao Google, e atualmente o Google costuma bloquear esse tipo de acesso automático, retornando uma página de verificação ou CAPTCHA. Como consequência, este trecho:


$googleResultList = $domCrawler->filterXPath('//div[@class="Gx5Zad fP1Qef xpd EtOod pkphOe"]');

Não encontra nenhum elemento correspondente, pois o HTML recebido não contém os resultados da busca.

Como esse é um teste funcional baseado em um serviço externo, ele pode deixar de funcionar com o tempo devido a mudanças na estrutura da página ou aos mecanismos de proteção do próprio Google. Nesse cenário, não há um ajuste no seu código que resolva definitivamente o problema.

Se o objetivo é apenas acompanhar o curso, você pode prosseguir normalmente, pois o comportamento está relacionado à resposta do Google e não à implementação realizada durante as aulas.

Uma curiosidade: ao abrir o arquivo google.html, você conseguiu identificar se a página exibia um CAPTCHA, uma mensagem de "Unusual traffic" ou algum outro tipo de bloqueio do Google?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!