【问题标题】:Check that a file fully downloads using VBA, Selenium and Chrome使用 VBA、Selenium 和 Chrome 检查文件是否完全下载
【发布时间】:2021-05-23 16:45:34
【问题描述】:

我正在创建一个程序来循环使用 Selenium 与 VBA 和 Chrome 浏览器从互联网站点下载文件。该程序运行良好,但 15% 的文件最终丢失,即使发出调用也没有下载。我尝试了很多不同的方法,但最终还是丢失了文件。我在本地计算机上运行程序并下载到本地硬盘。如何检查文件是否已完全下载? 其他人也问过同样的问题,但似乎没有很好的解决方案。其他使用 Chrome 浏览器的人可以通过发送 ctrl-t 命令并打开 chrome 下载网页 (chrome://downloads/) 打开另一个选项卡。打开一个新的浏览器选项卡似乎无法始终如一地工作。例如:https://github.com/danwagnerco/selenium-vba/issues/50。 有没有办法通过文件系统对象或其他方式检测完全下载的文件?很容易看出文件已开始创建。但是我还没有找到一种方法来判断文件何时停止被另一个进程(即下载进程)使用。有没有办法通过文件系统做到这一点?

【问题讨论】:

  • 是“VBA 的当前 Selenium 实现”SeleniumBasic
  • @sjy 是的,我前几天刚从网站上下载的

标签: vba selenium web-scraping selenium-chromedriver filesystemobject


【解决方案1】:

您可以清除浏览器的缓存并重试吗?在清理缓存之前,我注意到一些奇怪的事情,之后,事情似乎运行顺利。虽然,我的经验几乎都是使用 Selenium + Python,而不是 Selenium + Excel/VBA。无论如何,尝试一下,看看它是否有帮助。如果没有,你能在这里分享你的代码吗?我们所能做的就是推测,如果你从来不分享代码。

【讨论】:

  • 我有好几页代码,还有很多是我从无效的试验中重写的。我确实认为这部分是 VBA 特定的问题。我不确定我可以分享哪些有用的代码。这不是浏览器缓存问题,因为浏览器在每次运行时都会启动一个全新的浏览器。
【解决方案2】:

挑战在于 VBA 中的 Selenium 实现不包括其他编码语言可用的所有功能。但是我确实找到了解决这个问题的方法。我从这个问题的第二个答案中得到了突破性线索:How to open a new window on a browser using Selenium WebDriver for python?。 这是基于上述答案的示例程序:

Sub Test()
    Dim Driver As New WebDriver
    
    Driver.Start "chrome"
    Driver.Get ("https://linkedin.com")
    Debug.Print Driver.Window.Title     ' LinkedIn
    
    ' open new tab
    Driver.ExecuteScript ("window.open('https://twitter.com')")
    Debug.Print Driver.Window.Title     ' LinkedIn
    Driver.SwitchToNextWindow
    Debug.Print Driver.Window.Title     ' Twitter

    ' Update new tab
    Debug.Print "Twitter window should go to facebook "
    Debug.Print Driver.Window.Title     ' Twitter
    Driver.Get ("http://facebook.com")
    Debug.Print Driver.Window.Title     ' FaceBook

    ' Update old tab
    Driver.SwitchToPreviousWindow
    Debug.Print "Linkedin should go to gmail "
    Debug.Print Driver.Window.Title     ' LinkedIn
    Driver.Get ("http://gmail.com")
    Debug.Print Driver.Window.Title     ' Gmail

    ' Update new tab
    Driver.SwitchToPreviousWindow
    Debug.Print "Facebook window should go to Google "
    Debug.Print Driver.Window.Title     ' FaceBook
    Driver.Get ("http://google.com")
    Debug.Print Driver.Window.Title     ' Google
    
    Driver.Quit
End Sub

VBA 中的 Selenium 也有一个 SwitchToWindowByTitle 选项。在测试中,该选项对我不起作用。它似乎混淆了浏览器应该使用哪个窗口。我还发现第一次打开新窗口时,我需要使用 SwitchToNextWindow 才能访问它。但是每个后续切换都需要到前一个窗口。我怀疑 VBA 将无法管理三个选项卡/窗口之间的切换。但是对于我的目的来说,两个就足够了。我还发现驱动程序标题有时没有及时更新 debug.print 行(主要用于 Twitter),但我可以看到切换工作正常。这可能是由于许多网站使用流畅的异步加载模式。他们填充页面的最小数量并将其发布给用户,然后继续完成加载页面。窗口标题似乎是此处某些测试页面上填充的后来元素之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2021-04-26
    • 1970-01-01
    • 2019-09-15
    • 2020-06-26
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多