繁体   English   中英

如何使用 selenium c# webdriver 重命名下载的文件

[英]How to rename downloaded file using selenium c# webdriver

在我的 Web 应用程序中,它具有一些从网站下载文件的自动化过程。 为此,我使用了 selenium 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。 我也看到了这个问题。 但这对我没有帮助

监视目录并不总是好的,因为有时保存的文件名与 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");
}

下面的代码段将等到文件下载然后返回 FilePath 我把它写成扩展方法:

public static string GetDonwloadedFileName(this IWebDriver driver)
{
    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
    js.ExecuteScript("window.open()");
    var allWinowHandles = driver.WindowHandles;
    foreach (var winHandle in allWinowHandles)
    {
        //Switch to second window
        if (!winHandle.Equals(driver.CurrentWindowHandle))
        {
            driver.SwitchTo().Window(winHandle);
        }
    }
    // navigate to chrome downloads
    driver.Navigate().GoToUrl("chrome://downloads");
    IJavaScriptExecutor downloadWindowExecutor = (IJavaScriptExecutor)driver;
    // Wait for Download till 100% completion
    double percentageProgress = (double)0;
    while (percentageProgress != 100)
    {
        try
        {
            percentageProgress = (long)downloadWindowExecutor.ExecuteScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('#progress').value");
            Thread.Sleep(100);
        }
        catch (Exception)
        {
            break;
        }
    }

    string fileTitle = (string)downloadWindowExecutor.ExecuteScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('#show').getAttribute('title')");
    downloadWindowExecutor.ExecuteScript("window.close()");
    return fileTitle;
}

然后您可以使用文件路径将其重命名为您需要的任何内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM