2016-11-17 3 views
1

Я привязываю к анализу веб-сайта с блоком html. Процесс в основном;HtmlUnit Не получает контент после нажатия

WebClient client = new WebClient(BrowserVersion.CHROME); 
client.waitForBackgroundJavaScript(5 * 1000); 
HtmlPage page = client.getPage("http://www.exapmle.com"); //here it waits to run js code. 

HtmlUnorderedList ul = (HtmlUnorderedList) page.getByXPath("//ul[contains(@class, 'class-name')]").get(0); 
HtmlListItem li = (HtmlListItem) ul.getChildNodes().get(1); // I want to click li and get result page. But it takes a little time to execute. 

li.click(); 

client.waitForBackgroundJavaScript(5 * 1000); //At here it does not do what I want. 

После этого, когда я просматриваю страницу, я вижу, что ее содержимое не меняется.

Что можно сделать, чтобы получить правильный результат?

Спасибо.

ответ

0

Вы можете попробовать опрос для яваскрипта условия, чтобы быть правдой

int attempts = 20; 
int pollMillis = 500; 
boolean success = false; 
for (int i = 0; i < attempts && !success; i++) { 
    TimeUnit.MILLISECONDS.sleep(pollMillis); 
    if (someJavascriptCondition == true) { 
     success = true; 
    } 
} 
if (!success) throw new RuntimeException(String.format("Condition not met after %s millis", attempts * pollMillis); 

Аналогичный метод обсуждается here

+0

У меня нет такого сценария java:/ – xxlali

+0

Конечно, да. Убедитесь, что изображение счетчика остановлено или обновлен div и т. Д. И т. Д. –

0
WebClient client = new WebClient; 
HtmlPage page = client.getPage("http://www.exapmle.com"); 
client.waitForBackgroundJavaScript(5 * 1000); 
Thread.sleep(10*1000);// this code will waite to 10 seconds 
HtmlUnorderedList ul = (HtmlUnorderedList) page.getByXPath("//ul[contains(@class, 'class-name')]").get(0); 
HtmlListItem li = (HtmlListItem) ul.getChildNodes().get(1); // I want to click li and get result page. But it takes a little time to execute. 

li.click(); 

client.waitForBackgroundJavaScript(5 * 1000); 
// this code will waite to 10 seconds 
Thread.sleep(10*1000); 

использовать Thread.sleep() вместо waitForBackgroundJavaScript работает для меня!

+0

нет, он не работает: / – xxlali

0

Вы можете использовать JavaScriptJobManager, чтобы проверить количество заданий JavaScript, которые еще не заполнены. Попробуйте следующий код после вызова click().

JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager(); 
while (manager.getJobCount() > 0) { 
    System.out.printlin("Jobs remaining: " + manager.getJobCount()); 
    Thread.sleep(1000); 
} 

Возможно, вы захотите добавить еще один способ завершить цикл while, если ваши задания JavaScript никогда не заканчиваются. Лично я начинаю прекращать работу вручную с помощью:

JavaScriptJob job = manager.getEarliestJob(); 
System.out.println("Stopping job: " + job.getId()); 
manager.stopJob(job.getId()); 

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