Created
April 11, 2022 14:16
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
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
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…
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
Dernière information potentiellement utile, mon
composer.json
(expurgé de ce qui n'est pas relatif à Behat/Panther/Mink) :