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!

2
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;
    }
2 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