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