#web-driver #selenium #chromedriver #自动化 #geckodriver

thirtyfour_sync

Thirtyfour是一个Rust语言的Selenium/WebDriver库,用于自动化网站UI测试。本包仅提供同步版本。对于异步版本,请查看thirtyfour包。

16个版本 (8个重大更新)

0.27.1 2022年1月7日
0.27.0 2021年11月7日
0.25.0 2021年6月20日
0.23.0 2021年3月27日
0.20.0 2020年11月30日

#288HTTP客户端

Download history 866/week @ 2024-03-13 780/week @ 2024-03-20 246/week @ 2024-03-27 728/week @ 2024-04-03 267/week @ 2024-04-10 1187/week @ 2024-04-17 1231/week @ 2024-04-24 841/week @ 2024-05-01 255/week @ 2024-05-08 1367/week @ 2024-05-15 1666/week @ 2024-05-22 388/week @ 2024-05-29 639/week @ 2024-06-05 1366/week @ 2024-06-12 1050/week @ 2024-06-19 642/week @ 2024-06-26

3,718 每月下载量
4 个 包中使用

MIT/Apache

225KB
2.5K SLoC

Crates.io docs.rs Build Status

Thirtyfour是一个Rust语言的Selenium/WebDriver库,用于自动化网站UI测试。

它支持完整的W3C WebDriver规范。已通过Chrome和Firefox测试,尽管任何W3C兼容的WebDriver都应该可以工作。

此包为thirtyfour提供了同步(即非异步)接口。对于异步版本,请查看thirtyfour包。

状态:寻找维护者

maintenance-status

thirtyfour项目的未来更改将导致其与这个同步版本分叉。因此,本项目将不再积极维护。对此带来的不便表示歉意。如果您需要更多信息或有意接手此项目,请与我们联系。

特性

  • 支持所有W3C WebDriver和WebElement方法
  • 直接通过WebDriver(例如chromedriver)创建新的浏览器会话
  • 通过Selenium Standalone或Grid创建新的浏览器会话
  • 在丢弃时自动关闭浏览器会话
  • 查找元素(通过所有常见的选择器,例如Id、Class、CSS、Tag、XPath)
  • 向元素发送键,包括键组合
  • 执行JavaScript
  • 操作链
  • 获取和设置cookie
  • 切换到frame/window/element/alert
  • 支持Shadow DOM
  • 支持Alert
  • 捕获/保存浏览器或单个元素的PNG截图
  • 支持Chrome DevTools协议

为什么叫'thirtyfour'?

这个名字来源于Selenium化学元素的原子序数(Se)。

示例

示例假设您已经在localhost:4444运行了一个WebDriver。

您可以直接使用chromedriver,从以下链接下载与您的Chrome版本匹配的chromedriver: https://chromedriver.chromium.org/downloads

然后按照以下方式运行它

chromedriver --port=4444

示例

要运行此示例

cargo run --example sync
use thirtyfour_sync::prelude::*;

fn main() -> WebDriverResult<()> {
     let caps = DesiredCapabilities::chrome();
     let driver = WebDriver::new("https://127.0.0.1:4444", &caps)?;

     // Navigate to https://wikipedia.org.
     driver.get("https://wikipedia.org")?;
     let elem_form = driver.find_element(By::Id("search-form"))?;

     // Find element from element.
     let elem_text = elem_form.find_element(By::Id("searchInput"))?;

     // Type in the search terms.
     elem_text.send_keys("selenium")?;

     // Click the search button.
     let elem_button = elem_form.find_element(By::Css("button[type='submit']"))?;
     elem_button.click()?;

     // Look for header to implicitly wait for the page to load.
     driver.find_element(By::ClassName("firstHeading"))?;
     assert_eq!(driver.title()?, "Selenium - Wikipedia");
    
     // Close the browser.
     driver.quit()?;

     Ok(())
}

高级元素查询

ElementQuery

WebDriver::query()WebElement::query() 方法返回一个 ElementQuery 结构体。

使用 ElementQuery,您可以执行以下操作

let elem_text =
    driver.query(By::Css("match.this")).or(By::Id("orThis")).first()?;

这将在每个轮询迭代中执行两次查询,并返回第一个匹配项。您还可以按这种方式过滤一个或两个查询分支

driver.query(By::Css("branch.one")).with_text("testing")
    .or(By::Id("branchTwo")).with_class("search").and_not_enabled()
    .first()?;

all() 方法如果没有找到元素,将返回一个空Vec。在这种情况下返回错误,请使用 all_required() 方法代替。

ElementQuery 还允许使用自定义谓词,这些谓词接受一个 &WebElement 参数,并返回一个 WebDriverResult<bool>

如上所述,query() 方法也适用于 WebElement 结构体,用于在DOM中查询特定元素的关系。

ElementWaiter

WebElement::wait_until() 方法返回一个 ElementWaiter 结构体。

使用 ElementWaiter,您可以执行以下操作

elem.wait_until().displayed()?;
// You can optionally provide a nicer error message like this.
elem.wait_until().error("Timed out waiting for element to disappear").not_displayed()?;

elem.wait_until().enabled()?;
elem.wait_until().clickable()?;

等等。请参阅 ElementWaiter 文档以获取可用谓词的完整列表。

ElementWaiter 还允许使用自定义谓词,这些谓词接受一个 &WebElement 参数,并返回一个 WebDriverResult<bool>

thirtyfour_sync::query::conditions 模块中,也提供了一系列预定义谓词,方便使用。

use thirtyfour_sync::query::conditions;

elem.wait_until().conditions(vec![
    conditions::element_is_displayed(true),
    conditions::element_is_clickable(true)
])?;

这些谓词(或您自己的)也可以作为过滤器提供给 ElementQuery

运行 thirtyfour_sync 的测试,包括文档测试

通常只有当您打算为 thirtyfour_sync 开发做出贡献时才需要运行测试。如果您只想在自己的项目中使用该crate,可以跳过此部分。

就像上面的示例一样,这个crate中的测试需要运行在 https://127.0.0.1:4444 的Selenium实例。

测试还需要一个小型Web应用程序 thirtyfour_testapp,该应用程序专门为测试 thirtyfour crate而构建。

可以使用docker和docker-compose运行它。

有关安装docker的信息,请参阅 https://docs.docker.net.cn/install/(如果您在Linux上,请遵循SERVER部分,然后查找社区版)

有关安装docker-compose的信息,请参阅 https://docs.docker.net.cn/compose/install/

一旦安装了docker-compose,就可以启动所需的容器,如下所示

docker-compose up -d --build

然后,要运行测试

cargo test -- --test-threads=1

我们需要将测试限制在单个线程上,因为selenium服务器一次只支持一个浏览器实例。(如果您想提高这个限制,可以在docker-compose.yml文件中修改。之后请记得重新启动容器)

如果您需要重新启动docker容器

docker-compose restart 

最后,要删除它们

docker-compose down

许可协议

本作品可在MIT或Apache 2.0协议下双许可。如果您使用本作品,可以选择任一许可协议。

有关更多详细信息,请参阅NOTICE文件。

SPDX-许可协议-标识符: MIT 或者Apache-2.0

依赖项

~10-29MB
~423K SLoC