【问题标题】:Download file to specific directory using selenium使用 selenium 将文件下载到特定目录
【发布时间】:2019-05-23 12:36:15
【问题描述】:

我正在使用凭据抓取网站,我必须单击导出 pdf 文件的元素(按钮)(而不是另存为窗口)。

按钮直接将pdf文件导出到C:\Users\User\Downloads

如何将目录改为桌面?

还有如何重命名文件?

用于单击此按钮的代码

On Error Resume Next
Do While .FindElementByXPath("//*[@id='theBttnbobjid_1545645103945_dialog_submitBtn']") Is Nothing
    DoEvents
Loop
On Error GoTo 0
.FindElementByXPath("//*[@id='theBttnbobjid_1545645103945_dialog_submitBtn']").Click

这是与该按钮相关的 html

<tbody><tr valign="middle"><td height="21" width="5" style="background-image:url('aspnet_client/system_web/4_0_30319/crystalreportviewers13/js/crviewer/../dhtmllib/images/skin_standard/button.gif');background-position:0px 0px;"></td><td id="theBttnCenterImgbobjid_1545648005071_dialog_submitBtn" align="center" class="wizbutton" style="padding-left:3px;padding-right:3px;background-image:url('aspnet_client/system_web/4_0_30319/crystalreportviewers13/js/crviewer/../dhtmllib/images/skin_standard/button.gif');background-position:0px -42px;"><nobr><a id="theBttnbobjid_1545648005071_dialog_submitBtn" href="javascript:void(0)" class="wizbutton" role="button">Export</a></nobr></td><td height="21" width="5" style="background-image:url('aspnet_client/system_web/4_0_30319/crystalreportviewers13/js/crviewer/../dhtmllib/images/skin_standard/button.gif');background-position:0px -21px;"></td></tr></tbody>

【问题讨论】:

  • 常见问题....是否有与下载相关的网址?
  • 非常感谢您的回复。我附上了html部分。我也觉得是java脚本
  • 你能分享一下@YasserKhalil 的网址吗?我认为有一种方法可以在不知道路径的确切地址的情况下将这些文件下载并保存在桌面上。

标签: excel vba selenium-webdriver web-scraping


【解决方案1】:

您以SetPreference 开头指定默认下载。然后,您可以通过在该文件夹中查找最新修改的文​​件来重命名该文件(在这种情况下,我使用带有 .csv 掩码的文件系统对象)

如果您有实际的下载 URL,请使用 URLMon or binary download

Option Explicit
Public Sub SpecifyDownloadFolder()
    Dim d As WebDriver, filename As String, myFolder As Object
    Const URL = "https://www.stats.govt.nz/large-datasets/csv-files-for-download/"
    Const DOWNLOAD_DIRECTORY As String = "C:\Users\User\Downloads"
    Const FILE_NAME As String = "myNewCsv.csv"
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")   
    Set d = New ChromeDriver
    With d
        .SetPreference "download.default_directory", DOWNLOAD_DIRECTORY
        .SetPreference "download.directory_upgrade", True 'safeguard
        .SetPreference "download.prompt_for_download", False 'safeguard
        .get URL
        .FindElementByCss("h3 [download]").Click
        Application.Wait Now + TimeSerial(0, 0, 5)
        d.Quit
    End With

    Set myFolder = fso.GetFolder(DOWNLOAD_DIRECTORY)

    Dim objFile As Object, dteFile As Date

    dteFile = DateSerial(1900, 1, 1)
    For Each objFile In myFolder.Files
        If objFile.DateLastModified > dteFile And fso.GetExtensionName(objFile.Path) = "csv" Then
            dteFile = objFile.DateLastModified
            filename = objFile.NAME
        End If
    Next objFile
    If filename <> vbNullString And Not fso.FileExists(DOWNLOAD_DIRECTORY & "\" & FILE_NAME) Then
       fso.MoveFile DOWNLOAD_DIRECTORY & "\" & filename, DOWNLOAD_DIRECTORY & "\" & FILE_NAME
    End If
End Sub

【讨论】:

  • 更强大的是查看是否可以从 html 中获取文件名并在最后执行 MoveFile 时使用该文件名。下载的文件名是否存在于 html 中?
  • 至于Application.Wait Now + TimeSerial(0, 0, 5)这一行,我认为是等到文件下载完成..有没有另一种方法来检查下载过程的完整性然后恢复代码?
  • 您可以循环下载文件夹以查找文件数的变化
  • 非常感谢。我已经研究过这个想法。非常感谢
  • 是的,我刚刚看到您发布的问题。像往常一样,请记住包含定时循环(可能是将该循环转换为返回布尔值的函数的时间,或者只是一个单独的计时器子)以防止可能的无限循环。考虑文件锁定的任何错误处理,因为在下载到文件夹的同时监视它可能会产生一些意想不到的后果。部分原因是我不得不使用命令行放弃我原来的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2011-10-15
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多