簡體   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