這是本文件的舊版!


wget

網站大都有提供下載功能,驗證下載功能與內容是否正常是必要的測試項目之一。然而,SeleniumLibrary並沒有提供類似的keyword。本篇文章分享我們解決這個問題的歷程。 httpclient-4.3.5
${wget} –cookies=on –no-check-certificate –load-cookies cookies –output-document ${fileName} \ ${fileUrl}

透過外部程式

起初我們透過外部程式去達到我們需求。大部分linux安裝起來就內建wget;windows可以從這裡下載執行檔。

透過HttpClient Library

Download File
    [Arguments]    ${fileUrl}    ${fileName}
    Log    ${fileUrl}
    ${cookies}    Get Cookies
    @{jessonid}    Split String    ${cookies}    JSESSIONID=
    ${location}    Get Location IP
    ${ret}    wget    ${fileUrl}    ${fileName}    JSESSIONID=@{jessonid}[1]    ${location}
    log    ${ret}
import java.io.File;
import java.io.FileOutputStream;
 
import javax.net.ssl.SSLContext;
 
import org.apache.commons.io.IOUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.cookie.BasicClientCookie;
 
import com.supermicro.ssm.common.Cleaner;
 
 
public class WgetLibrary {	
	 public static final String ROBOT_LIBRARY_SCOPE = "TEST CASE";
	 public static final String ROBOT_LIBRARY_VERSION = "1.0.0";
 
	private BasicCookieStore createCookieStore(String cookies, String domain, String path){
		if( cookies == null || cookies.isEmpty() )
			return null;
 
		BasicCookieStore cookieStore = new BasicCookieStore();
		String[] cookiePairs = cookies.split(";");
		for( String cookiePair : cookiePairs){
			String[] cookieToken = cookiePair.split("=");
			BasicClientCookie cookie = new BasicClientCookie(cookieToken[0], cookieToken[1]);
			cookie.setDomain(domain);
			cookie.setPath(path);
			cookieStore.addCookie(cookie);
		}
		return cookieStore;
	}
 
	public long wget(String url, String destFile, String cookies, String domain){
		return wget(url, destFile, cookies, domain, "/");
	}
 
	public long wget(String url, String destFile, String cookies, String domain, String path){
		CloseableHttpClient httpClient = null;
		FileOutputStream fos = null;
		CloseableHttpResponse response = null;
		try {
			HttpClientBuilder builder = HttpClientBuilder.create();
 
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build();
			SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
			builder.setSSLSocketFactory(sslSocketFactory);
 
			BasicCookieStore cookieStore = createCookieStore(cookies, domain, path);
			if( cookieStore != null ) {
				System.out.println("set cookie: " + cookies);
				builder.setDefaultCookieStore(cookieStore);
			}
 
			httpClient = builder.build();
			response = httpClient.execute(new HttpGet(url));
			System.out.println("destfile: " + new File(destFile).getAbsolutePath());
			fos = new FileOutputStream(new File(destFile));
			IOUtils.copy(response.getEntity().getContent(), fos);
			return response.getStatusLine().getStatusCode();
		} catch( Exception e ){
			throw new RuntimeException(e);
		} finally {
			Cleaner.close(fos);
			Cleaner.close(response);
			Cleaner.close(httpClient);
		}
	}
}