Cucumber / Capybara - 如何使用XPath搜索特定按钮?

时间:2011-04-22 09:40:06

标签: cucumber xpath capybara twitter-oauth

我正在试图弄清楚如何用Cucumber / Capybara写一个oAuth / Twitter登录功能。部分内容包括访问页面: 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")

但是我的堆栈级别太深了错误!

我对我的正则表达式/ xpath元素查找技巧不太自信所以请告诉我我的代码有什么问题以及如何找到该按钮?

非常感谢帮助我!

[编辑]

结果默认选择器是:css。我将其更改为:xpath:

Capybara.default_selector = :xpath

但它仍然无法解决我的问题。

3 个答案:

答案 0 :(得分:4)

如果你尝试

怎么办?
  click_on "Se connecter"
编辑:尝试使用nokogiri(导致水豚使用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 :(得分:1)

相反:

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

你应该:

find('button.submit.button')

上面是css,因为它是默认选择器。

如果你想要使用XPath的解决方案,请查看https://stackoverflow.com/a/11752824/507018,但它更加丑陋。

答案 2 :(得分:0)

如果您与按钮<button class="submit button">的类完全匹配,则可以尝试以下操作:

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

确保您没有忘记搜索字符串开头的双斜杠。