private WebDriver createWebDriver() {
boolean useProxy = true;
Proxy proxy = useProxy ? new Proxy() : null;
DesiredCapabilities capability = DesiredCapabilities.htmlUnit();
capability.setJavascriptEnabled(true);
// Chequea si debe configurar un proxy de salida a internet, si es que está configurado
if ( useProxy ) {
String proxySettings = PROXY_HOST + ":" + PROXY_PORT;
proxy.setProxyType(ProxyType.MANUAL);
proxy.setHttpProxy(proxySettings).setSslProxy(proxySettings);
capability.setCapability(CapabilityType.PROXY, proxy);
capability.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capability.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
}
HtmlUnitDriver driver = new HtmlUnitDriver(capability) {
@Override
protected WebClient modifyWebClient(WebClient client) {
// Configura que no se aborte la ejecución de la página por errores de JavaScript
client.getOptions().setThrowExceptionOnScriptError(false);
LOGGER.debug("modifyWebClient -> isThrowExceptionOnScriptError: {}", client.getOptions().isThrowExceptionOnScriptError());
// Chequea si debe configurar un proxy de salida a internet, si es que está configurado
if ( useProxy ) {
ProxyConfig proxyConfig = new ProxyConfig(PROXY_HOST, PROXY_PORT);
proxyConfig.setSocksProxy(false);
client.getOptions().setUseInsecureSSL(true);
client.getOptions().setProxyConfig(proxyConfig);
// Agrega el provider a la instancia webClient
DefaultCredentialsProvider credentialsProvider = new DefaultCredentialsProvider();
credentialsProvider.addCredentials("username", "password");
client.setCredentialsProvider(credentialsProvider);
}
// Configura handler para ventanas de confirmación que siempre acepta (retorna true)
ConfirmHandler okHandler = new ConfirmHandler() {
public boolean handleConfirm(Page page, String message) {
return true;
}
};
client.setConfirmHandler(okHandler);
// Configura handler para procesar respuesta de una página
client.addWebWindowListener(new WebWindowListener() {
public void webWindowOpened(WebWindowEvent event) {
}
@SuppressWarnings("unchecked")
public void webWindowContentChanged(WebWindowEvent event) {
WebResponse response = event.getWebWindow().getEnclosedPage().getWebResponse();
try {
Map<String, String> headersMap = ObjectUtils.toMap(response.getResponseHeaders(), "name", "value");
// Si es de tipo application/octet-strem, es un archivo
if (response.getContentType().equals("application/octet-strem")) {
// Genera el path donde quedarán los archivos
String actualPath = "";
String downloadPath = SII_DIRECTORY;
if ( StringUtils.isNotNullOrEmpty(downloadPath) ) {
File downloadDir = new File(downloadPath);
if (!downloadDir.exists())
downloadDir.mkdirs();
actualPath = downloadPath + File.separator;
}
// Obtiene el nombre del archivo a bajar y lo copia
String contentDisposition = headersMap.get("Content-Disposition");
String downloadedFileName = actualPath + contentDisposition.substring(contentDisposition.indexOf('=') + 1);
LOGGER.debug("webWindowContentChanged -> Downloading file: {}", downloadedFileName);
IOUtils.copy(response.getContentAsStream(), new FileOutputStream(downloadedFileName));
}
} catch (Exception ex) {
LOGGER.error("webWindowContentChanged -> Exception: {}", ex.getMessage(), ex);
}
}
public void webWindowClosed(WebWindowEvent event) {
}
});
return client;
}
};
// Chequea si debe configurar un proxy de salida a internet, si es que está configurado
if ( useProxy ) {
driver.setProxySettings(proxy);
driver.setAcceptSslCertificates(true);
}
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
driver.setJavascriptEnabled(true);
return driver;
}
I'll appreciate any help. Thanks.