为什么 assert_no_selector() 即使找到元素也要等到等待时间结束?

Why does assert_no_selector() wait until the wait time is over even if the element is found?

我正在使用 assert_selectorassert_no_selector 检查网页中的某个元素。

在一种情况下,该元素存在,而在其中一种情况下不存在。我的测试工作正常。但是,如果我在页面上的元素 时使用 assert_no_selector,测试不会立即失败,而是等到我的帮助文件中指定的 default_max_wait_time 之前它失败并继续进行下一个测试。例如

scenario 'expect element to appear' do
   login(email, password)
   assert_no_selector('a[id="elementID"]', minimum: 1)
end

我假设如果这段代码是 运行 并且该元素实际上位于页面上,那么它将立即失败。为什么它要等到达到最大等待时间,即使可能很快就找到了元素?有一个更好的方法吗?每当此测试失败时,我想避免让测试等待整个最大等待时间。

Capybaras 断言中等待行为的目的是处理浏览器中的异步行为。如果你使用 assert_no_selector 你是在告诉水豚你希望页面没有那个元素,所以它会等待最长等待时间让那个元素消失,然后引发异常(因为你告诉它您希望该元素不存在并且页面可能正在处理会导致该元素被删除的内容)。如果您想要立即检查,则指定等待时间为 0 - 但是一旦您在页面中有 JS 行为,这通常会导致不稳定的测试。

assert_no_selector('a#elementID', wait: 0)