Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA Selenium Webdriver在下载前询问每个文件的保存位置_Java_Selenium_Browser_Selenium Webdriver - Fatal编程技术网

JAVA Selenium Webdriver在下载前询问每个文件的保存位置

JAVA Selenium Webdriver在下载前询问每个文件的保存位置,java,selenium,browser,selenium-webdriver,Java,Selenium,Browser,Selenium Webdriver,我正在尝试使用Selenium自动下载文件 每当收到要下载的文件时,我都希望将该特定文件保存到自定义位置,并使用自定义名称保存它 我希望浏览器要求保存每个文件,以便动态提供自定义路径和文件名 我可以将文件保存到自定义目录,但无法控制文件名。我想使用java.awt.Robot、java.awt.datatransfer.StringSelection和java.awt.Toolkit来使用自定义文件名 我的代码 ChromeOptions ChromeOptions=新的ChromeOption

我正在尝试使用Selenium自动下载文件

每当收到要下载的文件时,我都希望将该特定文件保存到自定义位置,并使用自定义名称保存它

我希望浏览器要求保存每个文件,以便动态提供自定义路径和文件名

我可以将文件保存到自定义目录,但无法控制文件名。我想使用
java.awt.Robot
java.awt.datatransfer.StringSelection
java.awt.Toolkit
来使用自定义文件名

我的代码

ChromeOptions ChromeOptions=新的ChromeOptions();
HashMap chromePreferences=新HashMap();
chromePreferences.put(“profile.default\u content\u settings.popups”,0);
chromePreferences.put(“download.default_目录”,browserDownloadDirectoryPath);
chromePreferences.put(“safebrowsing.enabled”、“true”);
色度选项。设置实验选项(“优先”,色度参考);
addArguments(“--测试类型”);
chromeDesiredCapabilities=DesiredCapabilities.chrome();
ChromeDesiredCapability.setCapability(ChromeOptions.CAPABILITY,ChromeOptions);
这是将文件保存到自定义文件夹

如果浏览器要求保存文件,我想使用Robot类发送路径

StringSelection stringSelection = new StringSelection(
                "<file path>" + "<file name>");
Toolkit.getDefaultToolkit().getSystemClipboard()
                .setContents(stringSelection, null);

Robot robot = new Robot();

robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_DOWN);
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_DOWN);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
StringSelection StringSelection=新建StringSelection(
"" + "");
Toolkit.getDefaultToolkit().getSystemClipboard()
.setContents(stringSelection,null);
机器人=新机器人();
机器人按键(KeyEvent.VK_控制);
robot.keyPress(KeyEvent.VK_V);
robot.keyrease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_控制);
robot.keyPress(KeyEvent.VK_选项卡);
robot.keyRelease(KeyEvent.VK_选项卡);
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyerelease(KeyEvent.VK_DOWN);
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyerelease(KeyEvent.VK_DOWN);
robot.keyPress(KeyEvent.VK_选项卡);
robot.keyRelease(KeyEvent.VK_选项卡);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
请提供强制浏览器请求保存文件的解决方案


对于Firefox,我们有
about:config
来查看浏览器的所有首选项。其他浏览器也有类似的功能吗?

为chrome浏览器设置所需的功能

  String downloadFilepath = "your path to save file";
  HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
  chromePrefs.put("profile.default_content_settings.popups", 0);
  chromePrefs.put("download.default_directory", downloadFilepath);
  ChromeOptions options = new ChromeOptions();
  options.setExperimentalOption("prefs", chromePrefs);
  DesiredCapabilities cap = DesiredCapabilities.chrome();
  cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
  cap.setCapability(ChromeOptions.CAPABILITY, options);
  WebDriver driver = new ChromeDriver(cap);
String downloadFilepath=“保存文件的路径”;
HashMap chromePrefs=新HashMap();
chromePrefs.put(“profile.default\u content\u settings.popups”,0);
chromePrefs.put(“download.default\u目录”,downloadFilepath);
ChromeOptions选项=新的ChromeOptions();
选项。设置实验选项(“prefs”,chromePrefs);
DesiredCapabilities=DesiredCapabilities.chrome();
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS,true);
上限设置能力(色度选项、能力、选项);
WebDriver=新的ChromeDriver(cap);

更好的方法是将chrome设置为自动下载文件,然后等待新文件出现并最终重命名

下面是一个示例,通过单击链接下载PDF,然后将其重命名为“mydocument.PDF”:

//定义下载文件夹
Path download_folder=Path.get(System.getProperty(“user.home”)+“/Downloads”);
//定义首选项
HashMap prefs=新的HashMap();
prefs.put(“download.default_目录”,download_folder.toabsolutionPath());
prefs.put(“下载.提示下载”,false);
prefs.put(“download.directory\u upgrade”,true);
prefs.put(“plugins.plugins_disabled”,新字符串[]{“chromepdfviewer”});
//定义选项
HashMap选项=新建HashMap();
期权。看跌期权(“优先股”,优先股);
//定义功能
DesiredCapabilities=DesiredCapabilities.chrome();
能力。设置能力(“色度选项”,选项);
//启动驱动程序
WebDriver=新的ChromeDriver(功能);
//点击PDF链接
驱动程序。获取(“http://www.adobe.com/legal/terms.html");
driver.findElement(By.linkText(“Adobe Creative SDK”))。单击();
//等待下载PDF
File File=WaitForNewFile(下载文件夹“.pdf”,60);
//重命名下载的文件
重命名(下载_folder.resolve(“mydocument.pdf”).toFile();
//退出
driver.quit();
对于档案服务员:

/**
 * Waits for a new file to be downloaded with a file watcher
 */
public static File WaitForNewFile(Path folder, String extension, int timeout_sec) throws InterruptedException, IOException {
    long end_time = System.currentTimeMillis() + timeout_sec * 1000;
    try (WatchService watcher = FileSystems.getDefault().newWatchService()) {
        folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
        for (WatchKey key; null != (key = watcher.poll(end_time - System.currentTimeMillis(), TimeUnit.MILLISECONDS)); key.reset()) {
            for (WatchEvent<?> event : key.pollEvents()) {
                File file = folder.resolve(((WatchEvent<Path>)event).context()).toFile();
                if (file.toString().toLowerCase().endsWith(extension.toLowerCase()))
                    return file;
            }
        }
    }
    return null;
}
/**
*等待使用文件监视程序下载新文件
*/
公共静态文件WaitForNewFile(路径文件夹,字符串扩展名,int timeout_sec)引发InterruptedException,IOException{
long end_time=System.currentTimeMillis()+超时秒*1000;
try(WatchService watcher=FileSystems.getDefault().newWatchService()){
文件夹。注册表(watcher、StandardWatchEventTypes.ENTRY\u MODIFY);
for(WatchKey key;null!=(key=watcher.poll(end_time-System.currentTimeMillis(),TimeUnit.milliss));key.reset()){
for(WatchEvent事件:key.pollEvents()){
File File=folder.resolve(((WatchEvent)event.context()).toFile();
if(文件.toString().toLowerCase().endsWith(扩展名.toLowerCase()))
返回文件;
}
}
}
返回null;
}

您是否可以检查一下,看看是否有类似的Java版本。我不知道将下载哪种类型的文件。那我该怎么办?
下载。目录\u升级
-这意味着什么?对于首选项的描述:如果您没有PDF的特定url(这是我的情况,单击按钮可从通用url下载PDF),但如果您有特定url,这里的FileDownloader中描述的解决方案也非常有效:
// define the download folder
Path download_folder = Paths.get(System.getProperty("user.home") + "/Downloads");

// define the preferences
HashMap<String, Object> prefs = new HashMap<String, Object>();
prefs.put("download.default_directory", download_folder.toAbsolutePath());
prefs.put("download.prompt_for_download", false);
prefs.put("download.directory_upgrade", true);
prefs.put("plugins.plugins_disabled", new String[]{"Chrome PDF Viewer"});

// define the options
HashMap<String, Object> options = new HashMap<String, Object>();
options.put("prefs", prefs);

// define the capabilities
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chromeOptions", options);

// start the driver
WebDriver driver = new ChromeDriver(capabilities);

// click on a PDF link
driver.get("http://www.adobe.com/legal/terms.html");
driver.findElement(By.linkText("Adobe Creative SDK")).click();

// wait for the PDF to be downloaded
File file = WaitForNewFile(download_folder, ".pdf", 60);

// rename the downloaded file
file.renameTo(download_folder.resolve("mydocument.pdf").toFile());

// quit
driver.quit();
/**
 * Waits for a new file to be downloaded with a file watcher
 */
public static File WaitForNewFile(Path folder, String extension, int timeout_sec) throws InterruptedException, IOException {
    long end_time = System.currentTimeMillis() + timeout_sec * 1000;
    try (WatchService watcher = FileSystems.getDefault().newWatchService()) {
        folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
        for (WatchKey key; null != (key = watcher.poll(end_time - System.currentTimeMillis(), TimeUnit.MILLISECONDS)); key.reset()) {
            for (WatchEvent<?> event : key.pollEvents()) {
                File file = folder.resolve(((WatchEvent<Path>)event).context()).toFile();
                if (file.toString().toLowerCase().endsWith(extension.toLowerCase()))
                    return file;
            }
        }
    }
    return null;
}