Как исправить: HtmlUnit GetElementById возвращает ноль - PullRequest
0 голосов
/ 03 января 2019

Я пишу веб-скребок и пытаюсь ввести искомое слово в поле поиска.Тем не менее, похоже, что я получаю нулевое значение, когда я пытаюсь получить доступ к окну поиска по идентификатору.Я только изучаю HtmlUnit, поэтому я мог упустить что-то очень очевидное, но я еще не смог идентифицировать это сам.

Вот код сайта:

<html xmlns="http://www.w3.org/1999/xhtml" xml:1ang="en" class="no-touch">
    <head>-</head>
    <body lang="en" class="garageBrand" emailcookiename="grgemailca" loyaltycookiename="grgloyaltyca">
        <div id="fb-root" class="fb_reset">-</div>
        <noscript>...</noscript>
        <script>...</script>
        <div id="container">
            <div id="avsDialog" sty1e="disp1ay: none; position: absolute; top: 0; right: 0;"></div>
            <input type="hidden" value="en" id="displayLanguage">
            <input type="hidden" value="garageSiteCA" id="currSiteId">
            <input type="hidden" value="en_CA" id="currLocale">
            <div id="contentarea">
                <div id="header" class="nonHeaderScroll">
                <div id="topnav">...</div>
                <div class="socialSearch">
                <div id="searchMenu">
                    <form action="//www.garageclothing.com/ca/search/search.jsp" method="GET">
                        <input type="hidden" name="N" value="0">
                        <input type="hidden" name="Dy" value="1">
                        <input type="hidden" name="Nty" value="1">
                        <input type="hidden" name="Ntk" value="All">
                        <input type="hidden" name="Ntx" value="mode matchall">
                        <input id="searchText" maxlength="40" type="text" name="Ntt" class="textInput" placeholder="Search..." autocomplete="off">
                        <input class="mainSearchButton" type="image" src="//images.gdicdn.com/img/magnifying-glass.png?version=375" name="search">
                    </form>
                </div>

Вот мой код:

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlInput;

import java.io.IOException;


public class Main {

public static void main(String[] args) {

    WebClient client = new WebClient();
    client.getOptions().setJavaScriptEnabled(true);
    client.getOptions().setCssEnabled(false);
    client.getOptions().setUseInsecureSSL(true);

    try {
        HtmlPage page = client.getPage("https://www.garageclothing.com/ca");

        // Check for popup.
        if(page.getElementById("cboxClose") != null) {
            page = page.getElementById("cboxClose").click();
        }

        // Debugging line that returns null:
        System.out.println(page.getElementById("searchText"));
        // What I would like to do:
      /*HtmlInput searchInput = (HtmlInput) page.getElementById("searchText");
        searchInput.setValueAttribute("red scarf");
        HtmlSubmitInput submitBtn = page.getElementByName("search");
        page = submitBtn.click();

        System.out.println(page.asXml());*/

    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Даже если страница выглядит простой, эта страница (на многих торговых порталах) действительно сложна и основана на тоннах javascript (не только для самой страницы, но и для всех этих неприятных трекеров, чтобы наблюдать за пользователями).Если вы хотите узнать больше об этой странице, я предлагаю использовать веб-прокси, такой как Charles, для захвата всего трафика.

Теперь вернемся к вашей проблеме ... Поскольку поддержка JavaScript HtmlUnit (основанная на Rhino) не идеальнаВы сталкиваетесь с некоторыми ошибками JavaScript.Чтобы не останавливаться на ошибках js, необходимо настроить клиент

webClient.getOptions().setThrowExceptionOnScriptError(false);

. Следующий шаг - получить страницу.Это также не так просто из-за всего, что связано с JS.Похоже, что js материал также заменяет страницу, первоначально возвращенную путем получения URL.Из-за этого вам нужно сделать три шага

  • получить страницу
  • подождать некоторое время, чтобы js выполнил некоторую работу
  • получить текущую страницу из текущейокно

Теперь вы можете найти поле поиска;введите в него поиск и, наконец, нажмите кнопку поиска.Затем вам нужно снова сделать три шага, чтобы получить текущий контент.

Надеюсь, это поможет ....

public static void main(String[] args) throws IOException {
    String url = "https://www.garageclothing.com/ca";

    try (final WebClient webClient = new WebClient()) {
        // do not stop at js errors
        webClient.getOptions().setThrowExceptionOnScriptError(false);

        webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(10000);

        HtmlPage page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
        HtmlInput searchInput = (HtmlInput) page.getElementById("searchText");
        searchInput.type("red scarf");

        HtmlElement submitBtn = (HtmlElement) page.getElementByName("search");
        submitBtn.click();
        webClient.waitForBackgroundJavaScript(10000);

        page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
        // System.out.println("------------------------------------------------");
        // System.out.println(page.asXml());

        System.out.println("------------------------------------------------");
        final DomNodeList<DomNode> divs = page.querySelectorAll(".divProdPriceSale");
        for (DomNode div : divs) {
            System.out.println(div.asText());
        }
    }
}
0 голосов
/ 09 января 2019

Вы должны проверить, что URL, который вы передаете на WebClient, является тем, который вы просматриваете в веб-браузере, который вы используете.

Я перешел по ссылке, которую вы используете в своем коде (https://www.garageclothing.com) и страница, которую я получил, не та, которую вы ожидаете. Она попросила меня выбрать страну (США или Канаду), и после того, как я щелкнул любой из вариантов, он перенес меня на ожидаемую вами страницу.

Попробуйте изменить URL-адрес на "https://www.garageclothing.com/us/" или" https://www.garageclothing.com/ca/"

...