Даже если страница выглядит простой, эта страница (на многих торговых порталах) действительно сложна и основана на тоннах 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());
}
}
}