Skip to content

Instantly share code, notes, and snippets.

@mageekguy
Created April 11, 2022 14:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mageekguy/6430e2a1674eeca4f9dcfa69e13f04a3 to your computer and use it in GitHub Desktop.
Save mageekguy/6430e2a1674eeca4f9dcfa69e13f04a3 to your computer and use it in GitHub Desktop.
Problèmes rencontrés pour configurer Behat + Panther avec les drivers webdriver et goutte
Le contexte :
- Une suite de tests qui doit être exécutée avec un navigateur compatible javascript, pour tester un front en React. Comme j'aimerai éviter la lourdeur de selenium, je voudrais que behat discuter directement avec ledit navigateur via webdriver ;
- Une suite de tests qui doit être exécutée avec un navigateur pas forcément compatible JS, pour tester une API basée sur Symfony 5.4 et pas avec webdriver parce que ce dernier a le mauvais goût de ne pas remonter les codes de status HTTP, ce qui est un peu dérangeant pour tester une API HTTP.
Histoire de corser un peu plus le jeu, tout cela doit s'exécuter dans un environnement docker/docker-compose.
J'ai testé pas mal de choses :
1. https://packagist.org/packages/dmore/chrome-mink-driver : ne fonctionne pas, j'avais l'erreur `Fatal error: Uncaught Error: Call to a member function waitForLoad() on null in /src/vendor/dmore/chrome-mink-driver/src/ChromeDriver.php` dès que j'activais `Beatch/Extension`;
2. `Symfony/Panther` en combo avec `https://github.com/robertfausk/behat-panther-extension`.
J'ai réussi à avoir le combo Panther+behat-panther-extension qui fonctionne, au bémol près qu'au premier lancement des tests, ça plante lamentablement avec cette erreur, et que ça passe les fois suivantes :
```
When I want to check if front is available # App\Tests\Functionals\Contexts\Http::iWantToCheckIfApiIsAvailable()
Curl error thrown for http POST to /session/27f485229c75070999997cf10b7c8e7f/url with params: {"url":"http://front:3000/"}
Operation timed out after 30001 milliseconds with 0 bytes received (Facebook\WebDriver\Exception\WebDriverCurlException)
Then I should see something # App\Tests\Functionals\Contexts\Http::iShouldSeeSomething()
--- Failed scenarios:
/src/features/front/test.feature:6
1 scenario (1 failed)
3 steps (1 passed, 1 failed, 1 skipped)
0m32.22s (17.31Mb)
^C
In HttpCommandExecutor.php line 333:
Curl error thrown for http DELETE to /session/27f485229c75070999997cf10b7c8e7f
Empty reply from server
```
Comme ça commencait à sérieusement m'agacer, je me suis dit que j'allais me détendre en revenant aux fondamentaux avec ce bon vieux driver `goutte`, pour tester l'API.
Je l'ai donc installé, et j'ai modifié mon `behat.yaml` de la manière suivante :
```
default:
calls:
error_reporting: 16383 # E_ALL & ~E_USER_DEPRECATED, obligatoire pour éviter d'avoir une polymégachié d'exception `DEPRECATED`
front:
suites:
defaults:
paths:
features: 'features/front'
contexts:
- Behat\MinkExtension\Context\MinkContext
- App\Tests\Functionals\Contexts\Http
extensions:
Robertfausk\Behat\PantherExtension: ~
Behat\MinkExtension:
base_url: "http://front:3000"
panther:
options:
browser: 'chrome'
sessions:
default:
panther: ~
api:
suites:
defaults:
paths:
features: 'features/api'
contexts:
- Behat\MinkExtension\Context\MinkContext
- App\Tests\Functionals\Contexts\Http
extensions:
Behat\MinkExtension:
base_url: "http://back"
default_session: goutte
sessions:
default:
goutte: ~
```
Or, un `beaht -p api` a le très mauvais goût de me sortir la fortement déplaisante erreur suivante :
```
In GoutteFactory.php line 117:
Method Goutte\Client::setClient() does not exist
```
Quelques recherches sur le Net m'ont fait comprendre que je n'étais pas le seul dans ce cas, mais je n'ai trouvé aucune solution dans le contexte spécifique de Behat.
@mageekguy
Copy link
Author

Dernière information potentiellement utile, mon composer.json (expurgé de ce qui n'est pas relatif à Behat/Panther/Mink) :

        "behat/behat": "*",
        "behat/mink-browserkit-driver": "^2.1",
        "friends-of-behat/mink-extension": "^2.6",
        "phpunit/phpunit": "*",
        "robertfausk/behat-panther-extension": "*",
        "robertfausk/mink-panther-driver": "dev-master",
        "symfony/browser-kit": "^5.4",
        "symfony/panther": "^2.0",
        "symfony/phpunit-bridge": "^5.4",
    }

@mageekguy
Copy link
Author

Ce hack dans GoutteFactory.php a permis de supprimer l'erreur Method Goutte\Client::setClient() does not exist :

    private function isGoutte1()
    {
        try {
            $refl = new \ReflectionParameter(array('Goutte\Client', 'setClient'), 0);

            $type = $refl->getType();
            if ($type instanceof \ReflectionNamedType && 'Guzzle\Http\ClientInterface' === $type->getName()) {
                return true;
            }

        } catch (\Exception $exception) {
            $goutteClass = new \ReflectionClass('Goutte\Client');

            if ($goutteClass->getParentClass() == 'Symfony\Component\BrowserKit\HttpBrowser') {
                return true;
            }
        }

        return false;
    }

Mais maintenant, j'ai ça :

Fatal error: Uncaught Error: Undefined constant GuzzleHttp\ClientInterface::VERSION in /src/vendor/friends-of-behat/mink-extension/src/Behat/MinkExtension/ServiceContainer/Driver/GoutteFactory.php on line 139

Error: Undefined constant GuzzleHttp\ClientInterface::VERSION in /src/vendor/friends-of-behat/mink-extension/src/Behat/MinkExtension/ServiceContainer/Driver/GoutteFactory.php on line 139

@mageekguy
Copy link
Author

Parce que quelqu'un a trouvé intelligent de remplacer GuzzleHttp\ClientInterface::VERSION par GuzzleHttp\ClientInterface::MAJOR_VERSION et de lui donner la valeur 7 visiblement.
Je vais préparer de ce pas ma poupée vaudou…

@mageekguy
Copy link
Author

Bon, en résumé : https://github.com/Behat/MinkExtension/blob/master/src/Behat/MinkExtension/ServiceContainer/Driver/GoutteFactory.php tel qu'il est défini actuellement est totalement incapable d'instancier correctement un client goutte.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment