我想弄清楚如何写一个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中定义了这样的步骤。步骤(注意,我没有使用默认的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="submitsbutton"]' (Capybara::ElementNotFound)
我也试过:
xpath_for("submit button")
但是我得到一个堆栈级别太深的错误!
我不是真的有信心我的regex/xpath元素查找技能,所以请告诉我我的代码有什么问题,我怎么能找到那个按钮?
非常感谢你的帮助!
[编辑]
默认选择器是:css。改成:xpath:
Capybara.default_selector = :xpath
如果你尝试
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')
相反:
find(:xpath, 'button[@class="submit button"]')
你应该有:
find('button.submit.button')
上面是css,因为它是默认的选择器。
如果您想使用XPath解决方案,请查看https://stackoverflow.com/a/11752824/507018,但它更难看。
如果您与按钮<button class="submit button">
的类完全匹配,您可以尝试以下操作:
find(:xpath, '//button[@class="submit button"]')
确保您没有忘记搜索字符串开头的双斜杠