diff --git a/app/assets/javascripts/users.js b/app/assets/javascripts/users.js
index fa203998830d6552f081c08c0bd7ed470d842231..e6c2fcc657e6062ba16df3de7e5f2eecb1b7d120 100644
--- a/app/assets/javascripts/users.js
+++ b/app/assets/javascripts/users.js
@@ -160,6 +160,8 @@
 //
 
   $(document).ready(function() {
+    $('.hidden.js-show').removeClass('hidden');
+    $('.js-show').show();
     $('#new_user').submit(prevent_default);
     $('#new_user').submit(clear_field_errors);
     $('#new_user').submit(validate_password_length);
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index f56faab0225cc4c75209e06f01fb6662fa9f200b..1b2dc5d227e1b512ae823aa0b91fc7611f487beb 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -1,7 +1,7 @@
 module UsersHelper
 
   def user_form_class(*classes)
-    (classes + ['user', 'form', (@user.new_record? ? 'new' : 'edit')]).compact.join(' ')
+    (classes + ['user', 'hidden', 'js-show', (@user.new_record? ? 'new' : 'edit')]).compact.join(' ')
   end
 
   def wrapped(item, options = {})
diff --git a/app/views/sessions/new.html.haml b/app/views/sessions/new.html.haml
index 6f3b324aa5b78d1c09f1ce54410c39957b448ae0..bb7e4bdda6e8e4228fda6e71c2be3f0bf4349a19 100644
--- a/app/views/sessions/new.html.haml
+++ b/app/views/sessions/new.html.haml
@@ -1,9 +1,9 @@
 .span1
 .span9
-  = render :partial => 'users/warnings'
   %h2=t :login
   .lead=t :login_info
-  = simple_form_for [:api, @session], :validate => true, :html => { :id => :new_session, :class => 'form-horizontal' } do |f|
+  = render :partial => 'users/warnings'
+  = simple_form_for [:api, @session], validate: true, html: { id: :new_session, class: 'form-horizontal hidden js-show', style: "display:none;" } do |f|
     = f.input :login, :required => false, :label => t(:username), :input_html => { :id => :srp_username }
     = f.input :password, :required => false, :input_html => { :id => :srp_password }
     = f.button :wrapped, value: t(:login), cancel: home_path
diff --git a/app/views/users/_warnings.html.haml b/app/views/users/_warnings.html.haml
index 79ab1032f16d24479a97dbf4eb8e824e59efaaea..baf80a4409ce86450c1928a2d8ab0912d2812135 100644
--- a/app/views/users/_warnings.html.haml
+++ b/app/views/users/_warnings.html.haml
@@ -9,4 +9,4 @@
     document.getElementById('cookie_warning').style.display = 'block';
   } else {
     document.getElementById('cookie_warning').style.display = 'none';
-  }
\ No newline at end of file
+  }
diff --git a/app/views/users/new.html.haml b/app/views/users/new.html.haml
index 3478989b8040c145250643f235d57c6bd812052a..bc36068fce91bcafe87cff0984c9929728902b27 100644
--- a/app/views/users/new.html.haml
+++ b/app/views/users/new.html.haml
@@ -1,14 +1,18 @@
 -#
--# This form is handled entirely by javascript, so take care when changing element ids.
+-# This form is handled entirely by javascript
+-# Please take care when changing element ids.
+-# 
+-# The form is hidden when no js is available 
+-# to prevent submission in the clear.
 -#
 
-- form_options = {:url => '/not-used', :html => {:id =>  'new_user', :class => user_form_class('form-horizontal')}, :validate => true}
+- form_options = {url: '/not-used', html: {id: 'new_user', class: user_form_class('form-horizontal'), style: 'display:none'}, validate: true}
 
 .span1
 .span9
-  = render :partial => 'warnings'
   %h2=t :signup
   .lead=t :signup_info
+  = render :partial => 'warnings'
   = simple_form_for(@user, form_options) do |f|
     = f.input :login, :label => t(:username), :required => false, :input_html => { :id => :srp_username }
     = f.input :password,              :required => false, :validate => true, :input_html => { :id => :srp_password }
diff --git a/test/integration/browser/account_test.rb b/test/integration/browser/account_test.rb
index 6d5f7f92f3e73fed5fe23b9c02e1a57431b3cb52..4e11520d54fe3b77a5c740a42b73a62e4c6219a7 100644
--- a/test/integration/browser/account_test.rb
+++ b/test/integration/browser/account_test.rb
@@ -123,6 +123,20 @@ class AccountTest < BrowserIntegrationTest
     assert page.has_content?("server failed")
   end
 
+  test "does not render signup form without js" do
+    Capybara.current_driver = :rack_test # no js
+    visit '/signup'
+    assert page.has_no_content?("Username")
+    assert page.has_no_content?("Password")
+  end
+
+  test "does not render login form without js" do
+    Capybara.current_driver = :rack_test # no js
+    visit '/login'
+    assert page.has_no_content?("Username")
+    assert page.has_no_content?("Password")
+  end
+
   def attempt_login(username, password)
     click_on 'Log In'
     fill_in 'Username', with: username
diff --git a/test/support/browser_integration_test.rb b/test/support/browser_integration_test.rb
index 2885c3abdecfd9ca90d559b0a4c0288ab67064b9..9cae8cb194bb70885e8bda8f42aeb85fefc91dcd 100644
--- a/test/support/browser_integration_test.rb
+++ b/test/support/browser_integration_test.rb
@@ -60,7 +60,6 @@ class BrowserIntegrationTest < ActionDispatch::IntegrationTest
   end
 
   def save_state
-    page.save_screenshot screenshot_path
     File.open(logfile_path, 'w') do |test_log|
       test_log.puts self.class.name
       test_log.puts "========================="
@@ -76,6 +75,9 @@ class BrowserIntegrationTest < ActionDispatch::IntegrationTest
       test_log.puts "------------------------"
       test_log.puts `tail log/test.log -n 200`
     end
+    page.save_screenshot screenshot_path
+  # some drivers do not support screenshots
+  rescue Capybara::NotSupportedByDriverError
   end
 
 end