15个版本 (5个破坏性更新)

0.7.0 2021年5月7日
0.6.1 2021年3月27日
0.6.0 2021年1月12日
0.5.3 2020年12月29日
0.4.2 2020年11月30日

#11 in #geckodriver

每月下载量31次

MIT/Apache

75KB
1.5K SLoC

Crates.io docs.rs

为thirtyfour crate提供高级元素查询/轮询接口。

这些接口目前是实验性的,一旦稳定,可能会合并到主thirtyfour crate中。

如果您能通过测试并提供反馈,将不胜感激。

使用方法

ElementQuery

首先,导入以下内容

use thirtyfour_query::{ElementPoller, ElementQueryable};

然后,设置默认轮询行为

// Disable implicit timeout in order to use new query interface.
driver.set_implicit_wait_timeout(Duration::new(0, 0)).await?;

let poller = ElementPoller::TimeoutWithInterval(Duration::new(20, 0), Duration::from_millis(500));
driver.config_mut().set("ElementPoller", poller)?;

其他ElementPoller选项也可用,例如NoWait和NumTriesWithInterval。根据需要,可以在每个查询的基础上覆盖这些选项。

现在,使用查询接口可以执行以下操作

let elem_text = 
    driver.query(By::Css("thiswont.match")).or(By::Id("searchInput")).first().await?;

这将在每个轮询迭代中执行两次查询,并返回第一个匹配的结果。您也可以像这样对匹配臂进行过滤

driver.query(By::Css("thiswont.match")).with_text("testing")
    .or(By::Id("searchInput")).with_class("search").and_not_enabled()
    .first().await?;

要获取所有匹配的元素而不是第一个元素,只需将first()改为all(),您将得到一个Vec。

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

ElementWaiter

首先,导入以下内容

use thirtyfour_query::{ElementPoller, ElementWaitable};

接下来,设置默认轮询行为(与ElementQuery相同 - 两者使用相同的轮询设置)

// Disable implicit timeout in order to use new query interface.
driver.set_implicit_wait_timeout(Duration::new(0, 0)).await?;

let poller = ElementPoller::TimeoutWithInterval(Duration::new(20, 0), Duration::from_millis(500));
driver.config_mut().set("ElementPoller", poller)?;

现在可以执行以下操作

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

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

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

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

thirtyfour_query::conditions 模块中,还提供了一系列预定义的谓词,以便于使用。

use thirtyfour_query::conditions;

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

查看 conditions 模块以获取可用谓词的完整列表。注意:谓词要求您指定是否忽略错误。

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

许可协议

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

SPDX-许可-标识符: MIT Apache-2.0

依赖项

~8–24MB
~338K SLoC