2013-09-30 11 views
5

Ten skrypt działa:PhantomJS: nie setContent pracuje gdy HTML posiada aktywa

var page = require('webpage').create(); 

var html = '<h1>Test</h1><img>'; //works with page.setContent and page.content 
//var html = '<h1>Test</h1><img src=".">'; //only works with page.content 

page.setContent(html, 'http://github.com'); 
//page.content = html; 

page.render('test.png'); 
phantom.exit(); 

ale dodając atrybut do imgsrc sprawia, że ​​nie cicho (page.render powraca false a nie obraz jest generowany).

Ustawienie page.content działa bezpośrednio w obu przypadkach, ale względne adresy URL nie działają. To samo dzieje się z innymi tagami, które ładują zasoby, takie jak link. Nie ma znaczenia, czy powiązany zasób istnieje, czy nie. Testowane w wersjach 1.8.1 i 1.9.2.

Czy to błąd, czy źle zrozumiałem interfejs API?

+0

Wysłany jako problem na co https://github.com/ariya/phantomjs/issues/11656 – Tamlyn

Odpowiedz

4

Nie można renderować strony internetowej, jeśli nie jest ona w pełni załadowana.

Podczas ustawiania łącza lub src na <img>, Spróbuje załadować obraz asynchronicznie. To wymaga czekania na zakończenie ładowania.

Spróbuj użyć następującego kodu.

page.onLoadFinished = function(status) { 
    page.render('test.png'); 
    phantom.exit(); 
}; 
page.setContent(html, 'http://github.com'); 
+0

To nie nazywa się w ogóle, czy strony internetowe są tworzone w pętli for wydaje. Nie mogłem wykonać konwersji wsadowej SVG do PNG z twoim podejściem, chociaż działało idealnie dla jednego pliku. – CoDEmanX

+0

@CoDEmanX: W przypadku przetwarzania wsadowego zawsze możesz wywołać własną funkcję, powiedz 'loadNextSVG()' zamiast 'phantom.exit()', która ustawia na stronie nowy kontekst SVG, a samo polecenie 'onLoadFinished' zostanie wywołane, aby przejść do następnego pliku SVG. Taki sposób tworzenia pętli bez pętli for. Mam nadzieję, że to pomoże. –

+0

Dzięki, rzeczywiście działa. Potrzebuję jednak używać zmiennych globalnych, aby przekazać informacje do wywołania zwrotnego 'onLoadFinished' (nazwa pliku wyjściowego potrzebna do' page.render() '). Co więcej, pomijanie niepoprawnych plików zwracanych przez 'listdir()' staje się trudne, ponieważ kod staje się niepotrzebny z powodu podejścia rekursywnego. – CoDEmanX