Rust Web自动化测试库thirtyfour_sync的使用:同步Selenium WebDriver客户端实现高效浏览器控制
Rust Web自动化测试库thirtyfour_sync的使用:同步Selenium WebDriver客户端实现高效浏览器控制
概述
thirtyfour_sync是Rust的Selenium/WebDriver库,用于自动化网站UI测试。它支持完整的W3C WebDriver规范,已测试支持Chrome和Firefox浏览器,但任何兼容W3C的WebDriver都应该可以工作。
特性
- 支持所有W3C WebDriver和WebElement方法
- 直接通过WebDriver(如chromedriver)创建新浏览器会话
- 通过Selenium Standalone或Grid创建新浏览器会话
- 在drop时自动关闭浏览器会话
- 查找元素(通过所有常见选择器如Id、Class、CSS、Tag、XPath)
- 向元素发送按键,包括组合键
- 执行Javascript
- 动作链
- 获取和设置cookies
- 切换到frame/窗口/元素/alert
- 支持Shadow DOM
- 支持Alert
- 捕获/保存浏览器或单个元素的截图为PNG
- 支持Chrome DevTools协议
示例
基础示例
use thirtyfour_sync::prelude::*;
fn main() -> WebDriverResult<()> {
let caps = DesiredCapabilities::chrome();
let driver = WebDriver::new("http://localhost:4444", &caps)?;
// 导航到 https://wikipedia.org
driver.get("https://wikipedia.org")?;
let elem_form = driver.find_element(By::Id("search-form"))?;
// 从元素中查找元素
let elem_text = elem_form.find_element(By::Id("searchInput"))?;
// 输入搜索词
elem_text.send_keys("selenium")?;
// 点击搜索按钮
let elem_button = elem_form.find_element(By::Css("button[type='submit']"))?;
elem_button.click()?;
// 查找标题以隐式等待页面加载
driver.find_element(By::ClassName("firstHeading"))?;
assert_eq!(driver.title()?, "Selenium - Wikipedia");
// 关闭浏览器
driver.quit()?;
Ok(())
}
完整示例
use thirtyfour_sync::prelude::*;
use thirtyfour_sync::query::conditions;
fn main() -> WebDriverResult<()> {
// 设置Chrome能力
let caps = DesiredCapabilities::chrome();
// 创建WebDriver实例
let driver = WebDriver::new("http://localhost:4444", &caps)?;
// 导航到测试页面
driver.get("https://example.com")?;
// 使用ElementQuery进行高级元素查询
let elem = driver.query(By::Css("match.this"))
.or(By::Id("orThis"))
.first()?;
// 使用ElementWaiter等待元素
elem.wait_until().displayed()?;
elem.wait_until().error("元素未启用").enabled()?;
// 使用自定义条件
elem.wait_until().conditions(vec![
conditions::element_is_displayed(true),
conditions::element_is_clickable(true)
])?;
// 执行JavaScript
driver.execute_script("alert('Hello from thirtyfour_sync!');", vec![])?;
// 处理Alert
let alert = driver.switch_to().alert()?;
alert.accept()?;
// 截屏并保存
driver.screenshot("screenshot.png")?;
// 关闭浏览器
driver.quit()?;
Ok(())
}
高级用法
ElementQuery
let elem_text = driver.query(By::Css("match.this")).or(By::Id("orThis")).first()?;
ElementWaiter
elem.wait_until().displayed()?;
elem.wait_until().error("等待元素消失超时").not_displayed()?;
elem.wait_until().enabled()?;
elem.wait_until().clickable()?;
测试
要运行thirtyfour_sync的测试,包括doctests:
cargo test -- --test-threads=1
许可证
这个作品采用MIT或Apache 2.0双重许可。您可以选择任一许可证来使用这个作品。
SPDX-License-Identifier: MIT OR Apache-2.0
1 回复
Rust Web自动化测试库thirtyfour_sync使用指南
概述
thirtyfour_sync是Rust的一个同步Selenium WebDriver客户端库,用于Web自动化测试和浏览器控制。它是thirtyfour库的同步版本,提供了与WebDriver协议交互的同步API,适合需要阻塞式操作的项目。
主要特性
- 同步API设计
- 支持主流浏览器(Chrome, Firefox, Edge等)
- 完整的WebDriver协议实现
- 元素定位和交互功能
- 支持页面导航和Cookie操作
安装方法
在Cargo.toml中添加依赖:
[dependencies]
thirtyfour_sync = "0.30"
完整示例代码
下面是一个综合使用thirtyfour_sync的完整示例,展示了从启动浏览器到执行各种操作的完整流程:
use thirtyfour_sync::prelude::*;
use thirtyfour_sync::components::SelectElement;
use std::time::Duration;
fn main() -> WebDriverResult<()> {
// 1. 启动WebDriver会话
let caps = DesiredCapabilities::chrome();
let driver = WebDriver::new("http://localhost:9515", &caps)?;
// 2. 导航到测试页面
driver.get("https://example.com")?;
// 3. 设置隐式等待
driver.set_implicit_wait_timeout(Duration::from_secs(10))?;
// 4. 元素定位和交互
let header = driver.find_element(By::Tag("h1"))?;
println!("Page header: {}", header.text()?);
// 5. 表单操作示例
let input = driver.find_element(By::Name("username"))?;
input.send_keys("testuser")?;
// 6. 处理下拉选择框
let select_elem = driver.find_element(By::Id("country"))?;
let select = SelectElement::new(&select_elem)?;
select.select_by_value("US")?;
// 7. 执行JavaScript
let title: String = driver.execute_script(
"return document.title;",
vec![]
)?;
println!("Page title: {}", title);
// 8. 截图功能
let screenshot = driver.screenshot_as_png()?;
std::fs::write("example_screenshot.png", screenshot)?;
// 9. Cookie操作
let cookie = Cookie::new("test_cookie", "12345");
driver.add_cookie(cookie)?;
// 10. 关闭浏览器
driver.quit()?;
Ok(())
}
最佳实践
- 总是检查WebDriverResult并处理错误
- 使用明确的等待而不是固定sleep
- 为测试元素使用稳定的定位器
- 合理管理WebDriver会话生命周期
- 考虑使用Page Object模式组织测试代码
注意事项
- 需要先运行对应的WebDriver服务(如ChromeDriver)
- 同步API会阻塞当前线程
- 对于复杂应用,考虑使用异步版本的thirtyfour
thirtyfour_sync为Rust开发者提供了强大的同步Web自动化测试能力,特别适合需要简单直接控制浏览器的测试场景。