使用Rust Playwright crate实现文件下载:代码补全求助
Rust Playwright 实现文件下载的完整方案
你的代码已经完成了初始化浏览器、打开页面、触发下载并捕获下载事件的核心步骤,只需要补充下载文件的保存逻辑,并优化部分冗余代码即可完成功能。以下是修改后的完整可运行代码及关键说明:
完整代码
use playwright::{Playwright, api::Download}; use tokio; use std::path::Path; #[tokio::main] async fn main() -> Result<(), playwright::Error> { // 初始化Playwright并安装浏览器 let playwright = Playwright::initialize().await?; playwright.prepare()?; // 启动浏览器并创建上下文、页面 let chromium = playwright.chromium(); let browser = chromium.launcher().headless(false).launch().await?; let context = browser.context_builder().build().await?; let page = context.new_page().await?; // 打开目标页面 page.goto_builder("https://demoqa.com/upload-download").goto().await?; // 触发下载并捕获下载事件 page.click_builder("a:has-text(\"Download\")").click().await?; let my_download = page.expect_event(playwright::api::page::EventType::Download).await?; // ---------- 补充的核心保存逻辑 ---------- // 获取网站推荐的文件名 let suggested_filename = my_download.suggested_filename().await?; println!("准备下载文件: {}", suggested_filename); // 方式1:保存到指定路径(比如当前目录下的downloads文件夹) let save_path = Path::new("./downloads").join(suggested_filename); // 确保目标目录存在 std::fs::create_dir_all("./downloads").unwrap_or_default(); my_download.save_as(&save_path).await?; // 方式2:直接获取浏览器默认下载路径的文件(可选,无需手动保存) // let default_path = my_download.path().await?; // println!("文件已下载到默认路径: {}", default_path.display()); // ---------- 保存逻辑结束 ---------- // 关闭浏览器 browser.close().await?; Ok(()) }
关键补充说明
- 保存文件的核心方法:
suggested_filename():获取网站提供的推荐文件名,避免手动命名的麻烦。save_as(path):将下载的文件保存到指定路径,需确保目标目录存在(可通过std::fs::create_dir_all创建目录)。path():若不需要手动指定路径,可通过此方法获取浏览器默认下载目录的文件路径。
- 移除冗余的超时等待:
page.wait_for_timeout完全不需要,save_as和path方法会自动等待下载完成后再执行。 - 规范错误处理:将代码中的
expect("")替换为?,让错误正常向上传递,符合Rust错误处理的最佳实践。
内容的提问来源于stack exchange,提问作者Paulo Luvisoto
相关产品推荐
相关产品推荐

