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

Я пытаюсь выяснить, как написать функцию входа в 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-mechanize ):

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, поэтому, пожалуйста, скажите, что не так с моим кодом и как я смог найти эту кнопку?

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

[EDIT]

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

Capybara.default_selector = :xpath

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

Ответы [ 3 ]

4 голосов
/ 22 апреля 2011

Что делать, если вы попробуете

  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')
1 голос
/ 21 августа 2012

Вместо:

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

вы должны иметь:

find('button.submit.button')

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

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

0 голосов
/ 09 апреля 2014

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

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

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

...