1

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

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

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

我应该提到,手动执行 Watir 应该执行的步骤。

我现在的想法

我知道当我尝试使用 jQuery 与这个元素进行交互时,使用常规.click();是行不通的,相反我不得不调用$('body').on('click', ',my_link');类似的东西在这里起作用吗?

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

任何指导将不胜感激。

代码

这是弹出框内部生成的代码:

<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

为了检查我是否可以与弹出框交互,我将以下内容添加到我的 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
4

2 回答 2

2

鉴于您的回答,那么我会简单地做而不是两行代码

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

鉴于它是由 javascript 动态创建的,您可能需要扔一些东西来同步并等待元素生成

browser.div(:class, 'popover-content').when_present.a(:class, 'my_link').click
于 2013-04-15T16:59:59.820 回答
1

这似乎与引导程序生成弹出框的方式有关,它必须从某个地方克隆它,这意味着当我这样做时,a(:class, 'my_link').click它会找到实际弹出框从中克隆的隐藏版本。

为了解决这个问题,我a(:class, 'my_link').click改为

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

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

于 2013-04-15T14:11:48.440 回答