I am trying to test my site with Behat.

On my entity edit form, I have a Datetime field that uses the Date and time widget. I want to use the Date and time widget because I need to set the time in increments of seconds, which I cannot do with the Select list widget.

I want to set the value of this field with a step like this:

And I assign the date "yesterday" with timezone "Asia/Tokyo" for "edit-field-datetime-MYFIELD-0-value"

To do so, in FeatureContext.php, I wrote the following code.

   * @Then I assign the date :date with timezone :timezone for :field
   * Assign the specified date to the element with the given CSS.
  public function assertEnterDateForField($field, $timezone, $date_string) {
    $date_field = $field . '-date';
    $time_field = $field . '-time';
    // Drupal stores timezones as UTC so we need the base time in UTC.
    $datetime = new DateTime($date_string, timezone_open('UTC'));
    // We need to convert the UTC time to the user's timezone.
    // This is because when saving the entity,
    // Drupal will convert the value to UTC.
    $date_output_string = $datetime->format('mdY');
    $time_output_string = $datetime->format('hisA');
    $datetime_debug_string = $datetime->format('Y-m-d\TH:i:sO');
    $this->fillfield($time_field, $time_output_string);
    $this->fillField($date_field, $date_output_string);
    echo "Datetime $datetime_debug_string
    Field set to
    date: $date_output_string
    time: $time_output_string";

On my local environment (lando, running the Standalone Chrome container), this code works as expected; the date/time is set correctly for the field.

However, on my test server (Pantheon/CircleCI, running the Behat Chrome Extension, it doesn't work. The debug information is correct; for example:

  │ Datetime 2020-08-13T09:00:00+0900
  │     Field set to
  │     date: 08132020
  │     time: 090000AM

However, the date/time is not actually filled in, so when the entity is saved, the date/time has not been updated.

How can I set the value of a field that uses the Date and time widget with Behat/Mink/Drupal Extension?

2 Answers 2


I haven't been able to find a way to do this, so for now, I rewrote my CI configuration so that I can use Standalone Chrome with Pantheon/CircleCI instead of the Behat Chrome Extension.

When I fill in the date field "Publish on" with "+1 second"

I get it to work with these updates.

   * @Then I fill in the date field :field with :date
   * Assign the specified date to the element.
  public function iFillDateField($field, $date): void {
    $field_label = $this->getSession()->getPage()->find('xpath', "//*[text() = '$field']");
    if ($field_label == NULL | !$field_label->hasClass('form-item__label')) {
      throw new ExpectationException('Could not find date field with label: ' . $field, $this->getSession());

    $datetime = new \DateTime($date, \timezone_open('UTC'));
    $datetime->setTimezone(new \DateTimeZone(\date_default_timezone_get()));

    $date_input = $field_label->getParent()->find('xpath', "//input[@type='date']");
    $date_output_string = $datetime->format('Y-m-d');
    $this->getSession()->getPage()->fillField($date_input->getAttribute('id'), $date_output_string);

    $time_input = $field_label->getParent()->find('xpath', "//input[@type='time']");
    if ($time_input) {
      $time_output_string = $datetime->format('H:i:s');
      $this->getSession()->getPage()->fillField($time_input->getAttribute('id'), $time_output_string);

The key to get it work is to set the right formats for date (Y-m-d) and time (H:i:s).

This step will accept the field label instead of the field id.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.