【问题标题】:Cannot write on input field with Selenium Webdriver and Rspec无法使用 Selenium Webdriver 和 Rspec 在输入字段上写入
【发布时间】:2015-10-09 19:00:12
【问题描述】:

我还是 Selenium WD 的新手,并且通常执行远程黑盒测试。我正在尝试将电子邮件和密码值输入到各自的字段中以登录我的页面。我可以从家里导航到登录页面。但是,无论我用多少种方式编写它,控制台都会返回一个失败的测试和一个错误,说“找不到元素”。这是登录表格:

<div class="panel panel-default">
   <div class="panel-body">
      <h1>Log in</h1>

      <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
         <div class="field">
            <div class="form-field_2">&nbsp;&nbsp;
               <%= f.label :email %>&nbsp;:&nbsp;&nbsp;</div>
            <div style="width: 50%; float: left; padding: 5px" id="email">
               <%= f.email_field :email, autofocus: true %>
            </div>
         </div>
         <br/>
         <br/>
         <div class="field">
            <div class='form-field_2'>&nbsp;&nbsp;
               <%= f.label :password %>&nbsp;:&nbsp;&nbsp;</div>
            <div style="width: 50%; float: left; padding: 5px" id="password">
               <%= f.password_field :password, autocomplete: "off"%>
            </div>
         </div>
         <br/>
         <br/>
         <% if devise_mapping.rememberable? -%>
            <div class="field">
               <%= f.check_box :remember_me %>
                  <%= f.label :remember_me %>
            </div>
            <% end %>
               <br/>
               <div class="actions">
                  <div id="signin" style="text-align: center;">
                     <%= f.submit "Log in", class: "btn btn-danger", id: 'submit' %>
                  </div>
               </div>
               <% end %>
                  <br/>
                  <%= render "devise/shared/links" %>
   </div>
</div>

我的规格:

require './spec/spec_helper'
require 'selenium-webdriver'
feature "Signing in to ArtWare" do

before(:all) do
    @driver = Selenium::WebDriver.for(:chrome)
end

it 'should let user in with a valid account and password' do
    @driver.navigate.to 'https://artwear.herokuapp.com/'
    @driver.find_element(:id, "signin").click  
    fill_in "user[email]", with: "email@provider.com"
    fill_in "user[password]", with: 'asdfasdf'
    @driver.find_element(:id, "submit").click
    expect(page).to have_content('Signed in successfully.')
end

it 'should let me logout' do
    @driver.find_element(:id, "logout").click
    expect(page).to have_content('Signed out successfully.')  
end

it 'should not let use in with an invalid account' do
    @driver.find_element(:id, "signin").click  
    @driver.find_element(:id, 'user[email]').set('invalid@ainvalid.com')
    @driver.find_element(:id, "user[password]").set('asdfasdf')
    @driver.find_element(:id, "submit").click
    expect(page).to have_content("Invalid email or password")
end

it 'should not let user in with an invalid password' do
    @driver.navigate.to 'https://artwear.herokuapp.com/'
    @driver.find_element(:id, "logout").click
    @driver.find_element(:id, "signin").click  
    @driver.find_element(:id, 'user[email]').set("email@provider.com")
    @driver.find_element(:id, "password").set('incorrect')
    @driver.find_element(:id, "signin").click
    expect(page).to have_content("Invalid email or password")
end

after(:all) do
    @driver.quit
end

spec_helper:

require 'capybara/rspec'
require 'rubygems'
require 'bundler/setup'

Capybara.default_driver = :selenium
Capybara.app_host = 'http://artwear.herokuapp.com/'
Capybara.run_server = false

Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

和 Gemfile

source 'http://rubygems.org'

gem 'rake'
gem 'rspec', '~> 3.3.0'
gem 'capybara', '~> 2.5.0'
gem 'selenium-webdriver', '2.47.1'
gem 'faker', '~> 1.5.0'

这是我在 Google DevTools 中为电子邮件标签获得的输出:

<input autofocus="autofocus" type="email" value="" name="user[email]" id="user_email">

我已尝试将 selenium 调用更改为:

fill_in "user_email", with: "email@provider.com"
fill_in 'user[email]', with: "email@provider.com"
fill_in :user_email, with: "email@provider.com"
@driver.find_element(:name, "user[email]").send_keys "email@provider.com"
@driver.find_element(:name, "user[email]").set("email@provider.com")
@driver.find_element(:id, 'user_email').set("email@provider.com")

所有这些都返回相同的错误:

失败/错误:填写“user[email]”,使用:“email@provider.com” 水豚::ElementNotFound: 找不到字段“用户 [电子邮件]” 或者: 失败/错误:@driver.find_element(:id, 'user[email]').set("email@provider.com") Selenium::WebDriver::Error::NoSuchElementError: 没有这样的元素

有人能告诉我我错过了什么吗?我想我几乎浏览了我在所有 Stackoverflow 帖子中找到的每个版本。提前谢谢你。

【问题讨论】:

    标签: ruby-on-rails ruby selenium selenium-webdriver rspec


    【解决方案1】:

    我刚刚尝试过,这对我来说很好:

    @driver.find_element(:id, "user_email").send_keys("test@test.net")
    

    唯一的问题,我用的是 firefox 而不是 chrome,不确定它的行为是否不同

    【讨论】:

      【解决方案2】:

      我猜这是 Capybara 通过元素 id 而不是名称搜索的老问题。

      如果是这样,您需要确保您的输入具有识别为缺失的 id(只需检查 HTML 或查看源代码进行验证)。

      【讨论】:

      • 我尝试过同时使用名称和 ID,但都不起作用。我使用了在视图源中呈现的 id。我什至编写了自己的自定义 id 来覆盖默认值,看到它在视图源中呈现并在我的规范中调用它,但它产生了相同的结果......
      【解决方案3】:

      我不确定这是否与 OP 的问题相同,但我想提一下为我解决此问题的内容:删除 autofocus: true。我仍然不太清楚为什么会修复它,但我认为它与 selenium 和/或 chrome 有关,它与自动对焦字段的交互。

      【讨论】:

        猜你喜欢
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-07
        • 1970-01-01
        • 2013-11-22
        • 1970-01-01
        • 2017-03-04
        相关资源
        最近更新 更多