2017-11-28 6 views
0

WebClientによるHtmlPageがあります。このページ(HtmlPage)にはボタンがあり、そのボタンをクリックして新しいページ(別のページ)を取得します。しかし、そのボタンをクリックすると、元のページと同じページが返されます。私のコードは以下の通りです:htmlunit - JavaScript関数を実行した後に新しいページを取得

import com.gargoylesoftware.htmlunit.*; 
import com.gargoylesoftware.htmlunit.html.*; 
import java.net.URL; 

public class GetLink2 { 
public static void main(String[] args) throws Exception { 
    URL url = new URL("https://fptshop.com.vn/"); 

    String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"; 
    WebRequest request = new WebRequest(url); 
    request.setAdditionalHeader("User-Agent", userAgent); 
    //request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0"); 
    WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52); 

    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.setJavaScriptTimeout(20000); 
    webClient.getOptions().setJavaScriptEnabled(true); 
    webClient.getOptions().setCssEnabled(true); 
    webClient.getOptions().setUseInsecureSSL(true); 

    webClient.waitForBackgroundJavaScript(5000); 

    HtmlPage page = webClient.getPage(request); 

    for (DomElement input : page.getElementsByTagName("input")) { 
     if (input.getAttribute("placeholder").contains("tìm") || 
       input.getAttribute("placeholder").contains("Tìm")) { 
      System.out.println(input.asXml()); 
      System.out.println("Set element focused: " + page.setFocusedElement(input)); 

      input.setAttribute("id", "my_input_search"); 
      System.out.println("Element focused: " + page.getFocusedElement()); 

      //pageResult = page.pressAccessKey((char) DOM_VK_RETURN).getHtmlPageOrNull().getUrl(); 
      //System.out.println("Result: " + pageResult.toString()); 
      //System.out.printf("Result: %s%n", input.fireEvent(String.valueOf(KeyboardEvent.DOM_VK_RETURN)).getJavaScriptResult().toString()); 
      break; 
     } 

     //System.out.println(htmlElement.asXml()); 

     //result.getNewPage(); 
     //System.out.println("result: "+ result.getNewPage().getUrl()); 
    } 


    System.out.println("Input search: " + page.getElementById("my_input_search")); 

    String jsScript = "var element = document.getElementById('my_input_search');" + 
      "element.value = 'iphone 7';" + 
      "element.addEventListener('keypress', function (e) {" + 
      "console.log(e.key, e.char, e.keyCode)});" + 
      "var e = new KeyboardEvent('keypress', {" + 
      "bubbles: true, cancelable: true, char: 'Enter',key: 'enter', keyCode: 13});" + 
      "element.dispatchEvent(e);"; 

    System.out.println("Input Search After Set Value: " + page.getElementById("my_input_search")); 
    page.executeJavaScript(jsScript); 
    Thread.sleep(20000); 
    page.getPage(); 
    System.out.println("Result " + page.getPage()); 
} 
} 

私の質問を読んでくれてありがとうございます。あなたはHtmlUnitがどのように動作するか誤解のよう

+0

を行う必要がありますので、あなたは、あなたの結果を失うされているが見えます。アイデアを得るには、HtmlUnitホームページのサンプルを見てください。独自のWebリクエストを作成する必要はありません。単純にURLを使用してページを取得します。クリックをシミュレートするには、要素のclickメソッドを呼び出すだけです。これにより、すべてのJavaScriptイベントもシミュレートされます。 – RBRi

答えて

0

page.executeJavaScript(jsScript); 

ScriptResultを返し、あなたは

Page newPage = page.executeJavaScript(jsScript).getNewPage(); 
System.out.println("Result " + newPage); 
関連する問題