Dero
Dero

Reputation: 309

File upload with Behat, Mink & PhantomJS

I am trying to upload a file using Behat. Therefore I wrote this simple HTML page:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    <form method="post" enctype="multipart/form-data">
      <input type="file" name="file" id="file" /><br />
      <input type="submit" />
    </form>
  </body>
</html>

and a simple Behat feature:

Feature: test
  Scenario: Some Test
    Given I am on "/upload.php"
    And I attach the file "/path/to/tile" to "file"

When the I attach the file ... to ... phrase is executed, the selenium 2 driver generates a curl request and sends it to PhantomJS: http://localhost:4444/wd/hub/session/5b9a8630-ed8e-11e4-956f-956a9ce75127/element/:wdc:1430215640681/value with params: {"value":["\/path\/to\/file"]}

The request does not terminate unless aborting it and PhantomJS does not react on the request in any way.

I already searched through the net and found several threads saying that it does work and several saying that does not work including an issue on github (https://github.com/detro/ghostdriver/issues/282) which was closed and reopend multiple times.

Versions: PhantomJS: 2.0.0 Behat: 3.0.15 Mink: 1.6.1 Mink-Selenium2-Driver: 1.2.0

Does anyone know a working solution for this problem?

Upvotes: 4

Views: 1124

Answers (1)

Vaviloff
Vaviloff

Reputation: 16838

Could this behaviour exist due to inability to upload files that is a known bug with PhantomJS v 2.0.0?

Basically, a change made in Qt 4.8 and incorporated subsequently in Qt 5.0 prevented clicking on file input elements that were not caused by user gestures.

The solution is discussed further in the issue thread.

To quote, you have to comment one if condition in
/src/qt/qtwebkit/Source/WebCore/html/FileInputType.cpp

//if (!ScriptController::processingUserGesture())
//    return;

then compile the binary.

Upvotes: 1

Related Questions