Загружать динамическое изображение на веб-странице программно
Я пытаюсь загрузить изображение, которое изменяется при каждой загрузке. Атрибут 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