improve chrome support, add chrome extension option, as well as project dotfile support

This commit is contained in:
John Bintz 2013-08-14 12:08:40 -04:00
parent f6bfa0cf29
commit e738bab0f4
7 changed files with 70 additions and 9 deletions

View File

@ -1,3 +1,5 @@
# Persistent Selenium
Now you can keep that precious browser window open when doing continuous integration testing. Now you can keep that precious browser window open when doing continuous integration testing.
Save seconds, and sanity, with every test re-run! Save seconds, and sanity, with every test re-run!
@ -7,7 +9,7 @@ fix your tests and/or code.
Start an instance: Start an instance:
``` bash ``` bash
persistent_selenium [ --port 9854 ] [ --browser firefox ] persistent_selenium [ --port 9854 ] [ --browser firefox ] [ --chrome-extensions <file.crx> ... ]
``` ```
Tell Capybara to use it: Tell Capybara to use it:
@ -36,11 +38,45 @@ these two differences:
The browser's cache is disabled, and cookies are reset before the next test runs, so you still get the state The browser's cache is disabled, and cookies are reset before the next test runs, so you still get the state
cleared out before your next set of tests. cleared out before your next set of tests.
### Under the hood ### .persistent_selenium
Configure everything in your app with a `.persistent_selenium` file:
``` ruby
# .persistent_selenium
PersistentSelenium.configure do |c|
c.browser = :chrome
c.chrome_extensions = %w{AngularJS-Batarang.crx}
end
```
### Chrome Extensions
If, for example, you do a lot with AngularJS and want to use [Batarang](https://chrome.google.com/webstore/detail/angularjs-batarang/ighdmehidhipcmcojjgiloacoafjmpfk?hl=en),
download the extension, put it in your project's folder somewhere, and call `persistent_selenium` with the path
to the extension:
``` bash
persistent_selenium --browser chrome --chrome-extensions AngularJS-Batarang.crx
```
## Best practice
Use it with Foreman and Guard. Start up your test suite via Guard, configure your test suite to
use persistent_selenium, and run persistent_selenium alongside it:
``` yaml
guard: guard -g wip
ps: persistent_selenium
```
It's an integral part of my [integration testing setup](http://github.com/johnbintz/bintz-integration_testing_setup).
## Under the hood
It's DRb, which mostly Just Works (tm), and has a little reshuffling of the default Capybara Selenium driver's code. It's DRb, which mostly Just Works (tm), and has a little reshuffling of the default Capybara Selenium driver's code.
#### When DRb doesn't Just Work (tm) ### When DRb doesn't Just Work (tm)
You're most likely using `all` and invoking an action on one of the nodes within, I'd wager. If you need to find a node You're most likely using `all` and invoking an action on one of the nodes within, I'd wager. If you need to find a node
to perform an action on, it's best to stick with `find`, since it's less likely that node will go out of to perform an action on, it's best to stick with `find`, since it's less likely that node will go out of

View File

@ -2,6 +2,10 @@
$: << File.expand_path('../../lib', __FILE__) $: << File.expand_path('../../lib', __FILE__)
require 'persistent_selenium'
PersistentSelenium.load_dotfile
require 'persistent_selenium/cli' require 'persistent_selenium/cli'
GC.disable GC.disable

View File

@ -3,7 +3,7 @@ require 'selenium-webdriver'
module PersistentSelenium module PersistentSelenium
class << self class << self
attr_writer :port, :browser, :timeout attr_writer :port, :browser, :timeout, :chrome_extensions
def port def port
@port ||= 9854 @port ||= 9854
@ -17,6 +17,10 @@ module PersistentSelenium
@timeout ||= 120 @timeout ||= 120
end end
def chrome_extensions
@chrome_extensions ||= []
end
def url def url
"druby://localhost:#{port}" "druby://localhost:#{port}"
end end
@ -24,5 +28,11 @@ module PersistentSelenium
def configure def configure
yield self yield self
end end
def load_dotfile(file = '.persistent_selenium')
if File.file?(file)
load file
end
end
end end
end end

View File

@ -5,7 +5,7 @@ require 'base64'
module PersistentSelenium module PersistentSelenium
class Browser < Capybara::Selenium::Driver class Browser < Capybara::Selenium::Driver
def initialize(browser_type) def initialize(browser_type)
@browser_type = browser_type @browser_type = browser_type.to_s.to_sym
@__found_elements__ = [] @__found_elements__ = []
end end
@ -20,7 +20,13 @@ module PersistentSelenium
options = { :profile => profile } options = { :profile => profile }
when :chrome when :chrome
options = { :switches => %w{--disk-cache-size=1 --media-cache-size=1} } profile = Selenium::WebDriver::Chrome::Profile.new
PersistentSelenium.chrome_extensions.each do |extension|
profile.add_extension extension
end
options = { :profile => profile, :switches => %w{--disk-cache-size=1 --media-cache-size=1} }
end end
@browser ||= Selenium::WebDriver.for(@browser_type, options) @browser ||= Selenium::WebDriver.for(@browser_type, options)

View File

@ -10,15 +10,19 @@ module PersistentSelenium
end end
desc "start", "Start the server" desc "start", "Start the server"
method_options :port => PersistentSelenium.port, :browser => PersistentSelenium.browser, :timeout => PersistentSelenium.timeout method_options :port => PersistentSelenium.port,
:browser => PersistentSelenium.browser,
:timeout => PersistentSelenium.timeout
method_option :chrome_extensions, :type => :array, :default => []
def start def start
require 'persistent_selenium/browser' require 'persistent_selenium/browser'
require 'persistent_selenium/drb' require 'persistent_selenium/drb'
PersistentSelenium.configure do |c| PersistentSelenium.configure do |c|
c.port = options[:port] c.port = options[:port]
c.browser = options[:browser] c.browser = options[:browser] if options[:browser]
c.timeout = options[:timeout] c.timeout = options[:timeout]
c.chrome_extensions = options[:chrome_extensions] if !options[:chrome_extensions].empty?
end end
puts "Starting persistent_selenium on #{PersistentSelenium.port} with #{PersistentSelenium.browser}" puts "Starting persistent_selenium on #{PersistentSelenium.port} with #{PersistentSelenium.browser}"

View File

@ -1,4 +1,5 @@
require 'persistent_selenium' require 'persistent_selenium'
require 'persistent_selenium/browser'
require 'capybara/selenium/driver' require 'capybara/selenium/driver'
# make sure these classes exist on this end # make sure these classes exist on this end

View File

@ -1,3 +1,3 @@
module PersistentSelenium module PersistentSelenium
VERSION = "0.0.2" VERSION = "0.0.3"
end end