2016-02-09 41 views
0

我首先想說的是,我使用phantomJS和Selenium來管理它。我加載phantomjs,加載網址(sports.coral.co.uk),然後檢查我的餘額。然而,我試圖找到一個更輕量級的選項。Java登錄到使用複雜JavaScript的網站

我試過用apache的HttpClient手動發送http get/post請求。監視登錄過程,使用postman for chrome,顯示登錄按鈕被按下後發送的4個請求。我試過編輯並使用郵遞員重新發送郵件。但是,從我可以告訴的是有一個請求ID與請求一起發送。這是使用頁面上的JavaScript生成的。

var requestId = (new Date().getTime()) + Math.round(Math.random() * 1000000); 
      var failedTimer = setTimeout('iapiRequestFailed(' + requestId + ')', iapiConf['loginDomainRetryInterval'] * 1000); 
      iapiRegisterRequestId(requestId, iapiCALLOUT_MESSAGES, failedTimer, request[3], request[4], request[5]); 
      return; 

它看起來像原始ID是隨機生成的數字,然後使用其他JavaScript函數註冊。我猜測登錄部分失敗,因爲我無法提供可接受的requestID。當我重新發送舊請求時,用戶已登錄。當我點擊我的帳戶時,表示發生了錯誤。唯一的解釋是requestID。

然後我決定給HtmlUnit一個去。這看起來像我需要的東西。我對使用HttpClient和JavaScript引擎(如Rhino)做了一些研究,看來HtmlUnit就是這個工具。 在我甚至嘗試登錄該頁面之前,我收到由頁面上的JavaScript引起的錯誤。

下面是我用來連接到頁面的簡單代碼:

@Test 
public void htmlunit() throws Exception { 
    LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); 

    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 
    java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF); 

    WebClient client = new WebClient(BrowserVersion.CHROME); 
    client.getOptions().setJavaScriptEnabled(true); 
    client.getOptions().setThrowExceptionOnScriptError(false); 
    client.getOptions().setThrowExceptionOnFailingStatusCode(false); 


    HtmlPage page = client.getPage("http://sports.coral.co.uk"); 
    System.out.println(page.asText()); 
    client.close(); 
} 

當我註釋掉的LogFactory位,我可以看到有拋出警告的負荷,

WARNING: Obsolete content type encountered: 'application/x-javascript'. 
Feb 09, 2016 4:33:34 PM com.gargoylesoftware.htmlunit.html.HtmlScript isExecutionNeeded 

警告:腳本不是JavaScript的(類型:application/LD + JSON,語言:) 。跳過執行。等等...

我猜這意味着HtmlUnit與在頁面上執行的JavaScript不兼容? 我對JavaScript不太好,頁面上的腳本被混淆了,這使得它更難閱讀。我不明白的是,爲什麼JS在使用phantomJS或chromeDriver而不是HtmlUnit時執行時沒有錯誤?是因爲Rhino引擎不夠好來執行它嗎?我錯過了明顯的東西嗎?

回答

0

此代碼將關閉由htmlunit庫引起的所有javascript警告,而不是您的代碼。

LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); 

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 
java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF); 

WebClient client = new WebClient(BrowserVersion.CHROME); 
client.getOptions().setJavaScriptEnabled(true); 
client.getOptions().setThrowExceptionOnScriptError(false); 
client.getOptions().setThrowExceptionOnFailingStatusCode(false); 

HtmlPage page = webClient.getPage("http://sports.coral.co.uk"); 
+0

謝謝,我試過這段代碼,它只是當我使用BrowserVersion.Chrome掛起。它已經執行了2分鐘以上。 當我嘗試Edge或將其保留爲默認值時,它將失敗並顯示相同的錯誤。 Chrome和Firefox給出了相同的結果 –

+0

這很奇怪,我試過這個代碼,它的工作。您是否嘗試打印頁面的內容? 'System.out.println(page.asText());'不要忘記在最後關閉webclient窗口:'webClient.close();' – haihui

+0

你是否使用相同的URL來試用它? 「https://sports.coral.co.uk」?看起來,頁面上的JavaScript與HtmlUnit並不完全兼容,無論出於何種原因並且沒有正確執行。花了26分鐘才能更早地加載頁面。 –