Я нашел thesethreepotential answers, но все они используют HtmlUnit api. Как я могу избежать использования HtmlUnit api и only use selenium или некоторой конфигурации для настройки браузера?Как заставить селен управлять htmlunit автоматически загружать изображения?
ответ
Насколько я знаю, нет возможности автоматически загружать все изображения с помощью HtmlUnit
(с селеном или без него). По мере того как ссылки вы Отправленные показывают, вы можете заставить HtmlUnit
, чтобы загрузить все изображения на странице с помощью следующего кода:
DomNodeList<DomElement> imageElements = htmlPage.getElementsByTagName("img");
for (DomElement imageElement : imageElements) {
HtmlImage htmlImage = (HtmlImage) imageElement;
try {
// Download the image.
htmlImage.getImageReader();
}
catch (IOException e) {
// do nothing.
}
}
Однако, получение текущей страницы при использовании Selenium HtmlUnitDriver
не является тривиальным. Существует несколько способов сделать это, но для каждого из них требуется доступ к методу protected
HtmlUnitDriver.lastPage()
. One way to access this method is through reflection. Другим решением является использование того факта, что методы protected
также доступны по классам в одном пакете и packages can be the same across jars. Объединив последние особенности/недостатки дизайна, я смог придумать решение, которое позволяет избежать отражения. Вместо этого он просто добавляет обычный класс в тот же пакет, что и HtmlUnitDriver
--- org.openqa.selenium.htmlunit
.
package org.openqa.selenium.htmlunit;
import java.io.IOException;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlImage;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class HtmlUnitUtil {
private HtmlUnitUtil() {
throw new AssertionError();
}
public static void loadImages(HtmlUnitDriver htmlUnitDriver) {
// Since we are in the same package (org.openqa.selenium.htmlunit)
// as HtmlUnitDriver, we can access HtmlUnitDriver's protected
// lastPage() method.
HtmlPage htmlPage = (HtmlPage) htmlUnitDriver.lastPage();
DomNodeList<DomElement> imageElements =
htmlPage.getElementsByTagName("img");
for (DomElement imageElement : imageElements) {
HtmlImage htmlImage = (HtmlImage) imageElement;
try {
// Download the image.
htmlImage.getImageReader();
}
catch (IOException e) {
// do nothing.
}
}
}
}
К сожалению, каждый раз, когда вы хотите, чтобы изображения загружались, вам нужно будет вручную называть этот код. Я создал запрос функции (htmlunit-driver #40) для HtmlUnitDriver
, чтобы добавить опцию автоматической загрузки изображений. Пожалуйста, проголосуйте за эту проблему, если вы хотите увидеть эту функцию.
Это сейчас часть HtmlUnit 2.25-моментального снимка, webClient.getOptions().setDownloadImages(true)
.
И в HtmlUnit-Driver 2.25-моментальный снимок по возможностям DOWNLOAD_IMAGES_CAPABILITY
или htmlUnitDriver.setDownloadImages(true)
.
какие изображения? вы могли бы поделиться более подробной информацией? – Andersson
Изображения, на которые вы можете найти ссылки на тег изображения:
. –
Vernon
Вы принимаете ответы только в Java? – Andersson