2017-02-08 20 views
0

Я нашел thesethreepotential answers, но все они используют HtmlUnit api. Как я могу избежать использования HtmlUnit api и only use selenium или некоторой конфигурации для настройки браузера?Как заставить селен управлять htmlunit автоматически загружать изображения?

+0

какие изображения? вы могли бы поделиться более подробной информацией? – Andersson

+0

Изображения, на которые вы можете найти ссылки на тег изображения: . – Vernon

+0

Вы принимаете ответы только в Java? – Andersson

ответ

2

Насколько я знаю, нет возможности автоматически загружать все изображения с помощью 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 не является тривиальным. Существует несколько способов сделать это, но для каждого из них требуется доступ к методу protectedHtmlUnitDriver.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, чтобы добавить опцию автоматической загрузки изображений. Пожалуйста, проголосуйте за эту проблему, если вы хотите увидеть эту функцию.

3

Это сейчас часть HtmlUnit 2.25-моментального снимка, webClient.getOptions().setDownloadImages(true).

И в HtmlUnit-Driver 2.25-моментальный снимок по возможностям DOWNLOAD_IMAGES_CAPABILITY или htmlUnitDriver.setDownloadImages(true).