如何检测功能规格中是否启用了JavaScript

时间:2019-07-08 01:36:28

标签: rspec

我有一个测试助手,如果它已被启用了javascript的功能规范所使用,则该助手需要具有不同的行为。

我有一个类似的测试

it 'test something', js: true do
   ... (code that uses javascript)
   special_method
end

和另一个类似的测试

it 'test something else' do
   ... (code that does not use javascript)
   special_method
end

和特殊方法:

def special_method
   ... (lots form filling)
   if js_true?
     find_button('Update').trigger 'click'
   else
     click_button 'Update
   end
end

其中js_true?是一些方法,如果调用功能说明具有true,则该方法返回js: true。我需要此功能,因为当js: true页面显示不同并且click_button不再起作用时。

存在一些错误,这意味着当我尝试在启用JavaScript的情况下使用click_button时,出现以下错误:

    Capybara::Poltergeist::MouseEventFailed:
           Firing a click at co-ordinates [73, 700.5] failed. Poltergeist detected another element with CSS selector 'html body.home-page div.cc-window.cc-banner.cc-type-info.cc-theme-block.cc-bottom.cc-color-override--1608664607 span#cookieconsent:desc.cc-message' at this position. It may be overlapping the element you are trying to interact with. 

If you don't care about overlapping elements, try using node.trigger('click').

该错误消息无济于事,因为没有重叠的元素,并且该消息的确显示:

     # --- Caused by: ---
         # Capybara::Poltergeist::BrowserError:
         #   
There was an error inside the PhantomJS portion of Poltergeist. 
If this is the error returned, and not the cause of a more detailed error response, this is probably a bug, so please report it.

因此,在解决此错误之前,我需要一种变通方法来检测是否为测试启用了javascript。

1 个答案:

答案 0 :(得分:2)

更新:由于该问题已更新,可以提供实际错误消息来驱动对此功能的请求,因此我们可以看到实际问题是一个重叠元素。我知道您声称没有重叠的元素,并认为这纯粹是一个错误(因为不建议使用Poltergeist,所以永远无法修复),但是从该错误消息中肯定有一个重叠的元素以及重叠元素的类名我会说这是屏幕底部的横幅,要求用户接受该网站使用cookie的事实(save_and_open_screenshot会确认这一点)。

无论如何,如果您选择不通过执行用户必须做的事情(接受cookie横幅)来修复测试,则可以使用当前的RSpec示例元数据

def js_true?
  RSpec.current_example.metadata[:js]
end

确定您当前是否在测试中设置了:js元数据。

我确实想再强调一点,在测试中使用trigger是一个非常糟糕的主意。它不会复制用户的操作,将使转向更现代的驱动程序变得困难,并且最终可能会毫无意义地进行测试。

------上一个答案-------

您的问题令人困惑,因为您使用js: true元数据进行了测试,这意味着仅应在支持JS的测试中运行该测试,但是在此方法中,您正在调用一种方法,该方法试图在JS上做一些不同的事情支持。不支持JS时怎么称呼它? 如果您以某种方式从不支持JS的驱动程序调用它,则所有支持JS的驱动程序都应以true响应wait?,因此您应该可以执行page.driver.wait?或使用{{1} }来确定是否设置了RSpec.current_example.metadata-但是并非所有支持JS的驱动程序都支持js: true,如果您正在测试某个应用,则您实际上不应该使用trigger(如果只是从页面抓取数据)。如果弄清楚为什么您认为需要使用trigger(不会复制用户行为)并将其替换为用户实际可以执行的行为,那么您将进行更好的测试。