HTMLUnit в Java - Как перейти к страницам GridView
Я пытаюсь создать приложение, используя Java, который будет читать информацию с веб-страницы. Чтобы загрузить информацию из элементов, которые я хочу, я использовал jsoup (отличный инструмент!), Но я хочу загрузить следующую страницу GridView, используемого на веб-странице. Страница является страницей.aspx, а ссылка на 2-й странице выглядит так:
<a href="javascript:__doPostBack('GridView1','Page$2')" style="color:White;">2</a>
Ниже используется функция javascript:
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
В настоящее время я пытаюсь сделать это с помощью HTMLUnit, но, похоже, не работает. Ниже приведен код, который я использую:
final WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage page = webClient.getPage("http://www.webpage.com/Main.aspx");
HtmlAnchor anchor = null;
List<HtmlAnchor> anchors = page.getAnchors();
for (int j = 0; j < anchors.size(); j++)
{
anchor = anchors.get(j);
String sAnchor = anchor.asText();
String sAnchorxml = anchor.asXml();
if (sAnchor.equals("2"))
{
HtmlPage page2 = anchor.click();
doc = Jsoup.parse(page2.asXml());
.....
Когда я читаю страницу, используя тот же код, что и 1-ю страницу, я получаю следующую ошибку:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at test.advacus.com.MainProgram.main(MainProgram.java:148)
Я предполагаю, что моя ошибка в 'Jsoup.parse()'
линия. Просто чтобы уточнить, что когда вы нажимаете на следующую страницу, URL-адрес не меняется, только информация в GridView, поэтому я не могу разобрать, используя новый URL-адрес.
Любая дополнительная помощь или любой предложенный инструмент вместо HTMLUnit, который будет лучше взаимодействовать с jsoup, действительно поможет! Заранее спасибо!
Отредактировано для дополнительной информации: выглядит как click()
это не работает... Я изменил код, и тело newPage выглядит так, как будто оно содержит ту же информацию, что и 1-я страница:
final WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage page = webClient.getPage("http://www.qatarsale.com/EnMain.aspx");
HtmlAnchor anchor = page.getAnchorByText("2");
HtmlPage newPage = anchor.click();
HtmlElement el = newPage.getBody();
System.out.println(el.asText());
1 ответ
Осмотр якорей - как вы уже указали - doPostBack
вызывается, поэтому гораздо проще вызвать вызов javascript вместо того, чтобы сначала захватить якоря и вызвать щелчок по нему.
Пример кода
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
final WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(10000);
try {
HtmlPage htmlPage = webClient.getPage("http://qatarsale.com/EnMain.aspx");
Document doc = Jsoup.parse(htmlPage.asXml());
System.out.println(doc.select("[id$=Label10]").text());
ScriptResult result = htmlPage.executeJavaScript("__doPostBack('GridView1','Page$2')");
htmlPage = (HtmlPage)result.getNewPage();
Thread.sleep(3000); // delay needed for lazy loading, there might be something cleaner
doc = Jsoup.parse(((HtmlPage)htmlPage).asXml());
System.out.println(doc.select("[id$=Label10]").text());
} catch (Exception e) {
e.printStackTrace();
} finally {
webClient.close();
}
Выход
Toyota Porsche Mercedes-Benz Cadillac Jeep Porsche Porsche Nissan Mitsubishi BMW Porsche Ford Mitsubishi Toyota Nissan Land Rover Nissan Mercedes-Benz Nissan Nissan Toyota Toyota Porsche Mitsubishi Mitsubishi Nissan Nissan Mercedes-Benz Nissan Jeep Mercedes-Benz Lexus BMW Lexus
BMW Lexus Toyota Toyota Lexus Nissan Mercedes-Benz Mercedes-Benz Ferrari Dodge BMW Mercedes-Benz Aston Martin Mitsubishi Suzuki Maserati Porsche Maserati Land Rover Chevrolet Land Rover GMC Toyota Porsche Lexus Land Rover GMC Mercedes-Benz Toyota Lexus Toyota Lexus Toyota Nissan