我正在开发一个Python项目,其中部分功能涉及使用Selenium和Firefox从网站自动下载PDF文件,然后将这些文件上传到特定的存储桶。此过程涉及 Selenium 在进一步处理之前将 PDF 临时保存到 /tmp 目录。我的开发环境设置在 Docker 容器内,此设置完美运行 — 我可以使用 Selenium 版本 3.141.0、3.8.0 或 4.18.1 下载并在 /tmp 目录中查找 PDF,没有任何问题使用Firefox作为浏览器及其相应的驱动程序。
但是,当我将此应用程序部署到 AWS EC2 实例时,行为发生了变化。应用程序在与网站的交互方面按预期运行,并且 Selenium 或应用程序本身没有抛出任何错误。但是,应该下载并出现在 /tmp 目录中的 PDF 文件却找不到。
我期望将 PDF 文件下载到 EC2 实例上的 /tmp 目录,就像在 Docker 容器中本地那样,然后允许我的脚本将其上传到指定的存储桶。相反,该文件根本不会出现在目录中,即使应用程序报告成功单击了下载按钮,并且没有记录与文件写入或 Selenium 与 Firefox 交互相关的错误。
这是我目前的逻辑:
login_url = 'https://my-web.com/login/'
dashboard_url = f'https://my-web.com/pdf-button-download-view'
unique_dir = os.path.join("/tmp/pdfs", str(uuid.uuid4()))
os.makedirs(unique_dir, exist_ok=True)
os.chmod(unique_dir, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
options = Options()
options.headless = True
log_path = "/tmp/geckodriver.log"
# Firefox Profile for specifying download behavior
profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("browser.download.dir", unique_dir)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
driver = webdriver.Firefox(options=options, firefox_profile=profile, service_log_path=log_path)
driver.get(login_url)
time.sleep(10)
# Login
driver.find_element(By.ID, "username").send_keys("admin")
driver.find_element(By.ID, "password").send_keys("admin")
driver.find_element(By.CSS_SELECTOR, "form").submit()
time.sleep(10)
# Navigate to the Dashboard
driver.get(dashboard_url)
time.sleep(10)
logging.info(f"Dashboard URL loaded: {driver.current_url}")
dropdown_trigger = driver.find_element(By.XPATH, "//button[@aria-label='Menu actions trigger']")
dropdown_trigger.click()
logging.info("Dropdown trigger clicked.")
action = ActionChains(driver)
logging.info("Attempting to find the dropdown item for download.")
dropdown_item = driver.find_element(By.XPATH, "//div[@title='Download']")
action.move_to_element(dropdown_item).perform()
logging.info("The dropdown item was founded.")
logging.info("Attempting to click the 'Export to PDF' button.")
export_to_pdf_button = WebDriverWait(driver, 3).until(
EC.element_to_be_clickable((By.XPATH, "//div[@role='button'][contains(text(), 'Export to PDF')]"))
)
export_to_pdf_button.click()
logging.info("Export to PDF button clicked, waiting for file to download.")
start_time = time.time()
while True:
pdf_files = [f for f in os.listdir(unique_dir) if f.endswith(".pdf")]
if pdf_files:
break
elif time.time() - start_time > 60: # Wait up to 60 seconds for the file
raise Exception("File download timed out.")
time.sleep(1)
driver.quit()
logging.info("Driver quit.")
在 EC2 服务中,PDF 不会在
unique_dir
目录中生成。机器上有 21GB 可用空间。 /tmp/pdfs
目录已成功生成,但始终为空。
添加以下附加首选项以使其使用给定的 download.dir:
profile.set_preference("browser.download.useDownloadDir", True)