Rust实现Web自动化测试的框架
以下是10个使用Rust实现Web自动化测试的框架示例,涵盖不同场景和工具链:
使用thirtyfour
(基于Selenium)
use thirtyfour::prelude::*;
async fn example_selenium() -> WebDriverResult<()> {
let caps = DesiredCapabilities::chrome();
let driver = WebDriver::new("http://localhost:9515", caps).await?;
driver.goto("https://www.baidu.com").await?;
let elem = driver.find(By::Id("learn")).await?;
elem.click().await?;
driver.quit().await?;
Ok(())
}
使用fantoccini
(WebDriver客户端)
use fantoccini::{Client, Locator};
async fn example_fantoccini() -> Result<(), fantoccini::error::CmdError> {
let client = Client::new("http://localhost:9515").await?;
client.goto("https://wwww.baidu.com").await?;
let repo = client.find(Locator::Css(".repo")).await?;
assert!(repo.text().await?.contains("Rust"));
client.close().await
}
使用headless_chrome
(无浏览器模式)
use headless_chrome::{Browser, protocol::page::CaptureScreenshotFormat};
fn example_headless() -> Result<(), failure::Error> {
let browser = Browser::default()?;
let tab = browser.wait_for_initial_tab()?;
tab.navigate_to("https://www.bing.com")?;
tab.wait_until_navigated()?;
let screenshot = tab.capture_screenshot(
CaptureScreenshotFormat::Png,
None,
None,
true
)?;
std::fs::write("screenshot.png", screenshot)?;
Ok(())
}
表单提交测试
use thirtyfour::prelude::*;
async fn test_form_submit() -> WebDriverResult<()> {
let driver = WebDriver::new("http://localhost:9515", DesiredCapabilities::chrome()).await?;
driver.goto("https://httpbin.org/forms/post").await?;
driver.find(By::Name("custname")).await?.send_keys("John Doe").await?;
driver.find(By::Css("input[value='small']")).await?.click().await?;
driver.find(By::Tag("textarea")).await?.send_keys("Special notes").await?;
driver.find(By::Css("button[type='submit']")).await?.click().await?;
driver.quit().await
}
API测试与UI结合
use reqwest::StatusCode;
use thirtyfour::prelude::*;
async fn combined_test() -> WebDriverResult<()> {
// API测试
let api_resp = reqwest::get("https://api.github.com/users/rust-lang")
.await?
.json::<serde_json::Value>()
.await?;
assert_eq!(api_resp["login"].as_str(), Some("rust-lang"));
// UI测试
let driver = WebDriver::new("http://localhost:9515", DesiredCapabilities::chrome()).await?;
driver.goto("https://github.com/rust-lang").await?;
let title = driver.title().await?;
assert!(title.contains("Rust"));
driver.quit().await
}
页面性能测试
use headless_chrome::{Browser, protocol::page::Metrics};
fn test_performance() -> Result<(), failure::Error> {
let browser = Browser::default()?;
let tab = browser.wait_for_initial_tab()?;
tab.navigate_to("https://www.bing.com")?;
let metrics = tab.get_metrics()?;
assert!(metrics.layout_duration.unwrap() < 1.0);
Ok(())
}
多浏览器并行测试
use thirtyfour::prelude::*;
use tokio::task;
async fn parallel_test() -> WebDrive