Скачать динамическое изображение на веб-странице программно - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь загрузить изображение, которое меняется при каждой загрузке. Атрибут src в теге img является постоянным, хотя отображаемое изображение изменяется (я предполагаю, что веб-приложение меняет изображение на src при каждом попадании).

Я попытался загрузить, используя src, и изображение вернулось, как и ожидалось.

Мое требование - загрузить изображение, отображаемое на странице, в данный момент. Я также пытался щелкнуть правой кнопкой мыши, чтобы сохранить, но щелчок правой кнопкой мыши на странице отключен. Есть идеи ? Я использую селеновый webdriver. Другие варианты также приветствуются.

Это то, что я пытался использовать атрибут src:

public static void download() {
    WebDriver driver = new ChromeDriver();
    driver.navigate().to("https://*******.com/");

    String url = driver.findElement(By.id("regImg")).getAttribute("src");

    // run of the mill code to download the image.
    downloadImage(url);
}

Как я уже сказал, этот код работает, но я получаю другое изображение, так как веб-приложение меняет его при каждом попадании. Мне нужен тот, который отображается на странице.

Вот HTML:

<td width="20%" align="center" class="style1">characters
    <font color="#FF0000">*</font>
    <img id="regImg" src="../../**/**.php" alt="captcha image" height="25">
</td>

Ответы [ 2 ]

0 голосов
/ 15 августа 2018

Это зависит от того, загружены ли ваши изображения с того же URL-адреса, что и HTML, или с другого.

Вы можете попытаться преобразовать все изображения в объекты данных с помощью JS:

driver.execute_script(
    'var c=document.createElement("canvas");'+
    'document.querySelectorAll("img").forEach(function(img){'+
       'c.width=img.naturalWidth;'+
       'c.height=img.naturalHeight;'+
       'c.getContext("2d").drawImage(img,0,0);img.src=c.toDataURL();'+
     '});'
);

А затем захватите его с помощью вашего изображения загрузки.

Но если ваши изображения размещены на другом хосте - у вас будут проблемы с CORS. Эти проблемы могут быть исправлены добавлением заголовка CORS

Access-Control-Allow-Origin "*"

С прокси Чарли, как показано здесь: Добавление заголовка к запросам с Чарльзом

0 голосов
/ 09 августа 2018

Если у вас нет возможности восстановить то же изображение, например добавив в запрос параметр запроса, вы можете сделать снимок экрана

File sreenshotFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

и извлеките изображение из скриншота, что должно быть легко, если вы знаете, что ищете.

В качестве альтернативы этого ответа вы можете настроить драйвер Selenium на использование известного каталога для хранения данных браузера:

ChromeOptions chromeProfile = new ChromeOptions();
chromeProfile.addArguments("user-data-dir=" + chromeProfilePath);
driver = new ChromeDriver(options);

и, возможно, случайное изображение будет сохранено на диске где-то под chromeProfilePath. Возможно, но процесс сложный .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...