2016-11-17 67 views
7

Bir web sitesini htmlunit kullanarak taramaya çalışıyorum. htmlunit Özellik "push" özelliği okunamıyor

Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot read property "push" from undefined (https://www.kinoheld.de/dist/prod/0.4.7/widget.js#1) 

Şimdi JS hakkında pek fazla bilgim yok, ama ben push dizi operasyon çeşit olduğunu okuyun: Ben çalıştırmak zaman sadece aşağıdaki hatayı verir gerçi. Bu bana standart gibi geliyor ve neden htmlunit tarafından desteklenmeyeceğini bilmiyorum. İşte

şimdiye kadar kod kullanıyorum edilir:

public static void main(String[] args) throws IOException { 
    WebClient web = new WebClient(BrowserVersion.FIREFOX_45); 
    web.getOptions().setUseInsecureSSL(true); 
    String url = "https://www.kinoheld.de/kino-muenchen/royal-filmpalast/vorstellung/280823/?mode=widget&showID=280828#panel-seats"; 
    web.getOptions().setThrowExceptionOnFailingStatusCode(false); 
    web.waitForBackgroundJavaScript(9000); 
    HtmlPage response = web.getPage(url); 

    System.out.println(response.getTitleText()); 
} 

ben eksik? Bunun bir yolu var mı, yoksa bunu düzeltmenin bir yolu var mı? Şimdiden teşekkürler!

+1

Desteklenmiyorsa, geliştiricilerin yeni bir özellik talep etmesini beklemelisiniz. –

+0

Hata ne zaman ortaya çıkıyor? Web.getPage (url) 'veya' message.getTitleText() 'çağrısından sonra? – Jack

+0

@Jack "web.getPage (url)" ifadesinden sonra "response.getTitleText()" ifadesini kullanabileceğimiz için hata oluştu ve web.getOptions(). SetThrowExceptionOnScriptError (false) durumunda bile atılacak.); '(aşağıdaki cevaba bakınız) eklenmiştir. – Maverick283

cevap

4

Daha önce benzer bir sorunla karşılaştık. Bu, HTML Ünitesinin web kazıma yerine bir test kablo demeti çerçevesi olarak tasarlanmasıyla ilgili bir sorundur. HTML Ünitesinin en son sürümünü mi kullanıyorsunuz?

I (Kahve Converter cevapta belirtildiği gibi) hattını hem setThrowExceptionOnScriptError(false) ekleyerek yanı sıra günlük dökümü devre dışı bırakmak için yöntemin üst kısmındaki java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); ekleyerek kod çalıştırmasına başardı. aşağıdaki gibi

Royal Filmpalast München München | kinoheld.de 

Tam kodudur: Bu, HTML Birimi 2.2.1 ile RedHat komut satırında çalıştırıldı

public static void main(String[] args) throws IOException { 

    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); 

    WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45); 
    String url = "https://www.kinoheld.de/kino-muenchen/royal-filmpalast/vorstellung/280823/?mode=widget&showID=280828#panel-seats"; 

    webClient.getOptions().setUseInsecureSSL(true); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
    webClient.waitForBackgroundJavaScript(9000); 
    HtmlPage response = webClient.getPage(url); 

    System.out.println(response.getTitleText()); 
} 

Bu bir çıkış vermiştir. Bu yardımcı olur umarım.

6

deneyin sayfayı almaya çalışmadan önce

web.getOptions().setThrowExceptionOnScriptError(false); 

ekledi. Bu, hatayı görmezden gelmek için htmlunit'i zorlar. Ancak, bu, örneğin attığınız veriyi almak için önemli olan javascript'in önemli olduğu zamanın% 100'ünde işe yaramayabilir (ki umarız). Bu işe yaramazsa, Selenyum'u ChromeDriver veya GhostDriver ile kullanmayı deneyin.

Source

+0

Bu satır işe yaramazsa, yine aynı hatayı atar ve beni bir yere götürmez ... Daha fazla zamanım olduğunda Selenyum ne olursa onu deneyeceğim;) – Maverick283

+0

Ancak, orijinal istisna yığından önce izleme, önerdiğiniz çizgi ile, şimdi 'com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl bildirimi 'der ve daha sonra yığın izinin kalanını yazdırır. – Maverick283

+2

Gerçekten de 50 puanlık ayrımı yapabilmeyi isterdim, @Jack in cevabı akut olarak sorunu çözdüyse, öneriniz uzun çekimde benim için daha yararlı olabilir ... – Maverick283