mod common;
use playwright_cdp::Playwright;
fn unique_dir(label: &str) -> std::path::PathBuf {
std::env::temp_dir().join(format!(
"pw-cdp-persistent-{}-{}",
label,
std::process::id()
))
}
async fn try_persistent(label: &str) -> Option<(playwright_cdp::BrowserContext, std::path::PathBuf)> {
let dir = unique_dir(label);
let _ = std::fs::remove_dir_all(&dir);
let ctx = Playwright::launch()
.await
.ok()?
.chromium()
.launch_persistent_context(&dir)
.await
.ok()?;
Some((ctx, dir))
}
#[tokio::test]
async fn launch_persistent_context_basic() {
let (ctx, dir) = match try_persistent("basic").await {
Some(v) => v,
None => {
eprintln!("[skip] no browser available");
return;
}
};
let page = ctx.new_page().await.expect("new_page");
page.set_content("<h1 id='h'>persistent</h1>")
.await
.unwrap();
assert_eq!(
page.locator("#h").text_content().await.unwrap(),
Some("persistent".to_string())
);
ctx.close().await.unwrap();
assert!(dir.exists(), "user-data-dir must persist after close");
assert!(
dir.join("Default").exists(),
"Chromium profile dir 'Default' should exist under user-data-dir"
);
let _ = std::fs::remove_dir_all(&dir);
}
#[tokio::test]
async fn launch_persistent_context_persists_storage() {
let base = common::http_server(
"<html><body><script>window.onload=()=>{document.body.innerText=localStorage.getItem('k')||''}</script></body></html>",
)
.await;
let dir = unique_dir("persist");
let _ = std::fs::remove_dir_all(&dir);
{
let ctx = Playwright::launch()
.await
.unwrap()
.chromium()
.launch_persistent_context(&dir)
.await
.expect("launch #1");
let page = ctx.new_page().await.unwrap();
page.goto(&base, None).await.unwrap();
let _: serde_json::Value =
page.evaluate("localStorage.setItem('k','persisted-value')")
.await
.unwrap();
ctx.close().await.unwrap();
}
{
let ctx = match Playwright::launch()
.await
.unwrap()
.chromium()
.launch_persistent_context(&dir)
.await
{
Ok(c) => c,
Err(e) => {
eprintln!("[skip] no browser for session 2: {e}");
let _ = std::fs::remove_dir_all(&dir);
return;
}
};
let page = ctx.new_page().await.unwrap();
page.goto(&base, None).await.unwrap();
let val: String = page
.evaluate("localStorage.getItem('k') || ''")
.await
.unwrap();
assert_eq!(
val, "persisted-value",
"localStorage must persist across sessions via the user-data-dir"
);
ctx.close().await.unwrap();
}
let _ = std::fs::remove_dir_all(&dir);
}