Ну, хотя это ужасное решение (обходной путь, на самом деле ...), я наконец решил отключить автоматическую загрузку фреймов в HtmlUnit, как советовал один из разработчиков HtmlUnit.Вот что я сделал в деталях:
- Загрузил источник HtmlUnit
- Скачал maven из здесь
- Прокомментировал содержимое (текстметод, а не объявление)
loadFrames()
метода класса HtmlPage, расположенного в htmlunit-2.9/src/main/java/com/gargoylesoftware/htmlunit/html
- Скомпилировал этот пользовательский код пропуска тестов с помощью:
mvn -Dmaven.test.skip=true clean compile package
- Получил новый
htmlunit-2.9.jar
находится в htmlunit-2.9/artifacts
и заменяет текущий htmlunit-2.9.jar
файл библиотеки - Этот шаг может быть наиболее деликатным, поскольку он будет зависеть от каждого приложения.Тем не менее, я покажу вам изменения, которые мне нужно было сделать в моем приложении.
Вы знаете, каким был мой исходный код (посмотрите на вопрос).Это загрузит все фреймы и фреймы со страницы.Я добавляю пример того, как получить страницу с фреймами, просто загружая нужные фреймы:
try {
HtmlPage page = webClient.getPage("http://www.w3schools.com/HTML/tryit.asp?filename=tryhtml_noframes");
HtmlInlineFrame frame = page.getFirstByXPath("//iframe[@name='view']");
page = webClient.getPage(page.getFullyQualifiedUrl(frame.getSrcAttribute()));
System.out.println(page.asXml());
} catch (Exception e) {
e.printStackTrace();
}
После этого изменения библиотеки содержимое фрейма будет пустым после завершения метода getPage()
,Обратите внимание, что он не будет нулевым, похоже, он просто возвращает пустой кадр.Нам нужно вручную загрузить содержимое интересующих нас фреймов, поэтому я снова выполняю getPage()
.
Вот как мне удалось выборочно загрузить фреймы и фреймы сHtmlUnit.Любые идеи о том, как улучшить это, будут оценены.В любом случае, я надеюсь, что в будущем будет добавлен способ отключить загрузку фреймов в самом HtmlUnit, возможно, добавив такой метод, как getPage(URL url, boolean downloadFrames)
или что-то в этом роде.
Надеюсь, это кому-то поможет!