差異處
這裏顯示兩個版本的差異處。
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]] | ||
===== ===== | ===== ===== | ||
---- | ---- |