Cucumber Xpath селектор - PullRequest
       19

Cucumber Xpath селектор

1 голос
/ 29 ноября 2011

У меня есть следующий HTML-код на странице, которую я пытаюсь протестировать с огурцом.

<div class='try_options'>
  <ul>
    <li>
      <div>
        <img alt="" src="/images/main_page1.jpg" />
        <div class='right_section'>

          <p>
            Feature 1
          </p>
          <a class='suggest_btn' href='url1'>Try Now</a>
        </div>
      </div>
    </li>
    <li>
      <div>
        <img alt="" src="/images/main_page2.jpg" />
        <div class='right_section'>

          <p>
            Feature 2
          </p>
          <a class='suggest_btn' href='url2'>Try Now</a>
        </div>
      </div>
    </li>
    <li>
      <div>
        <img alt="" src="/images/main_page3.jpg" />
        <div class='right_section'>

          <p>
            Feature 3
          </p>
          <a class='suggest_btn' href='url3'>Try Now</a>
        </div>
      </div>
    </li>
    <li>
      <div>
        <img alt="" src="/images/main_page4.jpg" />
        <div class='right_section'>

          <p>
            Feature 4
          </p>
          <a class='suggest_btn' href='url4'>Try Now</a>
        </div>
      </div>
    </li>
  </ul>
</div>

По сути, есть функции, каждая из которых имеет ссылку "Попробовать сейчас".Я хочу проверить, переходит ли я по ссылке на страницу соответствующей функции.

Я нашел реализацию шага simalar здесь , но с XPATH что-то не так.Любая помощь будет высоко ценится.

Ответы [ 2 ]

5 голосов
/ 29 ноября 2011

Когда я делал нечто подобное раньше, я использовал XPath, чтобы найти элемент «идентификатор» - в вашем случае тег p, содержащий, например, «Feature 1», затем прошел по DOM к общему родителю (li здесь) и снова вниз, чтобы найти того брата, которого я преследовал (например, ссылку, связанную с p). Это может работать для вас:

def find_link_for_feature(feature_name)
    find(:xpath, "//p[contains(.,'#{feature_name}')]/ancestor::li/descendant::a")
end

find_link_for_feature('Feature 1').click

Возможно, вы захотите добавить дополнительную фильтрацию, чтобы она только находила ссылку с классом suggest_btn, в зависимости от вашей ситуации.

Однако, как я уже упоминал в комментарии к вопросу, я предпочитаю изменять разметку, чтобы она действительно тестировалась без необходимости прыгать через такие обручи! Я считаю, что этот тип XPath - это последнее средство, когда я не могу изменить разметку.

EDIT:

Думая о вашем комментарии, спрашивающем, как сделать другие вещи в области действия родительского элемента, я бы больше соблазнился сделать что-то вроде следующего, что дает вам больше гибкости и слегка обрезает уродливый XPath: *

def find_section_for_feature(feature_name)
    find(:xpath, "//p[contains(.,'#{feature_name}')]/ancestor::li")
end

within find_section_for_feature('Feature 1') do
    click_link 'Try Now'
    # Anything else you want to do
and
0 голосов
/ 29 ноября 2011

Если ваш xpath основан на указанной вами ссылке, он, вероятно, получает коллекцию элементов. Так что вместо одной ссылки получается группа ссылок. Попробуйте захватить только одну из ссылок (например, первую в коллекции) и используйте ее.

...