2013-11-22 21 views
6

https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot, HtmlUnit (2.13) ile AngularJS (1.2.1) kullanarak bir web sayfası için anlık görüntü oluşturmaya çalışıyorum.HTMLUnit, AngularJS ile çalışmaz

Benim Java kodu: webClient.getPage(...) herhangi istisna atar vermez

WebClient webClient = new WebClient(); 

webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 
webClient.setCssErrorHandler(new SilentCssErrorHandler()); 

webClient.getOptions().setCssEnabled(true); 
webClient.getOptions().setRedirectEnabled(false); 
webClient.getOptions().setAppletEnabled(false); 
webClient.getOptions().setJavaScriptEnabled(true); 
webClient.getOptions().setPopupBlockerEnabled(true); 
webClient.getOptions().setTimeout(10000); 

webClient.getOptions().setThrowExceptionOnFailingStatusCode(true); 
webClient.getOptions().setThrowExceptionOnScriptError(true); 
webClient.getOptions().setPrintContentOnFailingStatusCode(true); 

HtmlPage page = webClient.getPage(new WebRequest(new URL("..."), HttpMethod.GET)); 
webClient.waitForBackgroundJavaScript(5000); 
String result = page.asXml(); 

rağmen sonuç dizesi hala "unevaluated açısal ifadeleri" gibi

<div> 
    {{name}} 
</div> 

Ben http://htmlunit.10904.n7.nabble.com/htmlunit-to-scrape-angularjs-td29931.html#a30075 ama recomendation farkındayım içeriyor orada verilen de işe yaramıyor.

Elbette, aynı GET isteği geçerli tüm tarayıcılarda istisnasız çalışır.

Herhangi bir fikir/deneyim HtmlUnit AngularJS ile nasıl çalışır?

Güncelleme:

Bir HtmlUnit'in bug report yarattı.
Şimdilik, uygulamamı PhantomJS'ye değiştirdim.

System.setProperty("phantomjs.binary.path", "phantomjs.exe"); 
DesiredCapabilities caps = new DesiredCapabilities(); 
caps.setJavascriptEnabled(true); 
caps.setCapability("takesScreenshot", false); 

PhantomJSDriver driver = new PhantomJSDriver(caps); 
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
driver.get(new URL("...")); 
String result = driver.getPageSource(); 

Update2: Belki bu kod parçacığı benzer bir sorunu olan başkalarına yardım Ben Google tarayıcısı olarak manuel sayfaların oluşturulması stoped Açısal siteleri kendisini ben iyi işler var şimdi

cevap

0

Benzer bir kod oluşturur benim tek sayfa uygulaması angularjs 1.0.4 kullanır; Yapmam gereken tek şey farklı HtmlUnit'in 2.12'de yerine varsayılan IE8 FIREFOX_17 kullanmak HtmlUnit'in söylemekti (eğer sağlanan bağlantıyı benzer ancak bunun yerine FIREFOX_10 ait FIREFOX_17)

final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17); 

Ben 1.2 angularjs ve patlama yükseltilmiş benim sayfa tüm açısal yer tutucuları ile gösterir.

1

HtmlUnit kullanırsam "derecelendirilmemiş açısal ifadeler" ile aynı sorunu yaşadım. Çözelti bootstrap application manually. Üreme adımlar: tarayıcıda çalışan uygulamanın

Minimal örnek değil HtmlUnit'in ile:

<!doctype html> 
<html ng-app> 
<head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script> 
</head> 
<body> 
    <div> 
     <label>Name:</label> <input type="text" ng-model="yourName" 
      placeholder="Enter a name here"> 
     <hr> 
     <h1>Hello {{yourName}}!</h1> 
    </div> 
</body> 
</html> 

Modifikasyon adımları:

  1. Bootstrap manually
  2. Remove ng-app to not bootstrap app twice
  3. If you use $http or like you should re-sync it with:

    webClient.setAjaxController (yeni NicelyResynchronizingAjaxController());

Ve şimdi çalışma örneği:

<!doctype html> 
<html> 
<head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script> 
    <script> 
     angular.element(document).ready(function() { 
      angular.module('myApp', []); 
      angular.bootstrap(document, ['myApp']); 
     }); 
    </script> 
</head> 
<body> 
    <div> 
     <label>Name:</label> <input type="text" ng-model="yourName" 
      placeholder="Enter a name here"> 
     <hr> 
     <h1>Hello {{yourName}}!</h1> 
    </div> 
</body> 
</html> 

Testi: Bu keyfi bir çözüm değildir gerçekten çözüm çalışan, ancak oluyor

WebClient webClient = new WebClient(); 
webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 
HtmlPage page = webClient.getPage("http://localhost:8080/index.html"); 

// Initial state 
assertEquals("Hello !", page.getElementsByTagName("h1").get(0).asText()); 

// Set value 
((HtmlInput)page.getElementsByTagName("input").get(0)).setValueAttribute("world"); 

// New state 
assertEquals("Hello world!", page.getElementsByTagName("h1").get(0).asText()); 

. Bilmiyorum HtmlUnit veya Angularjs sorunudur.

8

Aynı sorun vardı ama açılı önyükleme kullanamadı çünkü açısal e2e testleri açık önyükleme ile çalışmaz.

Ben HtmlUnit'in testleri çalışmak ve e2e testleri de işe

<html id="ng-app" class="ng-app: appmodule;"> 

yerine

<html ng-app="appmodule"> 

kullanarak sorunu çözdü.

Büyük olasılıkla, htmlunit, document.querySelectorAll() öğesini desteklemiyor. Bu yöntem, ng-app yönergelerini bulmak için angularInit() tarafından kullanılır.

ng-app yönergesinin sözdizimsel varyasyonu document.querySelectorAll() öğesinin etrafında çalışır ve angularInit().

+0

Bu, HTMLUnit'in açısal yönergeleri çözmediği sorunu çözdüğü için kabul edilen yanıt olmalıdır. Teşekkürler! – chaitanya

+0

Bu, HtmlUnit'in AngularJS için zayıf desteğinden dolayı yardımcı görünüyor, ancak tüm sorunları çözmüyor. Umarım 2.15 daha iyi olacak ... – Splaktar

1

HtmlUnit sorunu düzeltildi. AngularJS ifadeleri şimdi doğru olarak değerlendirildi. SVN'de sabit raporlama için

https://sourceforge.net/p/htmlunit/bugs/1559/

+0

Bu hangi sürümde sabittir? Ben 2.14 kullanıyorum ve BrowserVersion.CHROME veya FIREFOX_24 sonuçlarını değerlendirilmemiş AngularJS ifadelerinde kullanıyorum, ancak bu ifadeleri değerlendirmek için BrowserVersion.INTERNET_EXPLORER_8 kullanılıyor. – Splaktar

+0

Bu henüz bir sürümde değil gibi görünüyor (2.14 Şubat ayında piyasaya sürüldü). Bu düzeltme Mart ayında yapıldı ve henüz bir sürümün parçası değil. En son SVN'den oluşturmaya çalıştım ama başarısız oldu: https://sourceforge.net/p/htmlunit/bugs/1596/ – Splaktar

+0

Bunu en son SVN şubesi 2.15 ile tekrar test ettim ve hala yapmak zorundayım. eski hack @stephanme tarafından cevapta bahsetti. AngularJS 1.0.8 kullanıyorum. – Splaktar

0

sayesinde. HtmlUnit 2.15'i çok yakında bekleyiniz.

Test durumu şimdi Chrome simülasyonu ile çalışıyor, nedeni querySelectorAll() belgedeki/öğede tanımlanmış olmasıydı.

Lütfen dikkat, diğerlerinin kök nedenini zaten belirledikleri ve HtmlUnit ekibine çok kısa bir sürede sabitlenebilecekleri asgari bir test vakası verdiğine dikkat edin.

Geri bildiriminiz için tekrar teşekkürler.