在Bootstrap的popover中使用Watir的.click

时间:2013-04-15 11:37:50

标签: ruby-on-rails testing twitter-bootstrap watir watir-webdriver

在Watir中,我试图访问由Bootstrap提供的弹出窗口内出现的a元素。

只是打电话a(:class, 'my_link').click不想打球,所以我添加了一行a(:class, 'my_link').wait_until_present,希望在点击生成弹出窗口的元素和访问其内容之间可能存在时间问题,但这只是在30秒后超时并返回该元素永远不会出现。

在等待期间,我可以打开代码检查器并确认该元素确实存在且可点击。

我应该提一下,手动执行Watir的步骤应该可行。

我目前的想法

我知道当我尝试使用jQuery与此元素进行交互时,使用常规.click();将无法正常工作,而我必须调用$('body').on('click', ',my_link');才能在此处发挥类似的作用?

这可能与错误地被归类为不可见的元素有关。

我们将非常感激地收到任何指导。

代码

以下是popover内部生成的代码:

<div class="popover fade bottom in" style="top: 40px; left: 424px; display: block;">
  <div class="arrow"></div>
  <div class="popover-inner">
    <h3 class="popover-title"></h3>
    <div class="popover-content">
    <!-- SNIP -->
      <p>
        <a class="my_link">My Link</a>
      </p>
    </div>
  </div>
</div>

点击生成弹出窗口;

$('.nav-popup').popover('show');

以下是Watir测试的相关部分;

span(:class, 'nav-popup').click
a(:class, 'my_link').wait_until_present
a(:class, 'my_link').click

要检查我是否可以与popover进行交互,我将以下内容添加到我的Watir测试中;

quick_log = a(:class, 'my_link').html
binding.pry

当pry打开时,我可以看到quick_log包含正确的HTML内容,这很烦人,因为下一行是a(:class, 'my_link').wait_until_present,它可以解决这个问题。

错误消息

该行

a(:class, 'my_link').click

生成;

Selenium::WebDriver::Error::ElementNotVisibleError:
   Element is not currently visible and so may not be interacted with

2 个答案:

答案 0 :(得分:2)

鉴于你的答案,而不是两行代码,我只是做

browser.div(:class, 'popover-content').a(:class, 'my_link').click

鉴于这是由javascript动态创建的,你可能不得不投入一些东西来同步并等待元素产生

browser.div(:class, 'popover-content').when_present.a(:class, 'my_link').click

答案 1 :(得分:1)

这似乎与bootstrap生成popover的方式有关,它必须从某个地方克隆它,这意味着当我在做a(:class, 'my_link').click时,它找到了实际的popover从中克隆的隐藏版本。

要解决此问题,我将a(:class, 'my_link').click更改为

container = div(:class, 'popover-content')
container.a(:class, 'my_link').click

这使它更具体,避免找到重复元素。