在 AWS EC2 服务中使用 Python Selenium 和 Firefox 驱动程序下载 PDF 文件

问题描述 投票:0回答:1

我正在开发一个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
目录已成功生成,但始终为空。

python amazon-web-services selenium-webdriver amazon-ec2 selenium-firefoxdriver
1个回答
0
投票

添加以下附加首选项以使其使用给定的 download.dir:

profile.set_preference("browser.download.useDownloadDir", True)

© www.soinside.com 2019 - 2024. All rights reserved.