【发布时间】: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