validateHTML(); * * Validate the HTML of the current page, but ignore errors containing the string "Ignoreit": * $I->validateHTML(["Ignoreme"]); * * * * @license http://www.opensource.org/licenses/mit-license.html MIT License * @author Tobias Hößl */ namespace Helper; use Codeception\TestCase; class HTMLValidator extends \Codeception\Module { /** * @param string $html * @return array * @throws \Exception */ private function validateByVNU($html) { $javaPath = $this->_getConfig('javaPath'); if (!$javaPath) { $javaPath = 'java'; } $vnuPath = $this->_getConfig('vnuPath'); if (!$vnuPath) { $vnuPath = '/usr/local/bin/vnu.jar'; } $filename = DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . uniqid('html-validate') . '.html'; file_put_contents($filename, $html); exec($javaPath . " -Xss1024k -jar " . $vnuPath . " --format json " . $filename . " 2>&1", $return); $data = json_decode($return[0], true); if (!$data || !isset($data['messages']) || !is_array($data['messages'])) { throw new \Exception('Invalid data returned from validation service: ' . $return); } return $data['messages']; } /** * @return string * @throws \Codeception\Exception\ModuleException * @throws \Exception */ private function getPageSource() { if (!$this->hasModule('WebDriver')) { throw new \Exception('This validator needs WebDriver to work'); } /** @var \Codeception\Module\WebDriver $webdriver */ $webdriver = $this->getModule('WebDriver'); return $webdriver->webDriver->getPageSource(); } /** * @param string[] $ignoreMessages */ public function validateHTML($ignoreMessages = []) { $source = $this->getPageSource(); try { $messages = $this->validateByVNU($source); } catch (\Exception $e) { $this->fail($e->getMessage()); return; } $failMessages = []; $lines = explode("\n", $source); foreach ($messages as $message) { if ($message['type'] == 'error') { $formattedMsg = '- Line ' . $message['lastLine'] . ', column ' . $message['lastColumn'] . ': ' . $message['message'] . "\n > " . $lines[$message['lastLine'] - 1]; $ignoring = false; foreach ($ignoreMessages as $ignoreMessage) { if (mb_stripos($formattedMsg, $ignoreMessage) !== false) { $ignoring = true; } } if (!$ignoring) { $failMessages[] = $formattedMsg; } } } if (count($failMessages) > 0) { \PHPUnit_Framework_Assert::fail('Invalid HTML: ' . "\n" . implode("\n", $failMessages)); } } }