【问题标题】:Watir-webdriver can't click on visible link which appears in popupWatir-webdriver 无法点击弹出窗口中的可见链接
【发布时间】:2015-04-21 15:01:42
【问题描述】:

我正在使用 watir-webdriver + ruby​​ + rspec + gem parallel_tests。

我的测试用例必须能够取消然后从项目列表中删除项目。 “取消”和“删除”链接从弹出菜单中出现。 以下方法验证取消链接gear_dropdown_menu.cancel_job = browser.link(:text, 'Cancel') 是否可见。

  Timer.repeat_until_true(30, 1) do
    sleep 1
    gear_dropdown_menu.cancel_job.visible?
  end

当链接出现并且我可以看到它时,接下来我尝试使用这样的代码点击它:

  browser.execute_script("
    id = $('div.job-actions:visible').data('id');
    $('a[href*=\"jobs/'+ id +'/cancel\"]').show().click()
  ")

div.job-actions:visible - actions popup, where links are placed

我使用 data-id 属性来指定直接链接 href。但是看起来watir看不到。

问题是当我并行执行测试时,3 次中的 2 次尝试失败。 当我执行非并行测试时,看起来总体不错。

问题的原因可能是什么?

更新:添加弹窗代码。它不是一个单独的窗口。只是当我点击一个按钮时出现的隐藏的 div 元素。

 <div class="job-actions" data-id="8769" style="top: 329px; right: 0px; display: block;">
  <section>
    <header>Actions</header>
    <ul>
            <li class="pause">
              <a href="http://host.com/jobs/8769/pause">Pause Job</a>
            </li>
          <li class="cancel">
            <a href="http:/host.com/jobs/8769/cancel" class="cancel">Cancel Job</a>
          </li>
          </ul>
  </section>
</div>

【问题讨论】:

  • 我很好奇你为什么要手动滚动你自己的wait_until_present 方法?此外,发布最少量的 HTML 来复制问题(以及错误堆栈跟踪)将使人们更容易重现您的问题。
  • @orde 因为标准方法并非每次都有效。抱歉没有html。
  • 但听起来您自己的方法也每次都不起作用。也许你最好仔细看看为什么 wait_until_present 不适合你?
  • WHY oh 为什么 oh 为什么你使用javascript来点击一些东西?这就是普通用户与您的系统交互的方式吗?
  • @ChuckvanderLinden 因为我不知道为什么它不起作用。是的,似乎问题不在while_until_present 方法中。还有其他建议吗?

标签: ruby firefox watir watir-webdriver qa


【解决方案1】:

(text: 'Cancel') 将匹配列表中的第一个取消按钮。如果您正在并行运行测试,您可能会遇到从列表中取消/删除相同项目的竞争条件。

其他几个提示: 您不必使用计时器。您的代码在功能上等同于内置方法:

gear_dropdown_menu.cancel_job.wait_until_present

另外,您的弹出窗口是一个单独的窗口吗?如果是这样,您不需要使用 execute_script (应尽可能避免)。你可以使用:

browser.window(title: 'Your Popup Title').use { browser.link(href: /cancel/).click }(或任何有意义的选择器)

【讨论】:

    【解决方案2】:

    如果您的问题仅在并行运行时出现,那么听起来您可能在测试之间存在依赖关系或干扰,最终会产生竞争条件。

    如果您正在执行 Create、Update、Delete 类型的操作,那么每个测试都需要使用使用唯一标识符(名称?id's?)创建的唯一对象,如果不是,那么当您需要时,一个对象可能不存在(不是已创建,已删除等),或者您可能会遇到由于对象名称/标识符不唯一而导致的冲突(因此测试可以重新创建对象的新副本,另一个测试刚刚删除,导致第二个测试认为删除失败等)

    如果没有看到更多的代码,很难给你更准确的建议,但根据我的经验,当一些事情在串行完成时有效,但如果顺序改变,或者单独运行测试,或者测试并行运行,那么您可能在测试之间存在依赖关系,或者一个测试在另一个测试尝试取消或更新相同的内容之前删除了某些内容。

    【讨论】:

    • 偶尔出现的问题并不依赖于并行或串行执行。它可以从 5 开始工作 5 次,并且可以从 5 开始工作 4 次。是的,它适用于不同的对象。我在视觉模式下验证了这一点。我认为问题之一可能是在 CI 上运行的无头模式
    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多