예제 #1
0
 /**
  * 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;
 }
예제 #2
0
 /**
  * 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);
     }
 }
예제 #3
0
 /**
  * @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;
 }