差異處

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

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
rf:rf:wget [2018/01/20 13:13]
tony
rf:rf:wget [2023/06/25 09:48] (目前版本)
行 1: 行 1:
 {{tag>​RobotFramework}} {{tag>​RobotFramework}}
-====== wget ======+====== ​RobotFramework Keyword: ​wget - 下載網頁上的資料 ​======
 ===== Problem ===== ===== Problem =====
 網站大都有提供下載功能,驗證下載功能與內容是否正常是必要的測試項目之一。然而,SeleniumLibrary並沒有提供類似的keyword。本篇文章分享我們解決這個問題的歷程。 網站大都有提供下載功能,驗證下載功能與內容是否正常是必要的測試項目之一。然而,SeleniumLibrary並沒有提供類似的keyword。本篇文章分享我們解決這個問題的歷程。
-httpclient-4.3.5\\ +
-${wget} --cookies=on --no-check-certificate --load-cookies cookies --output-document ${fileName} \ ${fileUrl}+
 ===== How to? ===== ===== How to? =====
-==== 透過外部程式 ==== +==== 方法1: ​透過外部程式wget ==== 
-起初我們透過外部程式去達到我們需求。大部分linux安裝起來就內建wget;windows可以從[[https://​eternallybored.org/​misc/​wget/​|這裡]]下載執行檔。 +起初我們透過外部程式去達到測試需求。要達成此目的,有幾個步驟:​ 
- +  - 測試環境可以執行wget。 
- +  - 取得下載位置的連結。 
-==== 透過HttpClient Library ====+  - 設定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 ==== 
 +由於我們將預設連線修改為https,並且只允許TLS1.2,這導致在舊版本的Linux如RHEL6.0上無法透過預設的wget進行測試。因此改為自己實作TestLibrary去提供wget的功能。我所使用的HttpClient版本為httpclient-4.3.5,我直接將程式分享給各位,這可能會根據你的需求或library版本需要做些微調:​\\ 
 +\\ 
 +Robot Keyword:
 <​code>​ <​code>​
 Download File Download File
行 21: 行 73:
     log    ${ret}     log    ${ret}
 </​code>​ </​code>​
 +Test Library WgetLibrary:​
 <code java> <code java>
 import java.io.File;​ import java.io.File;​
行 37: 行 90:
 import org.apache.http.impl.client.HttpClientBuilder;​ import org.apache.http.impl.client.HttpClientBuilder;​
 import org.apache.http.impl.cookie.BasicClientCookie;​ import org.apache.http.impl.cookie.BasicClientCookie;​
- 
-import com.supermicro.ssm.common.Cleaner;​ 
- 
  
 public class WgetLibrary {  public class WgetLibrary {
行 78: 行 128:
  BasicCookieStore cookieStore = createCookieStore(cookies,​ domain, path);  BasicCookieStore cookieStore = createCookieStore(cookies,​ domain, path);
  if( cookieStore != null ) {  if( cookieStore != null ) {
- System.out.println("​set cookie: " + cookies); 
  builder.setDefaultCookieStore(cookieStore);​  builder.setDefaultCookieStore(cookieStore);​
  }  }
行 84: 行 133:
  httpClient = builder.build();​  httpClient = builder.build();​
  response = httpClient.execute(new HttpGet(url));​  response = httpClient.execute(new HttpGet(url));​
- System.out.println("​destfile:​ " + new File(destFile).getAbsolutePath());​ 
  fos = new FileOutputStream(new File(destFile));​  fos = new FileOutputStream(new File(destFile));​
  IOUtils.copy(response.getEntity().getContent(),​ fos);  IOUtils.copy(response.getEntity().getContent(),​ fos);
行 103: 行 151:
   * [[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/​NoopHostnameVerifier.html|javadoc - NoopHostnameVerifier]]
   * [[https://​hc.apache.org/​httpcomponents-client-ga/​httpclient/​apidocs/​org/​apache/​http/​conn/​ssl/​TrustSelfSignedStrategy.html|javadoc - TrustSelfSignedStrategy]]   * [[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]]
 +  * [[http://​www.baeldung.com/​httpclient-4-cookies|HttpClient 4 – Send Custom Cookie]]
 =====    ===== =====    =====
 ---- ----