如何使用Selenium C#WebDriver重命名下载的文件

时间:2018-11-26 05:25:04

标签: c# asp.net-mvc selenium selenium-chromedriver

在我的Web应用程序中,该应用程序具有一些自动化过程,可以从网站下载文件。为此,我使用了硒c#chrome驱动程序。

示例代码段

public void Download(string name,string pass)
{
    try
    {
        ChromeOptions options = new ChromeOptions();
        options.AddArguments("--proxy-server=http://192.168.5.62:8095");
        options.AddUserProfilePreference("safebrowsing.enabled", true);
        options.AddUserProfilePreference("disable-popup-blocking", "true");
        options.AddUserProfilePreference("download.default_directory",@"C:\Temp");

        using (var driver = new ChromeDriver(HostingEnvironment.ApplicationPhysicalPath, options)){

            //driver.findElement(By.xpath("//a/u[contains(text(),'Re-Submit')]")).click();
            driver.FindElementById("save").Click();                               
        }              
    }
    catch (Exception ex)
    {       
        Logger.LogWriter("LAS", ex, "CusDataLogic", "Download");
    }
}

上面的代码(不是完整的代码)可以正常工作并正确保存文件。但是我需要在下载后或下载后重命名该文件。有什么办法可以重命名该文件?

已编辑:请勿将此标记为重复。我要的是C#,而不是python。我也看到了这个问题。但这对我没有帮助

1 个答案:

答案 0 :(得分:1)

监视目录并不总是很好,因为有时保存的文件名与URL中的文件名不同。

转到chrome下载页面并循环直到所有下载完成,您可以在下面看到如何使用CSS选择器选择特殊元素#shadow-root

using (var driver = new ChromeDriver(HostingEnvironment.ApplicationPhysicalPath, options)))
{
    //driver.findElement(By.xpath("//a/u[contains(text(),'Re-Submit')]")).click();
    driver.FindElementById("save").Click();

    // wait 5 second until download started
    Thread.Sleep(5000);

    // Go to chrome download page
    driver.Navigate().GoToUrl("chrome://downloads/");
    string oldName = "";
    bool downloadcomplete = false;
    string cssNames = "downloads-manager /deep/ downloads-item /deep/ [id='name']";
    string cssDlProgress = "downloads-manager /deep/ downloads-item /deep/ [class*='show-progress']";

    while (!downloadcomplete)
    {
        var progressElements = driver.FindElements(By.CssSelector(cssDlProgress));
        // check until no download progress bar
        if (progressElements.Count() == 0)
        {
            oldName = driver.FindElement(By.CssSelector(cssNames)).Text;
            downloadcomplete = true;
        }
        else
        {
            // download still in progress, wait.
            Thread.Sleep(1000);
        }
    }
    // download complete
    // remove downloaded file
    driver.FindElement(By.CssSelector("downloads-manager /deep/ downloads-item /deep/ [id='remove']")).Click();
    // rename
    File.Move(@"C:\Temp\" + oldName, @"C:\Temp\newname.ext");
}