windowsdockergoogle-chromebehatmink

How to fix "unexpected token" when I want to upload a file into a field with the function attachFileToField? Behat Mink


I use docker on Windows to drive a Google chrome navigator to test pages on my local webapp. Everything works perfectly but I got a problem when I need to insert an image.jpg into a file field.

When I tried to fix this, I create a blank page with only a html field

This scenario works on a Linux VM !

Console Error :

    Quand je rajoute dans le champ file le fichier 'C:\dev\tests\tmp\photos\potato.jpg' # FeatureContext::jeRajouteDansLeChampFileLeFichier()
      Behat\Mink\Exception\DriverException: SyntaxError: Invalid or unexpected token in vendor\dmore\chrome-mink-driver\src\ChromeDriver.php:1000
      Stack trace:
      #0 vendor\dmore\chrome-mink-driver\src\ChromeDriver.php(511): DMore\ChromeDriver\ChromeDriver->evaluateScript('var xpath_resul...')
      #1 vendor\behat\mink\src\Driver\CoreDriver.php(101): DMore\ChromeDriver\ChromeDriver->findElementXpaths('//html/.//*\r\n[s...')
      #2 vendor\behat\mink\src\Element\Element.php(168): Behat\Mink\Driver\CoreDriver->find('//html/.//*\r\n[s...')
      #3 vendor\behat\mink\src\Element\Element.php(157): Behat\Mink\Element\Element->findAll('named_exact', Array)
      #4 vendor\behat\mink\src\Element\Element.php(146): Behat\Mink\Element\Element->findAll('named', Array)
      #5 vendor\behat\mink\src\Element\TraversableElement.php(139): Behat\Mink\Element\Element->find('named', Array)
      #6 vendor\behat\mink\src\Element\TraversableElement.php(289): Behat\Mink\Element\TraversableElement->findField('monUpload')
      #7 features\bootstrap\FeatureContext.php(536): Behat\Mink\Element\TraversableElement->attachFileToField('monUpload', 'C:\\dev\\test...')
      #8 [internal function]: FeatureContext->jeRajouteDansLeChampFileLeFichier('C:\\dev\\test...')
      #9 vendor\behat\behat\src\Behat\Testwork\Call\Handler\RuntimeCallHandler.php(109): call_user_func_array(Array, Array)
      #10 vendor\behat\behat\src\Behat\Testwork\Call\Handler\RuntimeCallHandler.php(64): Behat\Testwork\Call\Handler\RuntimeCallHandler->executeCall(Object(Behat\Behat\Definition\Call\DefinitionCall))
      #11 vendor\behat\behat\src\Behat\Testwork\Call\CallCenter.php(140): Behat\Testwork\Call\Handler\RuntimeCallHandler->handleCall(Object(Behat\Behat\Definition\Call\DefinitionCall))
      #12 vendor\behat\behat\src\Behat\Testwork\Call\CallCenter.php(96): Behat\Testwork\Call\CallCenter->handleCall(Object(Behat\Behat\Definition\Call\DefinitionCall))
      #13 vendor\behat\behat\src\Behat\Behat\Tester\Runtime\RuntimeStepTester.php(125): Behat\Testwork\Call\CallCenter->makeCall(Object(Behat\Behat\Definition\Call\DefinitionCall))
      #14 vendor\behat\behat\src\Behat\Behat\Tester\Runtime\RuntimeStepTester.php(73): Behat\Behat\Tester\Runtime\RuntimeStepTester->testDefinition(Object(Behat\Behat\Context\Environment\InitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\StepNode), Object(Behat\Behat\Definition\SearchResult), false)
      #15 vendor\behat\behat\src\Behat\Behat\Hook\Tester\HookableStepTester.php(74): Behat\Behat\Tester\Runtime\RuntimeStepTester->test(Object(Behat\Behat\Context\Environment\InitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\StepNode), false)
      #16 vendor\behat\behat\src\Behat\Behat\EventDispatcher\Tester\EventDispatchingStepTester.php(73): Behat\Behat\Hook\Tester\HookableStepTester->test(Object(Behat\Behat\Context\Environment\InitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\StepNode), false)
      #17 vendor\behat\behat\src\Behat\Behat\Tester\StepContainerTester.php(59): Behat\Behat\EventDispatcher\Tester\EventDispatchingStepTester->test(Object(Behat\Behat\Context\Environment\InitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\StepNode), false)
      #18 vendor\behat\behat\src\Behat\Behat\Tester\Runtime\RuntimeScenarioTester.php(76): Behat\Behat\Tester\StepContainerTester->test(Object(Behat\Behat\Context\Environment\InitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
      #19 vendor\behat\behat\src\Behat\Behat\Hook\Tester\HookableScenarioTester.php(74): Behat\Behat\Tester\Runtime\RuntimeScenarioTester->test(Object(Behat\Behat\Context\Environment\InitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
      #20 vendor\behat\behat\src\Behat\Behat\EventDispatcher\Tester\EventDispatchingScenarioTester.php(103): Behat\Behat\Hook\Tester\HookableScenarioTester->test(Object(Behat\Behat\Context\Environment\InitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
      #21 vendor\behat\behat\src\Behat\Behat\Tester\Runtime\IsolatingScenarioTester.php(69): Behat\Behat\EventDispatcher\Tester\EventDispatchingScenarioTester->test(Object(Behat\Behat\Context\Environment\InitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
      #22 vendor\behat\behat\src\Behat\Behat\Tester\Runtime\RuntimeFeatureTester.php(84): Behat\Behat\Tester\Runtime\IsolatingScenarioTester->test(Object(Behat\Behat\Context\Environment\UninitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
      #23 vendor\behat\behat\src\Behat\Behat\Hook\Tester\HookableFeatureTester.php(72): Behat\Behat\Tester\Runtime\RuntimeFeatureTester->test(Object(Behat\Behat\Context\Environment\UninitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), false)
      #24 vendor\behat\behat\src\Behat\Behat\EventDispatcher\Tester\EventDispatchingFeatureTester.php(71): Behat\Behat\Hook\Tester\HookableFeatureTester->test(Object(Behat\Behat\Context\Environment\UninitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), false)
      #25 vendor\behat\behat\src\Behat\Testwork\Tester\Runtime\RuntimeSuiteTester.php(63): Behat\Behat\EventDispatcher\Tester\EventDispatchingFeatureTester->test(Object(Behat\Behat\Context\Environment\UninitializedContextEnvironment), Object(Behat\Gherkin\Node\FeatureNode), false)
      #26 vendor\behat\behat\src\Behat\Testwork\Hook\Tester\HookableSuiteTester.php(73): Behat\Testwork\Tester\Runtime\RuntimeSuiteTester->test(Object(Behat\Behat\Context\Environment\UninitializedContextEnvironment), Object(Behat\Testwork\Specification\GroupedSpecificationIterator), false)
      #27 vendor\behat\behat\src\Behat\Testwork\EventDispatcher\Tester\EventDispatchingSuiteTester.php(72): Behat\Testwork\Hook\Tester\HookableSuiteTester->test(Object(Behat\Behat\Context\Environment\UninitializedContextEnvironment), Object(Behat\Testwork\Specification\GroupedSpecificationIterator), false)
      #28 vendor\behat\behat\src\Behat\Testwork\Tester\Runtime\RuntimeExercise.php(71): Behat\Testwork\EventDispatcher\Tester\EventDispatchingSuiteTester->test(Object(Behat\Behat\Context\Environment\UninitializedContextEnvironment), Object(Behat\Testwork\Specification\GroupedSpecificationIterator), false)
      #29 vendor\behat\behat\src\Behat\Testwork\EventDispatcher\Tester\EventDispatchingExercise.php(70): Behat\Testwork\Tester\Runtime\RuntimeExercise->test(Array, false)
      #30 vendor\behat\behat\src\Behat\Testwork\Ordering\OrderedExercise.php(80): Behat\Testwork\EventDispatcher\Tester\EventDispatchingExercise->test(Array, false)
      #31 vendor\behat\behat\src\Behat\Testwork\Tester\Cli\ExerciseController.php(149): Behat\Testwork\Ordering\OrderedExercise->test(Array, false)
      #32 vendor\behat\behat\src\Behat\Testwork\Tester\Cli\ExerciseController.php(108): Behat\Testwork\Tester\Cli\ExerciseController->testSpecifications(Object(Symfony\Component\Console\Input\ArgvInput), Array)
      #33 vendor\behat\behat\src\Behat\Testwork\Cli\Command.php(63): Behat\Testwork\Tester\Cli\ExerciseController->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #34 vendor\symfony\console\Command\Command.php(255): Behat\Testwork\Cli\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #35 vendor\symfony\console\Application.php(915): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #36 vendor\symfony\console\Application.php(272): Symfony\Component\Console\Application->doRunCommand(Object(Behat\Testwork\Cli\Command), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #37 vendor\behat\behat\src\Behat\Testwork\Cli\Application.php(124): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #38 vendor\symfony\console\Application.php(148): Behat\Testwork\Cli\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #39 vendor\behat\behat\bin\behat(34): Symfony\Component\Console\Application->run()
      #40 {main}
    Et j'attends 10 secondes                                                                  # FeatureContext::jAttendsSecondes()
    Et j'exectute le code javascript "uploader.upload();"                                     # FeatureContext::jexectuteLeCodeJavascript()
    Et j'attends 5 secondes                                                                   # FeatureContext::jAttendsSecondes()

--- Scénarios échoués:

    features\1234-testUpload.feature:6

1 scénario (1 échecs)
6 étapes (2 succès, 1 échecs, 3 ignorés)
0m1.41s (10.42Mb)

composer.json :

{   
    "require": {       
    "behat/behat": "~3.5",      
    "behat/mink": "~1.7@dev",              
    "behat/mink-goutte-driver": "1.2.1",       
    "behat/mink-selenium2-driver": "~1.3.1" ,
    "behat/mink-extension": "*",
    "dmore/chrome-mink-driver":"*",
    "dmore/behat-chrome-extension": "*",
        "symfony/css-selector": "^4.3",
        "symfony/phpunit-bridge": "^4.3"
    },   
    "config": {       
        "bin-dir": "bin/"  
    }
}

featurecontext.php :

    /**
     * @When je rajoute dans le champ file le fichier :arg1
     */
    public function jeRajouteDansLeChampFileLeFichier($arg1)
    {
        $javascipt = <<<HEREDOC
        var elemnt = document.querySelector('input[type="file"] ');
        elemnt.setAttribute('name', 'monUpload');
        elemnt.setAttribute('visibility', 'visible');
HEREDOC;
        $this->getSession()->executeScript($javascipt);
        $this->getSession()->wait( 100 );
        $this->getSession()->getPage()->attachFileToField('monUpload', $arg1);
    }

In this function, the problem is at the last line $this->getSession()->getPage()->attachFileToField(). The rest is working.

feature.feature :

Scénario: Upload Test
    Etant donné que je suis sur "A LOCALHOST URL"
    Et j'attends 1 secondes
    Quand je rajoute dans le champ file le fichier 'potato.jpg'
    Et j'attends 3 secondes

In English feature.feature :

Scenario : Upload Test
Since I'm on "A LOCALHOST URL"
I wait 1 second
When I add in the file field the file 'potato.jpg'
I wait 1 seconds

The scenario crash at "When I add in the file field the file 'PATH TO IMAGE'

I've tried many path:

'C:\dev\potato.jpg'
'\C:\dev\potato.jpg'
'file:\\\C:\dev\potato.jpg'
'C\dev\potato.jpg'
'/C/dev/potato.jpg'
'/c/dev/potato.jpg'

With simple quote and double quote and every kind of notation that probably exist. I try to add a files_path my behat.yml as mentioned in other topics to only set the image.jpg without the complete path.

My English is probably not very good but I've tried Thanks you


Solution

  • To solve my problem, I just simply install Debian from the Windows Store and I execute the feature in my Debian console.

    It work perfectly.