2011-04-22 86 views
1

我想弄清楚如何用黃瓜/水豚寫一個oAuth/Twitter登錄功能。其中的一部分包括訪問頁面:http://www.twitter.com/sessions/new並填寫用戶名,密碼,然後點擊'登錄'按鈕。預期這最後一步不工作,該網頁的HTML代碼如下所示(位於法國):黃瓜/水豚 - 如何使用XPath搜索特定的按鈕?

<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-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 

這一發現(:XPath中,..)線不能正常工作。我試圖把一個「/ S」(正則表達式空格字符),但我仍然收到此錯誤信息:

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

我也試過:

xpath_for("submit button") 

但我得到一個堆棧級別太深錯誤!

我對自己的正則表達式/ xpath元素的查找技能並不是很有信心,所以請告訴我我的代碼出了什麼問題,以及如何找到那個按鈕?

非常感謝您的幫助!

[編輯]

原來的默認選擇器是:CSS。我把它改爲:XPath的:

Capybara.default_selector = :xpath 

但它仍然沒有解決我的問題。

+0

一個類不能包含空格,你所擁有的是一個帶有兩個類'submit'和'button'的按鈕元素 – 2013-06-07 20:42:36

回答

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') 
+0

我試過的第一件事。沒有成功不幸的是:( – 2011-04-22 09:45:19

+0

)謝謝。事情是頁面上有很多按鈕,但第一個是我想要點擊的按鈕。不知道在這種情況下會是什麼樣的行爲。得到一個:堆棧層次太深(SystemStackError)錯誤。順便說一下,我檢查了一個格式良好的頁面(當你訪問www.twitter.com/sessions/new時獲得的頁面) – 2011-04-22 10:27:04

+0

我可以建議的最後一件事是給你的按鈕一個ID,並通過ID搜索:( – noli 2011-04-22 10:32:46

1

相反:

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

你應該有:

find('button.submit.button') 

上面是css,因爲它是默認選擇器。

如果你想XPath的解決方案看看https://stackoverflow.com/a/11752824/507018,但它是醜陋的。

0

如果你有確切的匹配類按鈕<button class="submit button">的,你可以嘗試只以下:

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

確保您沒有在搜索字符串的開頭忘記了雙斜槓。