context = $parameters; } /** * Get Mink session from MinkContext */ public function getSession($name = null) { return $this->getMainContext()->getSession($name); } /** * Returns fixed step argument (with \\" replaced back to "). * Copied from {@see MinkContext} * * @param string $argument * @return string */ protected function fixStepArgument($argument) { return str_replace('\\"', '"', $argument); } /** * @Then /^I should( not? |\s*)see an edit page form$/ */ public function stepIShouldSeeAnEditPageForm($negative) { $page = $this->getSession()->getPage(); $form = $page->find('css', '#Form_EditForm'); if(trim($negative)) { assertNull($form, 'I should not see an edit page form'); } else { assertNotNull($form, 'I should see an edit page form'); } } /** * @When /^I fill in the "(?P(?:[^"]|\\")*)" HTML field with "(?P(?:[^"]|\\")*)"$/ * @When /^I fill in "(?P(?:[^"]|\\")*)" for the "(?P(?:[^"]|\\")*)" HTML field$/ */ public function stepIFillInTheHtmlFieldWith($field, $value) { $inputField = $this->getHtmlField($field); $value = $this->fixStepArgument($value); $this->getSession()->evaluateScript(sprintf( "jQuery('#%s').entwine('ss').getEditor().setContent('%s')", $inputField->getAttribute('id'), addcslashes($value, "'") )); } /** * @When /^I append "(?P(?:[^"]|\\")*)" to the "(?P(?:[^"]|\\")*)" HTML field$/ */ public function stepIAppendTotheHtmlField($field, $value) { $inputField = $this->getHtmlField($field); $value = $this->fixStepArgument($value); $this->getSession()->evaluateScript(sprintf( "jQuery('#%s').entwine('ss').getEditor().insertContent('%s')", $inputField->getAttribute('id'), addcslashes($value, "'") )); } /** * @Then /^the "(?P(?:[^"]|\\")*)" HTML field should(?P not? |\s*)contain "(?P.*)"$/ */ public function theHtmlFieldShouldContain($locator, $negative, $html) { $element = $this->getHtmlField($locator); $actual = $element->getValue(); $regex = '/'.preg_quote($html, '/').'/ui'; $failed = false; if(trim($negative)) { if (preg_match($regex, $actual)) { $failed = true; } } else { if (!preg_match($regex, $actual)) { $failed = true; } } if($failed) { $message = sprintf( 'The string "%s" should%sbe found in the HTML of the element matching name "%s". Actual content: "%s"', $html, $negative, $locator, $actual ); throw new ElementHtmlException($message, $this->getSession(), $element); } } // @codingStandardsIgnoreStart /** * Checks formatting in the HTML field, by analyzing the HTML node surrounding * the text for certain properties. * * Example: Given "my text" in the "Content" HTML field should be right aligned * Example: Given "my text" in the "Content" HTML field should not be bold * * @todo Use an actual DOM parser for more accurate assertions * * @Given /^"(?P([^"]*))" in the "(?P(?:[^"]|\\")*)" HTML field should(?P(?: not)?) be (?P(.*))$/ */ public function stepContentInHtmlFieldShouldHaveFormatting($text, $field, $negate, $formatting) { $inputField = $this->getHtmlField($field); $crawler = new Crawler($inputField->getValue()); $matchedNode = null; foreach($crawler->filterXPath('//*') as $node) { if( $node->firstChild && $node->firstChild->nodeType == XML_TEXT_NODE && stripos($node->firstChild->nodeValue, $text) !== FALSE ) { $matchedNode = $node; } } assertNotNull($matchedNode); $assertFn = $negate ? 'assertNotEquals' : 'assertEquals'; if($formatting == 'bold') { call_user_func($assertFn, 'strong', $matchedNode->nodeName); } else if($formatting == 'left aligned') { if($matchedNode->getAttribute('style')) { call_user_func($assertFn, 'text-align: left;', $matchedNode->getAttribute('style')); } } else if($formatting == 'right aligned') { call_user_func($assertFn, 'text-align: right;', $matchedNode->getAttribute('style')); } } // @codingStandardsIgnoreEnd /** * Selects the first textual match in the HTML editor. Does not support * selection across DOM node boundaries. * * @When /^I select "(?P([^"]*))" in the "(?P(?:[^"]|\\")*)" HTML field$/ */ public function stepIHighlightTextInHtmlField($text, $field) { $inputField = $this->getHtmlField($field); $inputFieldId = $inputField->getAttribute('id'); $text = addcslashes($text, "'"); $js = <<getSession()->executeScript($js); } /** * Example: I should see a "Submit" button * Example: I should not see a "Delete" button * * @Given /^I should( not? |\s*)see a "([^"]*)" button$/ */ public function iShouldSeeAButton($negative, $text) { $page = $this->getSession()->getPage(); $els = $page->findAll('named', array('link_or_button', "'$text'")); $matchedEl = null; foreach($els as $el) { if($el->isVisible()) $matchedEl = $el; } if(trim($negative)) { assertNull($matchedEl, sprintf('%s button found', $text)); } else { assertNotNull($matchedEl, sprintf('%s button not found', $text)); } } /** * @Given /^I should( not? |\s*)see a "([^"]*)" field$/ */ public function iShouldSeeAField($negative, $text) { $page = $this->getSession()->getPage(); $els = $page->findAll('named', array('field', "'$text'")); $matchedEl = null; foreach($els as $el) { if($el->isVisible()) $matchedEl = $el; } if(trim($negative)) { assertNull($matchedEl); } else { assertNotNull($matchedEl); } } /** * Locate a HTML editor field * * @param string $locator Raw html field identifier as passed from * @return NodeElement */ protected function getHtmlField($locator) { $locator = $this->fixStepArgument($locator); $page = $this->getSession()->getPage(); $element = $page->find('css', 'textarea.htmleditor[name=\'' . $locator . '\']'); assertNotNull($element, sprintf('HTML field "%s" not found', $locator)); return $element; } }