Огурец / Капибара - Как найти определенную кнопку с помощью XPath?

Я пытаюсь понять, как написать функцию входа в oAuth / Twitter с помощью Cucumber / Capybara. Часть этого заключается в посещении страницы: http://www.twitter.com/sessions/new и вводе имени пользователя, пароля и последующем нажатии на кнопку «Войти». Этот последний шаг работает не так, как ожидалось, html-код для этой страницы выглядит следующим образом (находится на французском языке):

<fieldset class="textbox"> 
  <label class="username"> 
    <span>Nom d'utilisateur ou e-mail</span> 
    <input type="text" value="" name="session[username_or_email]" autocomplete="on" /> 
  </label> 
  <label class="password"> 
    <span>Mot de passe</span> 
    <input type="password" value="" name="session[password]" /> 
  </label> 
</fieldset> 
  <fieldset class="subchck"> 
  <button type="submit" class="submit button">Se connecter</button> 

Я определил такой шаг в web.steps (обратите внимание, что я использую не драйвер capybara по умолчанию, а capybara -механизировать):

Given /^I sign in$/ do
    visit 'http://twitter.com/sessions/new'
    fill_in "Username or email", :with => 'xxx'
    fill_in "Password", :with => 'xxx'
    find(:xpath, 'button[@class="submit button"]')
    ....
end

Строка find (: xpath, ..) работает некорректно. Я попытался поставить '/ s' (регулярное выражение для символа пробела), но все равно получаю это сообщение об ошибке:

 Unable to find '//button[@class="submit\sbutton"]' (Capybara::ElementNotFound)

Я также пробовал:

xpath_for("submit button")

Но я получаю слишком глубокую ошибку уровня стека!

Я не совсем уверен в своих навыках поиска элементов regex / xpath, поэтому, пожалуйста, скажите мне, что не так с моим кодом и как я могу найти эту кнопку?

Большое спасибо за помощь!

[РЕДАКТИРОВАТЬ]

Оказывается, селектор по умолчанию: css. Я изменил его на: xpath:

Capybara.default_selector = :xpath

Но это все еще не решает мою проблему.


person Amokrane Chentir    schedule 22.04.2011    source источник
comment
класс не может включать пробел, у вас есть элемент кнопки с двумя классами «отправить» и «кнопка»   -  person Chuck van der Linden    schedule 08.06.2013


Ответы (3)


Что если вы попробуете

  click_on "Se connecter"

РЕДАКТИРОВАТЬ: Попытка использовать nokogiri (потому что capybara использует nokogiri) у меня не работает, когда я использую ваш HTML как есть (это означает, что он даже не видит элемент в документе). Но когда я помещаю все в один корневой узел, это работает ... не знаю, есть ли проблема с HTML вашей страницы или что-то в этом роде ... с правильно сформированной страницей, это "должно" работать. не уверен, насколько это помогает

<html>
<fieldset class="textbox"> 
  <label class="username"> 
    <span>Nom d'utilisateur ou e-mail</span> 
    <input type="text" value="" name="session[username_or_email]" autocomplete="on" /> 
  </label> 
  <label class="password"> 
    <span>Mot de passe</span> 
    <input type="password" value="" name="session[password]" /> 
  </label> 
</fieldset> 
  <fieldset class="subchck"> 
  <button type="submit" class="submit button">Se connecter</button> 
</html>

с этим HTML я могу просто использовать xpath

xpath('//button')
person noli    schedule 22.04.2011
comment
Спасибо. Дело в том, что на странице много кнопок, но первая - это та, на которую я хочу нажать. Не знаю, каково будет поведение в этом случае. Я попробовал и получил ошибку: уровень стека слишком глубок (SystemStackError). Между прочим, я проверил с хорошо сформированной страницей (той, которую вы получаете при переходе на www.twitter.com/sessions/new). - person Amokrane Chentir; 22.04.2011
comment
Последнее, что я могу предложить, это присвоить вашей кнопке идентификатор и выполнить поиск по идентификатору :( - person noli; 22.04.2011
comment
Очень хотелось бы :) Но тогда мне придется отправить тикет в Твиттер :). - person Amokrane Chentir; 22.04.2011
comment
не понял, вы тестировали твиттер напрямую ... посмотрите, поможет ли это selectorgadget.com - person noli; 22.04.2011
comment
Хороший инструмент. Я получил: // * [contains (concat (, @class,), concat (, button,))] с ним и протестировал его, выполнив: find (: xpath, // * [contains (concat (\ \, @ класс, \ \), concat (\ \, \ button \, \ \))]). Он все еще не находит его :(. Это сводит меня с ума! В любом случае, +1 за помощь и не стесняйтесь возвращаться, если у вас есть другие идеи по этому поводу :). - person Amokrane Chentir; 22.04.2011

Вместо:

find(:xpath, 'button[@class="submit button"]')

у тебя должно быть:

find('button.submit.button')

Выше - css, так как это селектор по умолчанию.

Если вам нужно решение с XPath, посмотрите https://stackoverflow.com/a/11752824/507018, но это уродливее.

person Иван Бишевац    schedule 21.08.2012

Если у вас есть точное соответствие классу кнопки <button class="submit button">, вы можете попробовать следующее:

find(:xpath, '//button[@class="submit button"]')

Убедитесь, что вы не забыли двойную косую черту в начале строки поиска.

person Малъ Скрылевъ    schedule 09.04.2014