代码之家  ›  专栏  ›  技术社区  ›  Obromios

如何检测功能规范中是否启用了javascript

  •  0
  • Obromios  · 技术社区  · 6 年前

    我有一个测试助手,如果它被启用了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:没错 页面以不同的方式呈现 click_button 不再有效。

    有一个错误,这意味着当我尝试使用 点击按钮 启用javascript后,我会出现以下错误:

        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。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Thomas Walpole    6 年前

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

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

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

    确定您当前是否正在进行具有 :js 设置元数据。

    我想再强调一次,使用 trigger 参加考试真是个坏主意。它不能复制用户所能做的,将使转向更现代的驾驶者变得困难,并可能最终使测试变得毫无意义。

    ------先前的答案-------

    你的问题令人困惑,因为你有一个测试 js: true 元数据,这意味着它应该只为支持JS的测试运行,但在其中,你调用了一个方法,如果支持JS,它会尝试做一些不同的事情。当JS不受支持时,它是如何调用的? 如果您是从一个不支持JS的驱动程序调用它,那么所有支持JS的驱动程序都应该响应 wait? 如果是真的,那么你应该能够做到 page.driver.wait? 或者你可以用 RSpec.current_example.metadata 确定 js:没错 已设置-但并非所有支持JS的驱动程序都支持 触发 你真的不应该使用 触发 如果你正在测试一个应用程序(如果只是从页面上抓取数据就可以了)。如果你弄清楚为什么你认为你需要使用 触发 (它不复制用户行为),而是用用户实际可以做的行为来代替它。