不借助autolt实现下载文件到指定目录

Posted 久曲健

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不借助autolt实现下载文件到指定目录相关的知识,希望对你有一定的参考价值。

今天尝试了下不用借助autolt完成下载文件到指定目录,

好处:在于集成回归,远程机可以绕过执行autolt程序权限问题,导致autolt程序无法调用,不能完成脚本的回归

Firefox浏览器已经成功,代码如下:

package com.dwkj.test.util;

import java.io.File;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.javascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

/**
 * 
 * @author longrong.lang
 *    不借助autolt实现下载文件到指定目录
 *
 */
public class FirefoxDownloadTest {

    public static void main(String[] args) {

        FirefoxProfile profile = new FirefoxProfile();
        // 可以在Firefox浏览器地址栏中输入about:config来查看属性
        // 设置下载文件放置路径,注意如果是windows环境一定要用\\,用/不行
        String path = "C:\\wps";
        String downloadFilePath = path + "\\demo.exe";
        File file = new File(downloadFilePath);
        if (file.exists()) {
            file.delete();
        }
        // 配置响应下载参数
        // 下载路径
        profile.setPreference("browser.download.dir", path);
        // 2为保存在指定路径,0代表默认路径
        profile.setPreference("browser.download.folderList", 2);
        // 是否显示开始
        profile.setPreference("browser.download.manager.showWhenStarting", false);
        // 禁止弹出保存框,value是文件格式,如zip文件
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/zip,text/plain,application/vnd.ms-excel,text/csv,text/comma-separated-values,application/octet-stream,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        WebDriver driver = new FirefoxDriver(profile);
        driver.get("file:///C:/Demo.html");
        driver.manage().window().maximize();

        driver.findElement(By.linkText("下载")).click();

        waitTime(3000);
        String js_exist = "alert(\"download successfully\")";
        String js_not_exist = "alert(\"download unsuccessfully\")";

        if (file.exists()) {
            ((JavascriptExecutor) driver).executeScript(js_exist);
        } else {
            ((JavascriptExecutor) driver).executeScript(js_not_exist);
        }
        Alert alert = driver.switchTo().alert();
        waitTime(2000);
        alert.accept();
        // driver.quit();

    }

    static public void waitTime(int time) {

        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

chrome浏览器,也算成功,但是遗留个小问题,就是会提示是否保留,点保留会下载到你指定的目录,如不点击不保存,在群里问的发总,发总说chrome的这个profile被取消了,结果我又百度了下,说是33版本之前的可以,之后不可以,这个有兴趣的小伙伴可以自己去试试。代码如下:

package com.dwkj.test.util;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

/**
 * 
 * @author longrong.lang
 *    不借助autolt实现下载文件到指定目录
 *
 */
public class ChromeDownloadTest {

    public static void main(String[] args) {

        String path = "C:\\wps";
        // 设置下载文件放置路径,注意如果是windows环境一定要用\\,用/不行
        String downloadFilePath = path + "\\demo.exe";
        File file = new File(downloadFilePath);
        if (file.exists()) {
            file.delete();
        }
        System.setProperty("webdriver.chrome.driver", "tools/chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        // 去掉打开谷歌浏览器时上方提示的不支持的命令行标记
        options.addArguments("test-type");
        options.addArguments("--start-maximized");
        options.addArguments("--disable-popup-blocking");
        options.addArguments("no-sandbox");
        options.addArguments("disable-extensions");
        options.addArguments("no-default-browser-check");
        Map<String, Object> prefs = new HashMap<String, Object>();
        prefs.put("credentials_enable_service", false);
        // 禁用密码保存
        prefs.put("profile.password_manager_enabled", false);
        // 2为保存在指定路径,0代表默认路径
        prefs.put("profile.default_content_settings.popups", 2);
        prefs.put("download.default_directory", path);
        options.setExperimentalOption("prefs", prefs);
        WebDriver driver = new ChromeDriver(options);
        driver.get("file:///C:/demo.html");
        driver.manage().window().maximize();

        driver.findElement(By.linkText("下载")).click();

        waitTime(3000);
        String js_exist = "alert(\"download successfully\")";
        String js_not_exist = "alert(\"download unsuccessfully\")";

        if (file.exists()) {
            ((JavascriptExecutor) driver).executeScript(js_exist);
        } else {
            ((JavascriptExecutor) driver).executeScript(js_not_exist);
        }
        Alert alert = driver.switchTo().alert();
        waitTime(2000);
        alert.accept();
        // driver.quit();

    }

    static public void waitTime(int time) {

        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

 

测试文件:

<!DOCTYPE html>
<html>
<head>

<title>download</title>
</head>
<body>
    <a href="demo.exe">下载</a>
</body>
</html>

 

以上是关于不借助autolt实现下载文件到指定目录的主要内容,如果未能解决你的问题,请参考以下文章

windows 下借助7zip实现命令行解压缩

spring boot项目使用poi导出excel到指定目录并且从指定目录下载excel文件

selenium 常见操作,上传操作

时如何去除目录结构及其解压到指定目录 (

Linux下不借助工具实现远程linux服务器上传下载文件

shell脚本里怎么实现从网上下载文件(链接已给定),冰保存到指定路径下,求高手指导