/** * Get data from <form> element * * Form is get by $xpath * Return key->value array where key is name of field * * @param ElementFinder $page * @param string $xpath xpath to form * @return array * @throws \Exception */ public static function getDefaultFormData(ElementFinder $page, $xpath) { /** @var ElementFinder $form */ $form = $page->object($xpath, true)->getFirst(); if (empty($form)) { throw new \Exception("Cant find form. Possible invalid xpath "); } $formData = []; # textarea foreach ($form->elements('//textarea') as $textArea) { $formData[$textArea->getAttribute('name')] = $textArea->nodeValue; } # radio and checkboxes foreach ($form->elements('//input[@checked]') as $textArea) { $formData[$textArea->getAttribute('name')] = $textArea->getAttribute('value'); } # hidden, text, submit $hiddenAndTextElements = $form->elements('//input[@type="hidden" or @type="text" or @type="submit" or not(@type)]'); foreach ($hiddenAndTextElements as $element) { $formData[$element->getAttribute('name')] = $element->getAttribute('value'); } # select $selectItems = $form->object('//select', true); foreach ($selectItems as $select) { $name = $select->attribute('//select/@name')->item(0); $option = $select->value('//option[@selected]'); if (!isset($option[0])) { $option = $select->value('//option[1]'); } $formData[$name] = $option->item(0); } return $formData; }
/** * Convert relative links, images scr and form actions to absolute * * @param ElementFinder $page * @param string $affectedUrl */ public static function convertUrlsToAbsolute(ElementFinder $page, $affectedUrl) { $affected = new Uri($affectedUrl); $srcElements = $page->element('//*[@src] | //*[@href] | //form[@action]'); $baseUrl = $page->value('//base/@href')->getFirst(); foreach ($srcElements as $element) { $attributeName = 'href'; if ($element->hasAttribute('action') === true and $element->tagName === 'form') { $attributeName = 'action'; } else { if ($element->hasAttribute('src') === true) { $attributeName = 'src'; } } $relative = $element->getAttribute($attributeName); # don`t change javascript in href if (preg_match('!^\\s*javascript\\s*:\\s*!', $relative)) { continue; } if (parse_url($relative) === false) { continue; } if (!empty($baseUrl) and !preg_match('!^(/|http)!i', $relative)) { $relative = Uri::resolve(new Uri($baseUrl), $relative); } $url = Uri::resolve($affected, (string) $relative); $element->setAttribute($attributeName, (string) $url); } }
/** * @param string $xpath * @param bool $outerHtml * @throws \Exception * @return ObjectCollection */ public function object($xpath, $outerHtml = false) { $options = $this->getOptions(); $type = $this->getType(); $items = $this->query($xpath); $collection = new ObjectCollection(); foreach ($items as $node) { /** @var \DOMElement $node */ if ($outerHtml) { $html = NodeHelper::getOuterHtml($node); } else { $html = NodeHelper::getInnerHtml($node); } if (trim($html) === "") { $html = $this->getEmptyDocumentHtml(); } $elementFinder = new ElementFinder($html, $type, $options); $elementFinder->setExpressionTranslator($this->expressionTranslator); $collection[] = $elementFinder; } return $collection; }