差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

rf:rf:wget [2018/01/21 00:13]
tony [RobotFramework Keyword: wget]
rf:rf:wget [2023/06/25 09:48]
行 1: 行 1:
-{{tag>​RobotFramework}} 
-====== RobotFramework Keyword: wget - 下載網頁資料 ====== 
-===== Problem ===== 
-網站大都有提供下載功能,驗證下載功能與內容是否正常是必要的測試項目之一。然而,SeleniumLibrary並沒有提供類似的keyword。本篇文章分享我們解決這個問題的歷程。 
- 
-===== How to? ===== 
-==== 方法1: 透過外部程式wget ==== 
-起初我們透過外部程式去達到我們的測試需求。要達成此目的,有幾個步驟:​ 
-  - 測試環境可以執行wget。 
-  - 取得下載位置的連結。 
-  - 設定Cookie。 
-  - 執行下載。 
-  - 驗證內容。 
-\\ 
-=== 步驟1: 測試環境可以執行wget === 
-大部分linux安裝起來就內建wget,沒有就自行安裝;windows可以從[[https://​eternallybored.org/​misc/​wget/​|這裡]]下載執行檔,將它放到你的測試環境中。\\ 
-\\ 
-=== 步驟2: 取得下載位置的連結 === 
-在這裡我使用的是Get Element Attribute去取得hyper link的內容:​ 
-<​code>​ 
-Get Element Attribute | //​a[@id='​link_id'​]@href 
-</​code>​ 
-\\ 
-=== 步驟3: 設定Cookie === 
-假如你的網站是需要登入才能夠操作,這部分就是必要的。首先可以透過SeleniumLibrary提供的[[http://​robotframework.org/​SeleniumLibrary/​SeleniumLibrary.html#​Get%20Cookies|Get Cookies]]來取得當前session內容;它所拿到的內容是使用name1=value1;​ name2=value2;​形式組成,只要挑你需要的屬性出來即可。對我們而言,JSESSIONID記載我們的登入資訊。\\ 
-\\ 
-接著是要組成wget所需要的cookie file格式,詳細格式可以參考此[[https://​unix.stackexchange.com/​questions/​36531/​format-of-cookies-when-using-wget|連結]],大致上如下:​ 
-<​code>​ 
-${domain_ip} ​  ​FALSE ​  ​${path} ​  ​FALSE ​  ​9999999999 ​  ​JSESSIONID ​  ​${jsession_id} 
-</​code>​ 
-假如你是使用localhost連線,${domain_ip}就是localhost,否則就是要連線的機器IP。\\ 
-\\ 
-=== 步驟4: 執行下載 === 
-假如參數連結位置為${fileUrl}而下載檔案路徑${fileName},wget的執行指令如下:​ 
-<​code>​ 
-${wget} --cookies=on --load-cookies ${cookie_file} --output-document ${fileName} ${fileUrl} 
-</​code>​ 
-如果下載的位置為https,為了略過Certificate驗證,會搭配--no-check-certificate參數:​ 
-<​code>​ 
-${wget} --cookies=on --no-check-certificate --load-cookies ${cookie_file} --output-document ${fileName} ${fileUrl} 
-</​code>​ 
-\\ 
-=== 步驟5: 驗證內容 === 
-這部分就是看各位的業務需求去做assertion了。我的Keyword提供給大家參考:​ 
-<​code>​ 
-Download File Wit Wget 
-    [Arguments] ​   ${fileUrl} ​   ${fileName} 
-    Log    ${fileUrl} 
-    ${cookies} ​   Get Cookies 
-    @{jessonid} ​   Split String ​   ${cookies} ​   JSESSIONID= 
-    ${location} ​   Get Location IP 
-    ${cookies} ​   Set Variable ​   ${location}\tFALSE\t//​\tFALSE\t0\tJSESSIONID\t@{jessonid}[1]\r\n localhost\tFALSE\t//​\tFALSE\t0\tJSESSIONID\t@{jessonid}[1] 
-    Log    ${cookies} 
-    Create File    ./​cookies ​   ${cookies} 
-    ${currentdir} ​   Get Suite Directory 
-    ${isLinux} ​   Is Linux 
-    ${wget} ​   Set Variable If    '​${isLinux}'​!='​TRUE' ​   ${currentdir}${/​}..${/​}commonResource${/​}wget${/​}wget ​   '​${isLinux}'​!='​FALSE' ​   wget 
-    @{output} ​   Run And Return Rc And Output ​   ${wget} --cookies=on --no-check-certificate --load-cookies cookies --output-document ${fileName} \ ${fileUrl} 
-    Should Be Equal As Integers ​   @{output}[0] ​   0    @{output}[1] 
-</​code>​ 
- 
-==== 方法2: 透過HttpClient Library ==== 
-httpclient-4.3.5 
-<​code>​ 
-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} 
-</​code>​ 
-<code java> 
-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);​ 
- } 
- } 
-} 
-</​code>​ 
-===== Reference ===== 
-  * [[https://​unix.stackexchange.com/​questions/​36531/​format-of-cookies-when-using-wget|Format of cookies when using wget?]] 
-  * [[https://​memorynotfound.com/​ignore-certificate-errors-apache-httpclient/​|How to Ignore Certificate Errors in Apache HttpClient 4.5]] 
-  * [[https://​hc.apache.org/​httpcomponents-client-ga/​httpclient/​apidocs/​org/​apache/​http/​conn/​ssl/​NoopHostnameVerifier.html|javadoc - NoopHostnameVerifier]] 
-  * [[https://​hc.apache.org/​httpcomponents-client-ga/​httpclient/​apidocs/​org/​apache/​http/​conn/​ssl/​TrustSelfSignedStrategy.html|javadoc - TrustSelfSignedStrategy]] 
-  * [[http://​robotframework.org/​SeleniumLibrary/​SeleniumLibrary.html|RobotFramework - SeleniumLibrary]] 
-=====    ===== 
----- 
-\\ 
-~~DISQUS~~