Загружать динамическое изображение на веб-странице программно

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

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

Мое требование - загрузить изображение, которое отображается на странице, на данный момент. Я также попытался щелкнуть правой кнопкой мыши, чтобы сохранить, но щелчок правой кнопкой мыши отключен на странице. Есть идеи? Я использую selenium 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>

Ответ 1

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

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

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

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

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

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

Ответ 2

Это зависит от того, загружены ли ваши изображения с того же 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();'+
     '});'
);

А затем захватите его с помощью файла downloadImage.

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

Access-Control-Allow-Origin "*"

С прокси-сервером Charly, как показано здесь: добавьте заголовок к запросам с Charles