Убедитесь, что файл загружен, прежде чем продолжить работу со скриптом

Я должен убедиться, что файл был загружен, прежде чем мой сценарий сможет продолжить работу. Я провел некоторое исследование функции exist (), однако не могу найти пример того, что я на самом деле пытаюсь сделать.

Я пытаюсь загрузить несколько файлов. У меня есть статическое назначение для всех загружаемых файлов. Мне нужно убедиться, что файлы были успешно загружены в файл, прежде чем скрипт сможет продолжить. Может кто-нибудь помочь мне с примером того, как этот сценарий будет выглядеть?

Вот с чем я работаю:

import time
import os
import glob
import os.path
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import MoveTargetOutOfBoundsException
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException

for x in range(1, 100):      
    while True:    
        try:
            fp = webdriver.FirefoxProfile('C:/Users/me/Documents/FirefoxProfile')
            browser = webdriver.Firefox(fp)
            browser.get('https://reportcenter.com')

            time.sleep(8)

            browser.find_element_by_id("ctl00_PlaceHolderMain_login_UserName").clear()
            browser.find_element_by_id("ctl00_PlaceHolderMain_login_UserName").send_keys("usr")
            browser.find_element_by_id("ctl00_PlaceHolderMain_login_password").clear()
            browser.find_element_by_id("ctl00_PlaceHolderMain_login_password").send_keys("pwd")
            browser.find_element_by_id("ctl00_PlaceHolderMain_login_login").click()

#gets user to reporting front end

            ReportMgr= browser.find_element_by_partial_link_text('Report Manager')
            ReportMgr.click()

            time.sleep(5)

            CustomReport= browser.find_element_by_partial_link_text('Custom Report')
            CustomReport.click()

            time.sleep(5)

            ProgramManagement= browser.find_element_by_partial_link_text('Program Management')
            ProgramManagement.click()
            ProgramManagement= browser.find_element_by_partial_link_text('Program Management').send_keys(Keys.ARROW_LEFT)

#pulls reports

            browser.find_element_by_partial_link_text('Program Management').click()
            time.sleep(60)
            browser.find_element_by_partial_link_text('Program Management').send_keys(Keys.ARROW_DOWN * x, Keys.ENTER, Keys.ENTER)
            time.sleep(180)
            browser.find_element_by_css_selector("#ctl00_PlaceHolderMain_ReportViewer1_HtmlOutputReportResults2_CSVButton_ImageAnchor > img").click()
            time.sleep(180)
            ##THIS IS WHERE I NEED TO VERIFY THAT THE REPORT HAS DOWNLOADED BEFORE I CAN CONTINUE
            browser.find_element_by_partial_link_text('Program Management').click()
            time.sleep(60)
            browser.quit()

        except:
               browser.quit()           
               continue
        else:
               break

1 ответ

Решение

Одним из способов будет ожидание появления нового файла в целевой папке.

Пример использования:

# take a snapshot of the folder
waiter = FileWaiter(r"C:\Downloads\*.pdf")

# trigger the download
browser.find_element_by_css_selector("...").click()    

# wait for a new file or timeout after 10 seconds
new_file = waiter.wait_new_file(10)

# display the new file
print new_file

Класс ожидания:

import os, time, glob, numbers, exceptions 

class FileWaiter:

  def __init__(self, path):
    self.path = path
    self.files = set(glob.glob(path))

  def wait_new_file(self, timeout):
    """
    Waits for a new file to be created and returns the new file path.
    """
    endtime = time.time() + timeout
    while True:
      diff_files = set(glob.glob(self.path)) - self.files
      if diff_files :
        new_file = diff_files.pop()
        try:
          os.rename(new_file, new_file)
          self.files = set(glob.glob(self.path))
          return new_file
        except :
          pass
      if time.time() > endtime:
          raise Exception("Timeout while waiting for a new file in %s" % self.path)
      time.sleep(0.1)
Другие вопросы по тегам