主要代码如下所示:
FileDownloader类
package com.test.filedownloader;
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.BasicHttpContext;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import com.test.MyLog;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Set;
public class FileDownloader {
private WebDriver driver;
// private String localDownloadPath = System.getProperty("java.io.tmpdir");
private String localDownloadPath = "E:\\素材\\pictures\\downloads\\";
private boolean followRedirects = true;
private boolean mimicWebDriverCookieState = true;
private int httpStatusOfLastDownloadAttempt = 0;
public FileDownloader(WebDriver driverObject) {
this.driver = driverObject;
}
/**
* Specify if the FileDownloader class should follow redirects when trying to download a file
*
* @param value
*/
public void followRedirectsWhenDownloading(boolean value) {
this.followRedirects = value;
}
/**
* Get the current location that files will be downloaded to.
*
* @return The filepath that the file will be downloaded to.
*/
public String localDownloadPath() {
return this.localDownloadPath;
}
/**
* Set the path that files will be downloaded to.
*
* @param filePath The filepath that the file will be downloaded to.
*/
public void localDownloadPath(String filePath) {
this.localDownloadPath = filePath;
}
/**
* Download the file specified in the href attribute of a WebElement
*
* @param element
* @return
* @throws Exception
*/
public String downloadFile(WebElement element) throws Exception {
return downloader(element, "href");
}
/**
* Download the image specified in the src attribute of a WebElement
*
* @param element
* @return
* @throws Exception
*/
public String downloadImage(WebElement element) throws Exception {
return downloader(element, "src");
}
/**
* Gets the HTTP status code of the last download file attempt
*
* @return
*/
public int getHTTPStatusOfLastDownloadAttempt() {
return this.httpStatusOfLastDownloadAttempt;
}
/**
* Mimic the cookie state of WebDriver (Defaults to true)
* This will enable you to access files that are only available when logged in.
* If set to false the connection will be made as an anonymouse user
*
* @param value
*/
public void mimicWebDriverCookieState(boolean value) {
this.mimicWebDriverCookieState = value;
}
/**
* Load in all the cookies WebDriver currently knows about so that we can mimic the browser cookie state
*
* @param seleniumCookieSet
* @return
*/
private BasicCookieStore mimicCookieState(Set<Cookie> seleniumCookieSet) {
BasicCookieStore mimicWebDriverCookieStore = new BasicCookieStore();
for (Cookie seleniumCookie : seleniumCookieSet) {
BasicClientCookie duplicateCookie = new BasicClientCookie(seleniumCookie.getName(), seleniumCookie.getValue());
duplicateCookie.setDomain(seleniumCookie.getDomain());
duplicateCookie.setSecure(seleniumCookie.isSecure());
duplicateCookie.setExpiryDate(seleniumCookie.getExpiry());
duplicateCookie.setPath(seleniumCookie.getPath());
mimicWebDriverCookieStore.addCookie(duplicateCookie);
}
return mimicWebDriverCookieStore;
}
/**
* Perform the file/image download.
*
* @param element
* @param attribute
* @return
* @throws IOException
* @throws NullPointerException
*/
private String downloader(WebElement element, String attribute) throws IOException, NullPointerException, URISyntaxException {
String fileToDownloadLocation = element.getAttribute(attribute);
MyLog.logger.info("attribute: "+fileToDownloadLocation);
if (fileToDownloadLocation.trim().equals("")) throw new NullPointerException("The element you have specified does not link to anything!");
URL fileToDownload = new URL(fileToDownloadLocation);
MyLog.logger.info("file: "+fileToDownload.getFile());
File downloadedFile = new File(this.localDownloadPath + fileToDownload.getFile().replaceFirst("(/|\\\\).*(/|\\\\)", ""));
if (downloadedFile.canWrite() == false) downloadedFile.setWritable(true);
HttpClient client = new DefaultHttpClient();
BasicHttpContext localContext = new BasicHttpContext();
MyLog.logger.info("Mimic WebDriver cookie state: " + this.mimicWebDriverCookieState);
if (this.mimicWebDriverCookieState) {
localContext.setAttribute(ClientContext.COOKIE_STORE, mimicCookieState(this.driver.manage().getCookies()));
}
HttpGet httpget = new HttpGet(fileToDownload.toURI());
HttpParams httpRequestParameters = httpget.getParams();
httpRequestParameters.setParameter(ClientPNames.HANDLE_REDIRECTS, this.followRedirects);
httpget.setParams(httpRequestParameters);
MyLog.logger.info("Sending GET request for: " + httpget.getURI());
HttpResponse response = client.execute(httpget, localContext);
this.httpStatusOfLastDownloadAttempt = response.getStatusLine().getStatusCode();
MyLog.logger.info("HTTP GET request status: " + this.httpStatusOfLastDownloadAttempt);
if(this.httpStatusOfLastDownloadAttempt==200){
MyLog.logger.info("Downloading file: " + downloadedFile.getName());
FileUtils.copyInputStreamToFile(response.getEntity().getContent(), downloadedFile);
response.getEntity().getContent().close();
String downloadedFileAbsolutePath = downloadedFile.getAbsolutePath();
MyLog.logger.info("File downloaded to '" + downloadedFileAbsolutePath + "'");
return downloadedFileAbsolutePath;
}
return "";
}
}
RequestMethod类
package com.test.filedownloader;
import org.apache.http.client.methods.*;
public enum RequestMethod {
OPTIONS(new HttpOptions()),
GET(new HttpGet()),
HEAD(new HttpHead()),
POST(new HttpPost()),
PUT(new HttpPut()),
DELETE(new HttpDelete()),
TRACE(new HttpTrace());
private final HttpRequestBase requestMethod;
RequestMethod(HttpRequestBase requestMethod) {
this.requestMethod = requestMethod;
}
public HttpRequestBase getRequestMethod() {
return this.requestMethod;
}
}
调用类部分代码:
@Test
public void DownloadImages() throws Exception{
// BaiduImgDownload BaiduDownloadPics=new BaiduImgDownload();
wait=new WebDriverWait(driver,10);
String testProject="scmtest";
String testPlan="DownloadPicsfromBaidu";
String testcase="download pictures from Baidu website";
String build="DownloadPicsfromBaidu";
String notes=null;
String result=null;
try{
// driver.manage().window().maximize();
FileDownloader fileDownloader=new FileDownloader(driver);
driver.get(baseUrl +"search/detail?ct=503316480&z=0&ipn=false&word=头像 可爱&pn=8&spn=0&di=48693053420&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=&ie=utf-8&oe=utf-8&in=3354&cl=2&lm=-1%2C&st=&cs=2390703471%2C168602444&os=2076211555%2C1322829468&adpicid=0&ln=2000&fr=ala&fmq=1378374347070_R&ic=0&s=0%2C&se=&sme=&tab=&face=&ist=&jit=&statnum=head&cg=head&bdtype=0&objurl=http%3A%2F%2Fimg5.duitang.com%2Fuploads%2Fitem%2F201403%2F14%2F20140314121845_8iTiY.thumb.700_0.jpeg&fromurl=http%3A%2F%2Fwww.duitang.com%2Fpeople%2Fmblog%2F204985052%2Fdetail%2F&gsm=0");
WebElement image=driver.findElement(By.cssSelector("div.img-wrapper>img"));
int count=1;
while(count<6){
boolean isVisible=this.IsImageVisible(driver, image);
if(isVisible){
String imgAbsoluteLocat=fileDownloader.downloadImage(image);
if(imgAbsoluteLocat!=""){
MyLog.logger.info("----"+count+" picture is available");
assertThat(new File(imgAbsoluteLocat).exists(),is(equalTo(true)));
assertThat(fileDownloader.getHTTPStatusOfLastDownloadAttempt(), is(equalTo(200)));
}else{
MyLog.logger.info("----"+count+" picture is unavailable");
}
driver.findElement(By.cssSelector("span.img-next > span.img-switch-btn")).click();
driver.switchTo().defaultContent();
MyLog.logger.info("----navigate to the next img");
}
count++;
}
// wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("h4[title='品牌']")));
// assertNotNull("login name not found",driver.findElement(By.xpath("//h1[contains(text(),'Free Photos about valentine')]")));
// driver.findElement(By.xpath("//h1[contains(text(),'Free Photos about valentine')]")).click();
// result=TestLinkAPIResults.TEST_PASSED;
// notes="Automated Executed successfully by java at "+dateformat.format(new Date());
// System.out.println("-success--");
MyLog.logger.info("---bottom--");
}catch(Exception e){
MyLog.logger.info("=fail 2==\n"+e.getMessage());
result=TestLinkAPIResults.TEST_FAILED;
notes="Automated Execution failed by java at "+dateformat.format(new Date());
}catch(Error e){
MyLog.logger.info("Error:"+e.getMessage());
}finally{
MyLog.logger.info("=00==");
// automateLogin163.reportResult(testProject, testPlan, testcase, build, notes, result);
// System.out.println("*have updated testlink testcase status**");
}
}