2015-08-22 7 views
2

Я пишу тест, чтобы проверить мое понимание XPath с DomCrawler Symfony в:XPath: получить значение, используя относительный путь (PHP, Symfony, DOMCrawler) ошибки

$crawler = new Crawler(); 
$crawler->add('<foo><foo>bar</foo></foo>'); 
$crawlerWithNodes = $crawler->filterXPath('/foo/foo'); 

$this->assertEquals('bar', $crawlerWithNodes->text()); 

Но приведенные выше результаты:

InvalidArgumentException: текущий список узлов пуст.

На линии:

$ this-> assertEquals ('бар', $ crawlerWithNodes-> текст());

Что я делаю неправильно?

ответ

1

Вам необходимо загрузить контент как DOMDocument вместо простой строки (интерпретируется как HTML).

Вам также необходимо добавить префикс _root в строку xpath, если вы хотите найти абсолютный путь в структуре. См Symfony\Component\DomCrawler\Tests\CrawlerTest Касс для следующего примера (метод testFilterXpathComplexQueries)

Рассмотрит следующий метод испытания:

public function testCrawlerAsHtml() 
    { 
     $crawler = new Crawler(); 
     $crawler->add('<html><body><foo><foo>bar</foo></foo></body></html>'); 
     //die(var_dump($crawler->html())); 
     $crawlerWithNodes = $crawler->filterXPath('/_root/html/body/foo/foo'); 

     $this->assertEquals('bar', $crawlerWithNodes->text()); 
    } 

    public function testCrawlerAsDomElement() 
    { 
     $dom = new \DOMDocument(); 
     $dom->loadXML('<foo><foo>bar</foo></foo>'); 
     $crawler = new Crawler(); 
     $crawler->add($dom); 
//  die(var_dump($crawler->html())); 
     $crawlerWithNodes = $crawler->filterXPath('/_root/foo/foo'); 

     $this->assertEquals('bar', $crawlerWithNodes->text()); 
    } 

Надеется, что это поможет