Как скачать изображение с помощью Selenium (любая версия)? - PullRequest
20 голосов
/ 25 июля 2011

Мне было интересно, как можно использовать селен / вебдрайвер, чтобы загрузить изображение для страницы.Предполагая, что пользовательский сеанс необходим для загрузки изображения, следовательно, наличие чистого URL бесполезно.Любой пример кода высоко ценится.

Ответы [ 9 ]

17 голосов
/ 08 ноября 2012

Я предпочитаю делать что-то вроде этого:

1. Get the SRC attribute of the image.
2. Use ImageIO.read to read the image onto a BufferedImage
3. Save the BufferedImage using ImageIO.write function
10 голосов
/ 25 июля 2011

Здесь - это трюк, который работает в Firefox и Chrome, в основном заставляет Selenium открывать новый браузер только с изображением, а затем загружает его с помощью Ctrl + S.

Другим вариантом будет симуляция щелчка правой кнопкой мыши и использование контекстного меню здесь

4 голосов
/ 26 апреля 2017

Я предпочитаю так:

 WebElement logo = driver.findElement(By.cssSelector(".image-logo"));
 String logoSRC = logo.getAttribute("src");

 URL imageURL = new URL(logoSRC);
 BufferedImage saveImage = ImageIO.read(imageURL);

 ImageIO.write(saveImage, "png", new File("logo-image.png"));
2 голосов
/ 20 февраля 2013

Другое наиболее правильное решение - загрузить его напрямую с помощью простого HTTP-запроса.
Вы можете использовать сеанс пользователя webDriver, поскольку он хранит файлы cookie.
В моем примере я просто анализирую, какой код состояния он возвращает. Если 200, то изображение существует, и оно доступно для показа или загрузки. Если вам нужно действительно загрузить сам файл - вы можете просто получить все данные изображения из сущности httpResponse (использовать ее как простой поток ввода).

// just look at your cookie's content (e.g. using browser)
// and import these settings from it
private static final String SESSION_COOKIE_NAME = "JSESSIONID";
private static final String DOMAIN = "domain.here.com";
private static final String COOKIE_PATH = "/cookie/path/here";

protected boolean isResourceAvailableByUrl(String resourceUrl) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    BasicCookieStore cookieStore = new BasicCookieStore();
    // apply jsessionid cookie if it exists
    cookieStore.addCookie(getSessionCookie());
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    // resourceUrl - is url which leads to image
    HttpGet httpGet = new HttpGet(resourceUrl);

    try {
        HttpResponse httpResponse = httpClient.execute(httpGet, localContext);
        return httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK;
    } catch (IOException e) {
        return false;
    }
}

protected BasicClientCookie getSessionCookie() {
    Cookie originalCookie = webDriver.manage().getCookieNamed(SESSION_COOKIE_NAME);

    if (originalCookie == null) {
        return null;
    }

    // just build new apache-like cookie based on webDriver's one
    String cookieName = originalCookie.getName();
    String cookieValue = originalCookie.getValue();
    BasicClientCookie resultCookie = new BasicClientCookie(cookieName, cookieValue);
    resultCookie.setDomain(DOMAIN);
    resultCookie.setExpiryDate(originalCookie.getExpiry());
    resultCookie.setPath(COOKIE_PATH);
    return resultCookie;
}
1 голос
/ 04 марта 2019

у меня работает:

# open the image in a new tab
driver.execute_script('''window.open("''' + wanted_url + '''","_blank");''')
sleep(2)
driver.switch_to.window(driver.window_handles[1])
sleep(2)

# make screenshot
driver.save_screenshot("C://Folder/" + photo_name + ".jpeg")
sleep(2)

# close the new tab
driver.execute_script('''window.close();''')
sleep(2)

#back to original tab
driver.switch_to.window(driver.window_handles[0])
1 голос
/ 14 октября 2016

Другие решения здесь не работают во всех браузерах, не работают на всех веб-сайтах или на обоих.

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

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

вот решение для JavaScript. это немного глупо - и я устал от попадания на сервер исходного изображения со слишком большим количеством запросов. может кто-нибудь сказать мне, если fetch () обращается к кешу браузера? я не хочу спамить исходный сервер.

он добавляет FileReader () к окну, извлекает и преобразует изображение в base64 и отмечает эту строку в окне.

драйвер может затем вернуть эту оконную переменную.

export async function scrapePic(driver) {
try {
console.log("waiting for that profile piccah")
console.log(driver)

let rootEl = await driver.findElement(By.css('.your-root-element'));
let imgEl = await rootEl.findElement(By.css('img'))
await driver.wait(until.elementIsVisible(imgEl, 10000));
console.log('profile piccah found')
let img = await imgEl.getAttribute('src')
//attach reader to driver window
await driver.executeScript(`window.myFileReader = new FileReader();`)
await driver.executeScript(`
  window.myFileReader.onloadend = function() {
    window['profileImage'] = this.result
  }
  fetch( arguments[0] ).then( res => res.blob() ).then( blob => window.electronFileReader.readAsDataURL(blob) )
  `, img)
await driver.sleep(5000)
let img64 = await driver.executeScript(`return window.profileImage`)
console.log(img64)


} catch (e) {
console.log(e)
} finally {
return img64
  }
}
0 голосов
/ 23 мая 2017

используйте селен для получения изображения

elemImg.get_attribute('src')

используйте для этого язык программирования для python; проверьте этот ответ: Как сохранить изображение локально, используя Python, URL-адрес которого я уже знаю?

0 голосов
/ 18 января 2013

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

protected boolean isResourceAvailableByUrl(String resourceUrl) {
    // backup current url, to come back to it in future
    String currentUrl = webDriver.getCurrentUrl();
    try {
        // try to get image by url
        webDriver.get(resourceUrl);
        // if "resource not found" message was not appeared - image exists
        return webDriver.findElements(RESOURCE_NOT_FOUND).isEmpty();
    } finally {
        // back to page
        webDriver.get(currentUrl);
    }
}

Но вы должны быть уверены, что прохождение currentUrl действительно вернет вас обратно на страницу перед выполнениемэтого метода.В моем случае это было так.Если нет - вы можете попытаться использовать:

webDriver.navigate().back()

А также, к сожалению, как представляется, нет никакой возможности проанализировать код состояния ответа.Вот почему вам нужно найти какой-либо конкретный веб-элемент на странице NOT_FOUND и проверить, появился ли он, а затем решить - что изображение не существует.

Это просто обходной путь, потому что я не нашел никакого официального способа решенияit.

ПРИМЕЧАНИЕ. Это решение полезно, если вы используете авторизованный сеанс для получения ресурса и не можете просто загрузить его с помощью ImageIO или строго с помощью HttpClient.

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