差異處

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

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
rf:rf:wget [2018/01/20 13:26]
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? ===== 
-==== 透過外部程式 ==== 
-起初我們透過外部程式去達到我們需求。大部分linux安裝起來就內建wget;windows可以從[[https://​eternallybored.org/​misc/​wget/​|這裡]]下載執行檔。首先要面對的問題應該是session,這可以透過SeleniumLibrary提供的Get Cookies來處理。 
- 
  
 +===== 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>​ <​code>​
 Download File Wit Wget Download File Wit Wget
行 17: 行 50:
     @{jessonid} ​   Split String ​   ${cookies} ​   JSESSIONID=     @{jessonid} ​   Split String ​   ${cookies} ​   JSESSIONID=
     ${location} ​   Get Location IP     ${location} ​   Get Location IP
-    ${cookies} ​   Set Variable ​   ​${location}\tFALSE\t//​\tFALSE\t9999999999\tssm_locale_language\ten\r\n ${location}\tFALSE\t//​\tFALSE\t9999999999\tssm_locale_country\t\r\n ​${location}\tFALSE\t//​\tFALSE\t0\tJSESSIONID\t@{jessonid}[1]\r\n localhost\tFALSE\t//​\tFALSE\t9999999999\tssm_locale_language\ten\r\n localhost\tFALSE\t//​\tFALSE\t9999999999\tssm_locale_country\t\r\n localhost\tFALSE\t//​\tFALSE\t0\tJSESSIONID\t@{jessonid}[1]+    ${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}     Log    ${cookies}
     Create File    ./​cookies ​   ${cookies}     Create File    ./​cookies ​   ${cookies}
行 26: 行 59:
     Should Be Equal As Integers ​   @{output}[0] ​   0    @{output}[1]     Should Be Equal As Integers ​   @{output}[0] ​   0    @{output}[1]
 </​code>​ </​code>​
- +==== 方法2: ​透過HttpClient Library ==== 
-==== 透過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
行 38: 行 73:
     log    ${ret}     log    ${ret}
 </​code>​ </​code>​
 +Test Library WgetLibrary:​
 <code java> <code java>
 import java.io.File;​ import java.io.File;​
行 54: 行 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 {
行 95: 行 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);​
  }  }
行 101: 行 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);
行 120: 行 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]]
 =====    ===== =====    =====
 ---- ----