1 year ago

#295107

test-img

Christian Cordero

Why is Capybara unable to find my element?

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 => "starz@aol.com", :password => "kittens")
        tweet1 = Tweet.create(:content => "tweeting!", :user_id => user1.id)

        user2 = User.create(:username => "silverstallion", :email => "silver@aol.com", :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, <%=@user.username %></h1>
<% @tweets.each do |tweet| %>
    <p><a href="tweet/<%=tweet.id%>"><%tweets.content %></a></p>
<% end %>

Show user HTML:

<h1><%=@user.username%></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>

ruby

capybara

sinatra

0 Answers

Your Answer

Accepted video resources