Ruby on rails Rails Capybara未检测到flex项目的活动性

Ruby on rails Rails Capybara未检测到flex项目的活动性,ruby-on-rails,selenium,capybara,Ruby On Rails,Selenium,Capybara,我正在做display:flex一个元素,点击按钮,然后在一些ajax调用之后对同一个元素执行display:none。我正在使用Capybara和Selenium驱动程序进行集成测试。问题是,水豚能检测到元素的可见性,有时即使元素是可见的,它也不能检测到。我尝试过给出不同的wait值,但它有时有效,有时无效。有什么我可以纠正的吗?代码如下: ele.addEventListener('change', () => { showSpinner(true); ajaxCall().t

我正在做
display:flex
一个元素,点击按钮,然后在一些ajax调用之后对同一个元素执行
display:none
。我正在使用
Capybara
Selenium
驱动程序进行集成测试。问题是,水豚能检测到元素的可见性,有时即使元素是可见的,它也不能检测到。我尝试过给出不同的
wait
值,但它有时有效,有时无效。有什么我可以纠正的吗?代码如下:

ele.addEventListener('change', () => {
  showSpinner(true);
  ajaxCall().then(() => showSpinner(false));
}

showSpinner = (flag) => {
  let spinner = document.getElementById('spinner');
  if (!spinner) {
    return;
  } else if (flag) {
    spinner.classList.add('show');
  } else {
    spinner.classList.remove('show');
  }
};

.spinner.show {
  display: flex;
}

.spinner {
  display: none;
  // other properties
}
在测试文件中

choose 'radio_button' // if radio button
select 'some text', from: 'dropdown_element' // if dropdown
assert page.has_css?('.spinner', wait: 0)

这有时有效,有时无效。元素被选中或单击。这很有效。但不是
有_css
。此外,我还尝试使用
assert\u css
,但出现了错误。那么,如何为上述问题编写测试用例呢?

我解决了以下问题。我从@Thomas Walpole对我提出的这个问题的评论中找到了答案。问题是,有时候ajax响应非常快,有时候很慢。所以我所要做的就是放慢网络的速度

// Set the latency time through selenium before the click or select and then check 
// for the visibility of the element on page and then again change back the latency

page.driver.browser.network_conditions = { offline: false, latency: 2000, throughput: 789 }
choose 'radio_button' // if radio button
select 'some text', from: 'dropdown_element' // if dropdown
assert page.has_css?('.spinner', wait: 0)
page.driver.browser.network_conditions = { offline: false, latency: 0, throughput: 0 }
// continue with other tests

这解决了我的问题。请随意改进此解决方案。

我解决了以下问题。我从@Thomas Walpole对我提出的这个问题的评论中找到了答案。问题是,有时候ajax响应非常快,有时候很慢。所以我所要做的就是放慢网络的速度

// Set the latency time through selenium before the click or select and then check 
// for the visibility of the element on page and then again change back the latency

page.driver.browser.network_conditions = { offline: false, latency: 2000, throughput: 789 }
choose 'radio_button' // if radio button
select 'some text', from: 'dropdown_element' // if dropdown
assert page.has_css?('.spinner', wait: 0)
page.driver.browser.network_conditions = { offline: false, latency: 0, throughput: 0 }
// continue with other tests

这解决了我的问题。请随意改进此解决方案。

使用
assert\u css
会出现什么错误,因为您确实不应该将bare
assert
与水豚谓词一起使用。如果该方法不存在,可能是因为您没有要求
capybara/minitest
(假设您使用minitest)是。这种方法并不存在。我没有要求
水豚/minintest
。我会这样做,但是为什么我不应该使用
assert
,为什么
assert\u css
比前者更受欢迎?因为它会导致编写更稳定的测试(重试行为),因为当断言失败时,这些错误实际上是有用的,
assert\u css
会出现什么错误,因为你真的不应该对Capybara谓词使用bare
assert
。如果该方法不存在,可能是因为您没有要求
capybara/minitest
(假设您使用minitest)是。这种方法并不存在。我没有要求
水豚/minintest
。我会这样做,但是为什么我不应该使用
assert
,为什么
assert\u css
比前者更受欢迎?因为它会导致编写更稳定的测试(重试行为),而且当断言失败时,错误实际上是有用的