/**
  * Sets the value(s) of a select element.
  *
  * Seems an easy select, but there are lots of combinations
  * of browsers and operative systems and each one manages the
  * autosubmits and the multiple option selects in a different way.
  *
  * @param string $value plain value or comma separated values if multiple. Commas in values escaped with backslash.
  * @return void
  */
 public function set_value($value)
 {
     // Is the select multiple?
     $multiple = $this->field->hasAttribute('multiple');
     $singleselect = $this->field->hasClass('singleselect') || $this->field->hasClass('urlselect');
     // Here we select the option(s).
     if ($multiple) {
         // Split and decode values. Comma separated list of values allowed. With valuable commas escaped with backslash.
         $options = preg_replace('/\\\\,/', ',', preg_split('/(?<!\\\\),/', trim($value)));
         // This is a multiple select, let's pass the multiple flag after first option.
         $afterfirstoption = false;
         foreach ($options as $option) {
             $this->field->selectOption(trim($option), $afterfirstoption);
             $afterfirstoption = true;
         }
     } else {
         // By default, assume the passed value is a non-multiple option.
         $this->field->selectOption(trim($value));
     }
     // Wait for all the possible AJAX requests that have been
     // already triggered by selectOption() to be finished.
     if ($this->running_javascript()) {
         // Trigger change event as this is needed by some drivers (Phantomjs). Don't do it for
         // Singleselect as this will cause multiple event fire and lead to race-around condition.
         $browser = \Moodle\BehatExtension\Driver\MoodleSelenium2Driver::getBrowser();
         if (!$singleselect && $browser == 'phantomjs') {
             $script = "Syn.trigger('change', {}, {{ELEMENT}})";
             $this->session->getDriver()->triggerSynScript($this->field->getXpath(), $script);
         }
         $this->session->wait(behat_base::TIMEOUT * 1000, behat_base::PAGE_READY_JS);
     }
 }
 /**
  * We print the site info + driver used and OS.
  *
  * At this point behat_hooks::before_suite() already
  * ran, so we have $CFG and family.
  *
  * @param SuiteEvent $event
  * @return void
  */
 public function beforeSuite(SuiteEvent $event)
 {
     global $CFG;
     require_once $CFG->dirroot . '/lib/behat/classes/util.php';
     $browser = \Moodle\BehatExtension\Driver\MoodleSelenium2Driver::getBrowser();
     // Calling all directly from here as we avoid more behat framework extensions.
     $runinfo = \behat_util::get_site_info();
     $runinfo .= 'Server OS "' . PHP_OS . '"' . ', Browser: "' . $browser . '"' . PHP_EOL;
     $runinfo .= 'Behat specific fixes have been applied. See http://docs.moodle.org/dev/Acceptance_testing#Browser_specific_fixes' . PHP_EOL;
     $runinfo .= 'Started at ' . date('d-m-Y, H:i', time());
     $this->writeln($runinfo);
 }