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日 |
#288 在 HTTP客户端
3,718 每月下载量
在 4 个 包中使用
225KB
2.5K SLoC
Thirtyfour是一个Rust语言的Selenium/WebDriver库,用于自动化网站UI测试。
它支持完整的W3C WebDriver规范。已通过Chrome和Firefox测试,尽管任何W3C兼容的WebDriver都应该可以工作。
此包为thirtyfour
提供了同步(即非异步)接口。对于异步版本,请查看thirtyfour包。
状态:寻找维护者
对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