Rust Web自动化测试库thirtyfour_sync的使用:同步Selenium WebDriver客户端实现高效浏览器控制

Rust Web自动化测试库thirtyfour_sync的使用:同步Selenium WebDriver客户端实现高效浏览器控制

概述

thirtyfour_sync是Rust的Selenium/WebDriver库,用于自动化网站UI测试。它支持完整的W3C WebDriver规范,已测试支持Chrome和Firefox浏览器,但任何兼容W3C的WebDriver都应该可以工作。

Crates.io docs.rs Build Status

特性

  • 支持所有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(())
}

最佳实践

  1. 总是检查WebDriverResult并处理错误
  2. 使用明确的等待而不是固定sleep
  3. 为测试元素使用稳定的定位器
  4. 合理管理WebDriver会话生命周期
  5. 考虑使用Page Object模式组织测试代码

注意事项

  • 需要先运行对应的WebDriver服务(如ChromeDriver)
  • 同步API会阻塞当前线程
  • 对于复杂应用,考虑使用异步版本的thirtyfour

thirtyfour_sync为Rust开发者提供了强大的同步Web自动化测试能力,特别适合需要简单直接控制浏览器的测试场景。

回到顶部