【问题标题】:logout in capybara with bootstrap menu使用引导菜单在 capybara 中注销
【发布时间】:2020-07-20 15:26:47
【问题描述】:

我无法通过 capybara 在 bootstrap 4 中测试菜单。

导航菜单sn-p如下所示:

<div class="collapse navbar-collapse" id="navbarSupportedContent">
  <ul class="navbar-nav">
    <li class="nav-item dropdown" >
      <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown" id="userDropdown">
        User
      </a>
      <div class="dropdown-menu dropdown-menu-right" aria-labelledby="userDropdown">
        <%= link_to 'logout', logout_url, method: :post, class: 'dropdown-item'%>
      </div>
    </li>
  </ul>
</div>

在调试模式下,这几乎可以工作:

find('#userDropdown').execute_script('$(this).dropdown("toggle")')
click_on 'logout'

“几乎”,因为在 byebug 中,浏览器看起来总是落后一步。触发任何类型的动作,例如选择它不存在的东西,将其移至预期状态。

从那里开始,这些操作就起作用了。

但在测试中,我在click_on 'logout' 行上得到了一个Selenium::WebDriver::Error::StaleElementReferenceError: stale element reference: element is not attached to the page document

解决方法(现在有效):

find('#userDropdown', visible: false).execute_script('$(this).dropdown("toggle")')
click_on 'logout'

几乎和以前一样。我错过了可见性属性,错误只是误导。但是太多的硬编码...

【问题讨论】:

  • 您尝试使用execute_script 打开菜单而不是像用户那样与它进行交互是否有特定原因?
  • @ThomasWalpole 我找不到更好的方法....hover 不起作用,我不知道还有其他选择。
  • 那么用户必须做什么才能使菜单可见——如果#userDropdown 需要visible: false 才能找到,那么这意味着它在页面上不可见——这意味着有一个不同的元素用户必须将鼠标悬停或单击才能使菜单可见,这就是您应该做的

标签: javascript ruby-on-rails selenium bootstrap-4 capybara


【解决方案1】:

抱歉,我无法发表评论以获得澄清,因此我必须将其发布为答案。

我会在这里进一步研究三件事:

  1. find('#userDropdown').click 有效吗?如果是这样,请尝试这样做,因为从用户的角度来看它更自然,并且可能会导致更准确的“失败”。
  2. 是否由于测试浏览器中的窗口大小而隐藏了整个导航?
  3. 这根本不是最佳实践,但完全不触碰下拉菜单,您能做到find(:xpath, "//a[text()='logout']", visible: false).click 吗?您甚至可以临时添加一个 CSS id 并使用它,而不是在 xpath 中使用。

在这三个中,我认为第三个最有可能起作用,但也最不可能发现问题,而且不是好的做法。希望这可以帮助。

【讨论】:

  • 1) 不,它没有(链接在菜单内并隐藏)2) 不,大小还可以,可以看到菜单栏 3) 我做了这样的事情,但是作为你说……不好……
  • 鉴于 1) 和 2),您能否采取必要的步骤使链接可见?您需要将鼠标悬停在某物上或点击某物吗?
猜你喜欢
  • 2017-05-29
  • 2015-08-03
  • 2018-08-19
  • 1970-01-01
  • 2015-02-06
  • 2017-03-12
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多