当前位置: 首页 > 知识库问答 >
问题:

Selenium在下载时提供文件名

姜俊友
2023-03-14

我正在使用一个selenium脚本,试图下载一个Excel文件并给它一个特定的名称。这是我的代码:

我可以给正在下载的文件一个特定的名称吗?

代码:

#!/usr/bin/python
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

profile = FirefoxProfile()
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream")
profile.set_preference("browser.download.dir", "C:\\Downloads" )
browser = webdriver.Firefox(firefox_profile=profile)

browser.get('https://test.com/')
browser.find_element_by_partial_link_text("Excel").click() # Download file

共有3个答案

乜安志
2023-03-14

希望这个片段不是那么令人困惑。我花了一段时间来创建它,它真的很有用,因为这个问题还没有一个明确的答案,只有这个库。

import os
import time
def tiny_file_rename(newname, folder_of_download):
    filename = max([f for f in os.listdir(folder_of_download)], key=lambda xa :   os.path.getctime(os.path.join(folder_of_download,xa)))
    if '.part' in filename:
        time.sleep(1)
        os.rename(os.path.join(folder_of_download, filename), os.path.join(folder_of_download, newname))
    else:
        os.rename(os.path.join(folder_of_download, filename),os.path.join(folder_of_download,newname))

希望这能拯救某人的一天,干杯。

编辑:感谢@Om Prakash编辑我的代码,它让我记住我没有解释代码。

使用< code>max([])函数可能会导致争用情况,留给您空的或损坏的文件(我从经验中知道这一点)。您首先要检查文件是否已完全下载。这是因为selenium不等待文件下载完成,所以当您检查最后创建的文件时,一个不完整的文件将出现在您生成的列表中,它将尝试移动该文件。即便如此,你最好还是等一会儿,等文件从Firefox中释放出来。

编辑2:更多代码

我被问到1秒是否足够,而且大部分时间都足够,但如果您需要等待更长时间,您可以将上面的代码更改为:

import os
import time
def tiny_file_rename(newname, folder_of_download, time_to_wait=60):
    time_counter = 0
    filename = max([f for f in os.listdir(folder_of_download)], key=lambda xa :   os.path.getctime(os.path.join(folder_of_download,xa)))
    while '.part' in filename:
        time.sleep(1)
        time_counter += 1
        if time_counter > time_to_wait:
            raise Exception('Waited too long for file to download')
    filename = max([f for f in os.listdir(folder_of_download)], key=lambda xa :   os.path.getctime(os.path.join(folder_of_download,xa)))
    os.rename(os.path.join(folder_of_download, filename), os.path.join(folder_of_download, newname))
逑禄
2023-03-14

您不能通过selenium指定下载文件的名称。但是,您可以下载该文件,在下载的文件夹中找到最新的文件,并根据需要进行重命名。

注意:从谷歌搜索中借用的方法可能有错误。但你明白了。

import os
import shutil
filename = max([Initial_path + "\\" + f for f in os.listdir(Initial_path)],key=os.path.getctime)
shutil.move(filename,os.path.join(Initial_path,r"newfilename.ext"))
袁枫涟
2023-03-14

这里有另一个简单的解决方案,你可以等到下载完成,然后从chrome downloads获取下载的文件名。

Chrome:

# method to get the downloaded file name
def getDownLoadedFileName(waitTime):
    driver.execute_script("window.open()")
    # switch to new tab
    driver.switch_to.window(driver.window_handles[-1])
    # navigate to chrome downloads
    driver.get('chrome://downloads')
    # define the endTime
    endTime = time.time()+waitTime
    while True:
        try:
            # get downloaded percentage
            downloadPercentage = driver.execute_script(
                "return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('#progress').value")
            # check if downloadPercentage is 100 (otherwise the script will keep waiting)
            if downloadPercentage == 100:
                # return the file name once the download is completed
                return driver.execute_script("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('div#content  #file-link').text")
        except:
            pass
        time.sleep(1)
        if time.time() > endTime:
            break

火狐:

def getDownLoadedFileName(waitTime):
    driver.execute_script("window.open()")
    WebDriverWait(driver,10).until(EC.new_window_is_opened)
    driver.switch_to.window(driver.window_handles[-1])
    driver.get("about:downloads")

    endTime = time.time()+waitTime
    while True:
        try:
            fileName = driver.execute_script("return document.querySelector('#contentAreaDownloadsView .downloadMainArea .downloadContainer description:nth-of-type(1)').value")
            if fileName:
                return fileName
        except:
            pass
        time.sleep(1)
        if time.time() > endTime:
            break

单击下载链接/按钮后,只需调用上述方法。

 # click on download link
 browser.find_element_by_partial_link_text("Excel").click()
 # get the downloaded file name
 latestDownloadedFileName = getDownLoadedFileName(180) #waiting 3 minutes to complete the download
 print(latestDownloadedFileName)
 

JAVA浏览器:

下面是java中的方法。

public String waitUntilDonwloadCompleted(WebDriver driver) throws InterruptedException {
      // Store the current window handle
      String mainWindow = driver.getWindowHandle();
      
      // open a new tab
      JavascriptExecutor js = (JavascriptExecutor)driver;
      js.executeScript("window.open()");
     // switch to new tab
    // Switch to new window opened
      for(String winHandle : driver.getWindowHandles()){
          driver.switchTo().window(winHandle);
      }
     // navigate to chrome downloads
      driver.get("chrome://downloads");
      
      JavascriptExecutor js1 = (JavascriptExecutor)driver;
      // wait until the file is downloaded
      Long percentage = (long) 0;
      while ( percentage!= 100) {
          try {
              percentage = (Long) js1.executeScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('#progress').value");
              //System.out.println(percentage);
          }catch (Exception e) {
            // Nothing to do just wait
        }
          Thread.sleep(1000);
      }
     // get the latest downloaded file name
      String fileName = (String) js1.executeScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('div#content #file-link').text");
     // get the latest downloaded file url
      String sourceURL = (String) js1.executeScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('div#content #file-link').href");
      // file downloaded location
      String donwloadedAt = (String) js1.executeScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('div.is-active.focus-row-active #file-icon-wrapper img').src");
      System.out.println("Download deatils");
      System.out.println("File Name :-" + fileName);
      System.out.println("Donwloaded path :- " + donwloadedAt);
      System.out.println("Downloaded from url :- " + sourceURL);
     // print the details
      System.out.println(fileName);
      System.out.println(sourceURL);
     // close the downloads tab2
      driver.close();
     // switch back to main window
      driver.switchTo().window(mainWindow);
      return fileName;
  }

这是如何在 java 脚本中调用它的方法。

// download triggering step 
downloadExe.click();
// now waituntil download finish and then get file name
System.out.println(waitUntilDonwloadCompleted(driver));

输出:

下载详情

文件名:-RubyMine-2019.1.2(7).exe

下载路径 :- chrome://fileicon/C:\用户\支持\下载\RubyMine-2019.1.2 (7).exe?规模=1.25x

从url下载:-https://download-cf.jetbrains.com/ruby/RubyMine-2019.1.2.exe

RubyMine-2019.1.2 (7)。可执行程序的扩展名

 类似资料:
  • 问题内容: 我正在使用selenium脚本,在其中尝试下载Excel文件并为其指定特定名称。这是我的代码: 无论如何,我可以给下载的文件指定一个特定的名称吗? 码: 问题答案: 您不能通过硒指定下载文件的名称。但是,您可以下载文件,在下载的文件夹中找到最新文件,然后根据需要重命名。 注意:从Google搜索中借用的方法可能有错误。但是你明白了。

  • 问题内容: 我希望站点上的用户能够下载路径被遮盖的文件,以便不能直接下载它们。 例如,我希望URL如下所示: http://example.com/download/?f=somefile.txt 在服务器上,我知道所有可下载文件都位于文件夹中。 有没有一种方法可以使Django提供该文件供下载,而不是尝试查找URL和查看以显示它? 问题答案: 对于“两全其美”,你可以将S.Lott的解决方案与x

  • 问题内容: 我希望站点上的用户能够下载路径被遮盖的文件,以便不能直接下载它们。 例如,我希望URL如下所示: http://example.com/download/?f=somefile.txt 在服务器上,我知道所有可下载文件都位于文件夹中。 有没有一种方法可以使Django提供该文件供下载,而不是尝试查找URL和查看以显示它? 问题答案: 你可以将的解决方案与模块结合使用:生成文件(或文件本

  • 问题内容: 我看到您可以设置通过Webdriver将文件下载到的位置,如下所示: 但是,我想知道下载文件时是否有类似的方式为文件命名?最好不要与配置文件相关联,因为我将通过一个浏览器实例下载约6000个文件,并且不想为每次下载都重新启动驱动程序。 编辑:选择的答案所建议的代码解决方案。下载完每个文件后,重命名该文件。 问题答案: 我不知道是否有一个纯Selenium处理程序,但是当我需要对下载的文

  • 问题内容: 我在隐藏的文本区域中有一些文本。单击按钮后,我希望提供文本作为文件下载。是否可以使用AngularJS或Javascript? 问题答案: 您可以使用进行类似的操作。 在您的控制器中: 为了启用URL: 请注意 每次调用createObjectURL()时,都会创建一个新的对象URL,即使您已经为同一对象创建了一个URL。当不再需要它们时,必须通过调用URL.revokeObjectU

  • 我想实现一个Liferay Portlet,它从一个单独的服务器下载一个~1GB的文件,并将其提供给点击链接的网站访问者。 文件必须以内存高效的方式传输(因此无需将所有内容加载到内存中),用户应在单击后不久看到下载进度(因此无需将所有内容存储到本地磁盘)。 我必须使用WebClient,因为它似乎是Liferay 7中进行Web请求的标准(将不建议使用RestTem板)。 我开始写这样的东西,灵感