为什么水豚找不到我的元素?

发布于 2025-01-14 11:08:11 字数 6651 浏览 4 评论 0原文

我正在为一个项目制作一个假 Twitter 应用程序,但我遇到了 Capybara 无法识别我的 :username 元素的问题。我的代码中是否缺少某些内容或者可能是我尚未完成的过程?我对编码还很陌生,所以我肯定会错过一些相对简单的东西。我包括我的 ApplicationController、UserController 和 TweetController。提前致谢!

require './config/environment'

class ApplicationController < Sinatra::Base

  configure do
    set :public_folder, 'public'
    set :views, 'app/views'
    enable :sessions
    set :session_secret, 'secret'
  end

  get '/' do
    erb ':index'
  end

  helpers do 
    
    def current_user
      @user ||= User.find_by(id: session[:user_id]) if session[:user_id]
    end

    def logged_in?
      !!current_user
    end
  end
end
class UsersController < ApplicationController
    get '/users/:slug' do
        @user = User.find_by_slug(params[:slug])
        erb :"users/show"
    end

    get '/signup' do
        if !logged_in?
            erb ":users/signup"
        else
            redirect to "/tweets"
        end
    end

    post '/signup' do
        if params[:username] == "" || params[:email] == "" || params[:password] == ""
            redirect to "/signup"
        else
            @user = User.new(username: params[:username], email: params[:email], password: params[:password])
            @user.save
            session[:user_id] = @user.id
            redirect to "/tweets"
        end
    end

    get '/login' do
        if !logged_in?
            erb :"users/login"
        else
            redirect to "/tweets"
        end
    end

    post '/login' do
        a = User.find_by(username: params[:username])
        if a && a.authenticate(params[:password])
            session[:user_id] = @user
            redirect to "/tweets"
        else
            redirect to "/signup"
        end
    end

    get '/logout' do
        if logged_in?
            session.destroy
            redirect to "/login"
        else
            redirect to "/"
        end
    end
end
class TweetsController < ApplicationController
    
    get '/tweets' do
        if logged_in?
            @tweets = Tweet.all
            erb 'tweets/tweets'
        else
            redirect to '/login'
        end
    end

    get '/tweets/new' do
        if logged_in?
            erb 'tweets/create_tweet'
        else
            redirect to 'login'
        end
    end

    post '/tweets' do
        if logged_in?
            erb 'tweets/create_tweet'
        else
            redirect to '/login', 200
        end
    end

    get '/tweets/:id' do 
        if logged_in?
            @tweet = Tweet.find_by_id(params[:id])
            erb 'tweets/show_tweet'
        else
            redirect to '/login'
        end
    end

    patch '/tweets/:id' do
        @tweet = Tweet.find_by_id(params[:id])
        if !params[:content].empty?
            @tweet.update(content: params[:content])
            @tweet.save
            redirect 'tweets/#{params[:id]}'
        else
            redirect 'tweets/#{params[:id]}/edit'
        end
    end

    post '/tweets/:id/delete' do 
        @tweets = Tweet.find_by_id(params[:id])
        if current_user == @tweet.user
            @tweet.delete
            redirect to '/tweets'
        else
            redirect to '/tweets/#{params[:id]}'
        end
    end
    
end
Failure/Error: fill_in(:username, :with => "becky567")
     
     Capybara::ElementNotFound:
       Unable to find field :username that is not disabled

测试代码:

describe 'index action' do
    context 'logged in' do
      it 'lets a user view the tweets index if logged in' do
        user1 = User.create(:username => "becky567", :email => "[email protected]", :password => "kittens")
        tweet1 = Tweet.create(:content => "tweeting!", :user_id => user1.id)

        user2 = User.create(:username => "silverstallion", :email => "[email protected]", :password => "horses")
        tweet2 = Tweet.create(:content => "look at this tweet", :user_id => user2.id)

        visit '/login'

        fill_in(:username, :with => "becky567")
        fill_in(:password, :with => "kittens")
        click_button 'submit'
        visit "/tweets"
        expect(page.body).to include(tweet1.content)
        expect(page.body).to include(tweet2.content)
      end
    end

显示推文 HTML:

<p><%= @tweet.content %></p>
<form action="/tweets/<%= @tweet.id %>" method="post">
    <input type="hidden" name="_method" value="delete">
    <input type="submit" value="Delete Tweet">
</form>
<a href="/tweets/<%= @tweet.id %>/edit">Edit Tweet</a>

推文 HTML:

<h1> Welcome, <%[email protected] %></h1>
<% @tweets.each do |tweet| %>
    <p><a href="tweet/<%=tweet.id%>"><%tweets.content %></a></p>
<% end %>

显示用户 HTML:

<h1><%[email protected]%></h1>

<a href="/tweets/new"> New Tweet</a>
<% @user.tweets.each do |tweet|%>
<%= tweet.content %><a href="/tweets/<%=tweet.id%>/edit">EDIT</a>
<% end %>

<a href="/logout">Log Out</a>

登录 HTML:

<h1>Login to Fwitter</h1>
<form action="/login" method="post">
    <label>Username: </label><input type="username" name="username">
    <label>Password: </label><input type="password" name="pasword">
    <input type="submit" value="submit">
</form>

注册 HTML:

<h1> Sign Up for Fwitter</h1>
<form action="/signup" method="post">
    <label for="username">Username</label>
    <input type="text" id="username" name="username">
    <label for="email">Email</label>
    <input type="text" id="email" name="email">
    <label for="password">Password</label>
    <input type="text" id="password" name="password">
    <button type="submit" value="submit">Sign Up</button>
</form>

I'm making a fake twitter app for a project and I have this issue with Capybara not recognizing my :username element. Is there something that I'm missing in my code or perhaps a process that I haven't done? I'm still pretty new to coding so I could definitely be missing something relatively simple. I'm including my ApplicationController, UserController, and TweetController. Thanks in advance!

require './config/environment'

class ApplicationController < Sinatra::Base

  configure do
    set :public_folder, 'public'
    set :views, 'app/views'
    enable :sessions
    set :session_secret, 'secret'
  end

  get '/' do
    erb ':index'
  end

  helpers do 
    
    def current_user
      @user ||= User.find_by(id: session[:user_id]) if session[:user_id]
    end

    def logged_in?
      !!current_user
    end
  end
end
class UsersController < ApplicationController
    get '/users/:slug' do
        @user = User.find_by_slug(params[:slug])
        erb :"users/show"
    end

    get '/signup' do
        if !logged_in?
            erb ":users/signup"
        else
            redirect to "/tweets"
        end
    end

    post '/signup' do
        if params[:username] == "" || params[:email] == "" || params[:password] == ""
            redirect to "/signup"
        else
            @user = User.new(username: params[:username], email: params[:email], password: params[:password])
            @user.save
            session[:user_id] = @user.id
            redirect to "/tweets"
        end
    end

    get '/login' do
        if !logged_in?
            erb :"users/login"
        else
            redirect to "/tweets"
        end
    end

    post '/login' do
        a = User.find_by(username: params[:username])
        if a && a.authenticate(params[:password])
            session[:user_id] = @user
            redirect to "/tweets"
        else
            redirect to "/signup"
        end
    end

    get '/logout' do
        if logged_in?
            session.destroy
            redirect to "/login"
        else
            redirect to "/"
        end
    end
end
class TweetsController < ApplicationController
    
    get '/tweets' do
        if logged_in?
            @tweets = Tweet.all
            erb 'tweets/tweets'
        else
            redirect to '/login'
        end
    end

    get '/tweets/new' do
        if logged_in?
            erb 'tweets/create_tweet'
        else
            redirect to 'login'
        end
    end

    post '/tweets' do
        if logged_in?
            erb 'tweets/create_tweet'
        else
            redirect to '/login', 200
        end
    end

    get '/tweets/:id' do 
        if logged_in?
            @tweet = Tweet.find_by_id(params[:id])
            erb 'tweets/show_tweet'
        else
            redirect to '/login'
        end
    end

    patch '/tweets/:id' do
        @tweet = Tweet.find_by_id(params[:id])
        if !params[:content].empty?
            @tweet.update(content: params[:content])
            @tweet.save
            redirect 'tweets/#{params[:id]}'
        else
            redirect 'tweets/#{params[:id]}/edit'
        end
    end

    post '/tweets/:id/delete' do 
        @tweets = Tweet.find_by_id(params[:id])
        if current_user == @tweet.user
            @tweet.delete
            redirect to '/tweets'
        else
            redirect to '/tweets/#{params[:id]}'
        end
    end
    
end
Failure/Error: fill_in(:username, :with => "becky567")
     
     Capybara::ElementNotFound:
       Unable to find field :username that is not disabled

Test code:

describe 'index action' do
    context 'logged in' do
      it 'lets a user view the tweets index if logged in' do
        user1 = User.create(:username => "becky567", :email => "[email protected]", :password => "kittens")
        tweet1 = Tweet.create(:content => "tweeting!", :user_id => user1.id)

        user2 = User.create(:username => "silverstallion", :email => "[email protected]", :password => "horses")
        tweet2 = Tweet.create(:content => "look at this tweet", :user_id => user2.id)

        visit '/login'

        fill_in(:username, :with => "becky567")
        fill_in(:password, :with => "kittens")
        click_button 'submit'
        visit "/tweets"
        expect(page.body).to include(tweet1.content)
        expect(page.body).to include(tweet2.content)
      end
    end

Show tweets HTML:

<p><%= @tweet.content %></p>
<form action="/tweets/<%= @tweet.id %>" method="post">
    <input type="hidden" name="_method" value="delete">
    <input type="submit" value="Delete Tweet">
</form>
<a href="/tweets/<%= @tweet.id %>/edit">Edit Tweet</a>

Tweets HTML:

<h1> Welcome, <%[email protected] %></h1>
<% @tweets.each do |tweet| %>
    <p><a href="tweet/<%=tweet.id%>"><%tweets.content %></a></p>
<% end %>

Show user HTML:

<h1><%[email protected]%></h1>

<a href="/tweets/new"> New Tweet</a>
<% @user.tweets.each do |tweet|%>
<%= tweet.content %><a href="/tweets/<%=tweet.id%>/edit">EDIT</a>
<% end %>

<a href="/logout">Log Out</a>

Login HTML:

<h1>Login to Fwitter</h1>
<form action="/login" method="post">
    <label>Username: </label><input type="username" name="username">
    <label>Password: </label><input type="password" name="pasword">
    <input type="submit" value="submit">
</form>

Signup HTML:

<h1> Sign Up for Fwitter</h1>
<form action="/signup" method="post">
    <label for="username">Username</label>
    <input type="text" id="username" name="username">
    <label for="email">Email</label>
    <input type="text" id="email" name="email">
    <label for="password">Password</label>
    <input type="text" id="password" name="password">
    <button type="submit" value="submit">Sign Up</button>
</form>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文