protected function execute(InputInterface $input, OutputInterface $output) { $licence = $input->getArgument('licence'); $center = $input->getArgument('center'); $filterDate = $input->getOption('filter'); $mail = $input->getOption('mail'); $client = new Client(); $crawler = $client->request('GET', 'https://driverpracticaltest.direct.gov.uk/application'); $output->writeln('Step 1'); $form = $crawler->selectButton('testTypeCar')->form(); $crawler = $client->submit($form); $output->writeln('Step 2'); $form = $crawler->selectButton('drivingLicenceSubmit')->form(); $form->setValues(['driverLicenceNumber' => $licence, 'extendedTest' => 'false', 'specialNeeds' => 'false']); $crawler = $client->submit($form); $output->writeln('Step 3'); $form = $crawler->selectButton('testCentreSubmit')->form(); $form->setValues(['testCentreName' => $center]); $crawler = $client->submit($form); $output->writeln('Step 4'); $link = $crawler->filter('.test-centre-results > li > a')->first()->link(); $crawler = $client->click($link); $output->writeln('Step 5'); $button = $crawler->selectButton('drivingLicenceSubmit'); if ($button->count() == 0) { $output->writeln('Captcha!'); //TODO: display captcha image and ask to solve? Use decaptcha? return; } $form = $button->form(); $date = (new \DateTime())->format('d/m/y'); $form->setValues(['preferredTestDate' => $date]); $crawler = $client->submit($form); $output->writeln('Step 6'); $slots = $crawler->filter('.slotDateTime'); $dates = $slots->each(function ($node, $i) use($output) { return $node->text(); }); if ($filterDate) { $filter = new DateFilter(); $dates = $filter->filterDates($dates, $filterDate); } foreach ($dates as $date) { $output->writeln($date); } if (count($dates) && $mail) { $mailer = new DateMailer(); $mailer->mail($mail, $dates); } }