列出Capybara/Poltergeist元素的子元素[英] List child elements for a Capybara/Poltergeist element

问题描述

我已经四处搜索,我找不到一种方法.

我们正在使用emberjs/rails应用程序上的黄瓜功能中的Poltergeist驱动器进行Capybara测试.我无法使用page.driver.debug,因为我在无头流式实例中运行,因此我无法使用故障排除,但是屏幕截图可以工作,而Chrome Dev Tools在相关页面上检查的Chrome Dev Tools检查显示了正确的元素.

我的黄瓜场景失败了,这是因为发现不起作用.我的测试看起来像:

When(/^I delete description "(.*?)"$/) do |description|
  within :css, '#myform' do
    first('label', :text => /#{description}/).find(:xpath, '..').find(:css, 'button.delete')
  end
end

它找不到有关元素.这是DOM的相关部分:

<form id="myform">
  <div class="row-fluid question">
      <div class="span12">
        <div class="padding">
          <div id="ember576" class="ember-view is-viewing-edit-controls">
            <button class="delete" data-ember-action="31"></button>
            <button class="edit" data-ember-action="32"></button>
            <button class="insert_above" data-ember-action="33"></button>
            <button class="insert_below" data-ember-action="34"></button>
            <button class="move_up" data-ember-action="35"></button>
            <button class="move_down" data-ember-action="36"></button>
            <label class="question" data-ember-action="37">Enter your first name</label>
            <input id="ember577" class="ember-view ember-text-field">
            <span class="error"></span>
          </div>
        </div>
    </div>
  </div>
</form>

如果我添加了binding.pry,则:

first('label', :text => /#{description}/).find(:xpath, '..')
                                                                                              │

给我这个回应:

=> #<Capybara::Element tag="div">

和此:

first('label', :text => /#{description}/).find(:xpath, '..')
                                                                                              │

给我这个回应:

=> "Enter your first name"

但完整的发现:

first('label', :text => /#{description}/).find(:xpath, '..').find(:css, 'button.delete')

给我这个回应:

Capybara::ElementNotFound: Unable to find css "button.delete"

我感觉这是父母/兄弟姐妹的问题,但我不能对此进行故障排除.所以我想我有几个问题:

  1. 进行调试,无论如何是否有一个Poltergeist驱动程序列出所有子元素?
  2. 我的XPath选择器有问题吗? ..返回Capybara::Element tag="div"的事实使我认为我有正确的父元素(就像我说的那样,它在其他类似测试中的其他页面上都可以使用),但是我无法验证它是哪个元素.我找不到如何获得XPATH或其他帮助我识别元素的东西.

推荐答案

我弄清楚了.该测试正常工作,但是我错过了我的情况下的动作步骤.

但是,我认为你们都可能会发现我最终如何获得内容是有用的:在页面上执行jQuery.我在测试中添加了一个绑定.

# this gave me the expected contents and verified that button.delete was a child
page.execute_script("console.log($('#myform label.question').parent().html())");

# and this gave me the classes to demonstrate that it was the correct div
page.execute_script("console.log($('#myform label.question').parent().attr('class'))");

我与选择器一起捷径,因为我知道我正在寻找的标签是第一个标签,但是选择器没关系,这是console.log.log() - binding.pry的想法.很有用.

其他推荐答案

为仍在寻找的其他人尝试的东西: 尝试使用first(:xpath, './/..')而不是find(:xpath, '..').

也是一个好主意,可以在可以的时候减少find的范围,假设表格的ID属性是静态的,以更好地性能并防止模棱两可的匹配:

within('#myform') do
  find('label', text: "#{description}", match: :first). 
  first(:xpath, './/..').
  find('button.delete').
  click
end

本文地址:https://www.itbaoku.cn/post/1740044.html