bddfire 1.9.7 → 1.9.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/Gemfile +1 -2
- data/README.markdown +68 -37
- data/Rakefile +4 -4
- data/bddfire.gemspec +19 -16
- data/bin/bddfire +116 -106
- data/features/step_definitions/all_steps.rb +1 -4
- data/features/support/env.rb +4 -4
- data/lib/bddfire/accesibility/axe.rb +40 -0
- data/lib/bddfire/assertions/assert.rb +2 -2
- data/lib/bddfire/page-objects/HomePage.rb +7 -9
- data/lib/bddfire/require.rb +5 -4
- data/lib/bddfire/version.rb +1 -1
- data/lib/bddfire/web/browser_actions.rb +1 -1
- data/lib/bddfire/web/headless_steps.rb +9 -10
- data/lib/bddfire/web/web_methods.rb +4 -5
- data/lib/bddfire/web/web_steps.rb +3 -3
- data/lib/bddfire.rb +1 -3
- data/pre-defined-steps/accessibility_steps.md +24 -0
- data/pre-defined-steps/capybara_steps.md +1 -1
- data/scaffold/accessibility/features/01_validation.feature +6 -0
- data/scaffold/accessibility/features/02_javascript.feature +6 -0
- data/scaffold/accessibility/features/03_language.feature +9 -0
- data/scaffold/accessibility/features/04_page_titles.feature +7 -0
- data/scaffold/accessibility/features/05_main_landmark.feature +7 -0
- data/scaffold/accessibility/features/06_headings.feature +7 -0
- data/scaffold/accessibility/features/07_minimum_resizable_text.feature +8 -0
- data/scaffold/accessibility/features/08_tabindex.feature +6 -0
- data/scaffold/accessibility/features/09_focusable_controls.feature +9 -0
- data/scaffold/accessibility/features/10_color_contrast.feature +10 -0
- data/scaffold/accessibility/features/11_image.feature +10 -0
- data/scaffold/accessibility/features/12_form.feature +11 -0
- data/scaffold/accessibility/features/13_table.feature +10 -0
- data/scaffold/accessibility/features/general_accessibility_check.feature +9 -0
- data/scaffold/accessibility/features/step_definitions/base.rb +22 -0
- data/scaffold/accessibility/features/step_definitions/form.rb +0 -0
- data/scaffold/accessibility/features/step_definitions/headings.rb +7 -0
- data/scaffold/accessibility/features/step_definitions/image.rb +0 -0
- data/scaffold/accessibility/features/step_definitions/javascript.rb +3 -0
- data/scaffold/accessibility/features/step_definitions/language.rb +0 -0
- data/scaffold/accessibility/features/step_definitions/main_landmark.rb +15 -0
- data/scaffold/accessibility/features/step_definitions/minimum_resizable_text.rb +11 -0
- data/scaffold/accessibility/features/step_definitions/page_title.rb +10 -0
- data/scaffold/accessibility/features/step_definitions/tabindex.rb +3 -0
- data/scaffold/accessibility/features/step_definitions/table.rb +0 -0
- data/scaffold/accessibility/features/step_definitions/validation.rb +4 -0
- data/scaffold/accessibility/features/support/capybara.rb +42 -0
- data/scaffold/config_files/.rubocop.yml +5 -5
- data/scaffold/config_files/Dockerfile +24 -0
- data/scaffold/config_files/Gemfile +9 -5
- data/scaffold/config_files/Rakefile +36 -32
- data/scaffold/config_files/docker.sh +82 -0
- data/scaffold/features/pages/HomePage.rb +10 -10
- data/scaffold/features/support/env.rb +128 -130
- data/scaffold/features/support/hooks.rb +5 -6
- data/scaffold/load/Dockerfile +28 -0
- data/scaffold/load/README.md +31 -0
- data/scaffold/load/conf/application.conf +7 -0
- data/scaffold/load/conf/gatling.conf +157 -0
- data/scaffold/load/conf/logback.xml +22 -0
- data/scaffold/load/conf/recorder.conf +51 -0
- data/scaffold/load/docker-jenkins.sh +77 -0
- data/scaffold/load/gatling_jenkins.sh +28 -0
- data/scaffold/load/gatling_local.sh +29 -0
- data/scaffold/load/user-files/bodies/.keep +0 -0
- data/scaffold/load/user-files/data/search.csv +2 -0
- data/scaffold/load/user-files/simulations/SampleLoadTEST.scala +22 -0
- data/scaffold/rake_tasks/cucumber.rb +2 -3
- data/scaffold/rake_tasks/cuke_sniffer.rb +3 -3
- data/scaffold/rake_tasks/rspec.rb +3 -4
- data/scaffold/rake_tasks/rubocop.rb +4 -5
- data/scaffold/rake_tasks/yard.rb +3 -4
- metadata +142 -55
- data/scaffold/config_files/.ruby-version +0 -1
- data/scaffold/config_files/.travis.yml +0 -16
- data/scaffold/features/pages/Abstract.rb +0 -14
- data/scaffold/features/support/helpers.erb +0 -6
- data/scaffold/features/support/responsive.rb +0 -19
- data/scaffold/lib/project/version.erb +0 -3
- data/scaffold/lib/project.erb +0 -2
- data/scaffold/spec/spec_helper.rb +0 -8
@@ -3,20 +3,18 @@ class HomePage
|
|
3
3
|
attr_accessor :title, :title_text
|
4
4
|
end
|
5
5
|
|
6
|
-
self.title_text =
|
7
|
-
self.title =
|
6
|
+
self.title_text = 'Your Site '
|
7
|
+
self.title = 'your_css_selector'
|
8
8
|
|
9
|
-
def initialize(
|
9
|
+
def initialize(_session)
|
10
10
|
@session = Capybara.current_session
|
11
11
|
end
|
12
12
|
|
13
13
|
def visit_home_page
|
14
|
-
@session.visit(
|
14
|
+
@session.visit('your_url')
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
@home_page
|
21
|
-
@home_page.visit_home_page
|
22
|
-
=end
|
18
|
+
# You can the use these methods in the step_definitions as
|
19
|
+
# @home_page = HomePage.new(Capybara.current_session)
|
20
|
+
# @home_page.visit_home_page
|
data/lib/bddfire/require.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
Dir[File.dirname(__FILE__) + '/web/*.rb'].each {|file| require file }
|
2
|
-
Dir[File.dirname(__FILE__) + '/mobile/*.rb'].each {|file| require file }
|
3
|
-
Dir[File.dirname(__FILE__) + '/assertions/*.rb'].each {|file| require file }
|
4
|
-
Dir[File.dirname(__FILE__) + '/page-objects/*.rb'].each {|file| require file }
|
1
|
+
Dir[File.dirname(__FILE__) + '/web/*.rb'].each { |file| require file }
|
2
|
+
Dir[File.dirname(__FILE__) + '/mobile/*.rb'].each { |file| require file }
|
3
|
+
Dir[File.dirname(__FILE__) + '/assertions/*.rb'].each { |file| require file }
|
4
|
+
Dir[File.dirname(__FILE__) + '/page-objects/*.rb'].each { |file| require file }
|
5
|
+
Dir[File.dirname(__FILE__) + '/accessibility/*.rb'].each { |file| require file }
|
data/lib/bddfire/version.rb
CHANGED
@@ -10,21 +10,21 @@ Then(/^response headers should contain "(.*?)"$/) do |expected_header|
|
|
10
10
|
end
|
11
11
|
|
12
12
|
Then(/^page source should contain "(.*?)"$/) do |data|
|
13
|
-
|
14
|
-
|
13
|
+
source = page.driver.source
|
14
|
+
expect(source).to include(data)
|
15
15
|
end
|
16
16
|
|
17
17
|
When(/^I clear network traffic$/) do
|
18
|
-
|
18
|
+
page.driver.clear_network_traffic
|
19
19
|
end
|
20
20
|
|
21
21
|
When(/^I called network traffic of the page$/) do
|
22
22
|
page.driver.network_traffic.each do |request|
|
23
|
-
|
24
|
-
|
23
|
+
request.response_parts.uniq(&:url).each do |response|
|
24
|
+
puts "\n Responce URL #{response.url}: \n Status #{response.status}"
|
25
|
+
end
|
25
26
|
end
|
26
27
|
end
|
27
|
-
end
|
28
28
|
|
29
29
|
Then(/^network traffic should contains resource "(.*?)"$/) do |resource|
|
30
30
|
traffic = page.driver.network_traffic
|
@@ -35,7 +35,7 @@ When(/^I request response headers$/) do
|
|
35
35
|
puts page.response_headers.to_a
|
36
36
|
end
|
37
37
|
|
38
|
-
When(/^I request page "(.*?)" with header name "(.*?)" value "(.*?)"$/) do |url,
|
38
|
+
When(/^I request page "(.*?)" with header name "(.*?)" value "(.*?)"$/) do |url, _name, _value|
|
39
39
|
page.driver.headers = { '#{name}' => '#{value}' }
|
40
40
|
visit(url)
|
41
41
|
end
|
@@ -44,13 +44,12 @@ When(/^I set the cookie name "(.*?)" with value "(.*?)"$/) do |name, value|
|
|
44
44
|
page.driver.set_cookie(name, value)
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
47
|
Then(/^I should see the cookie "(.*?)"$/) do |cookie|
|
49
48
|
cookies = page.driver.cookies
|
50
49
|
expect(cookies).to include(cookie)
|
51
50
|
end
|
52
51
|
|
53
|
-
When(/^I removed cookie "(.*?)"$/) do |
|
52
|
+
When(/^I removed cookie "(.*?)"$/) do |_arg1|
|
54
53
|
page.driver.remove_cookie
|
55
54
|
end
|
56
55
|
|
@@ -59,6 +58,6 @@ When(/^I clear all cookies$/) do
|
|
59
58
|
end
|
60
59
|
|
61
60
|
When(/^I visit page with base authorization user "(.*?)" and password "(.*?)"$/) do |user, password|
|
62
|
-
#page.driver.headers = {'Authorization': 'Basic '+ Base64.encode64('username:password')};
|
61
|
+
# page.driver.headers = {'Authorization': 'Basic '+ Base64.encode64('username:password')};
|
63
62
|
page.driver.basic_authorize(user, password)
|
64
63
|
end
|
@@ -1,18 +1,17 @@
|
|
1
1
|
require 'net/https'
|
2
2
|
|
3
|
-
|
4
|
-
def check_valid_locator_type? type
|
3
|
+
def check_valid_locator_type?(type)
|
5
4
|
%w(id class css name xpath).include? type
|
6
5
|
end
|
7
6
|
|
8
|
-
def check_selector
|
7
|
+
def check_selector(type)
|
9
8
|
raise "Please use correct locator only id,name,css,xpath are supported - #{type}" unless check_valid_locator_type? type
|
10
9
|
end
|
11
10
|
|
12
|
-
def check_valid_option_by?
|
11
|
+
def check_valid_option_by?(option_by)
|
13
12
|
%w(text value index).include? option_by
|
14
13
|
end
|
15
14
|
|
16
|
-
def validate_option_by
|
15
|
+
def validate_option_by(option_by)
|
17
16
|
raise "Please select valid option, invalid option - #{option_by}" unless check_valid_option_by? option_by
|
18
17
|
end
|
@@ -11,11 +11,11 @@ Then(/^I should see "(.*?)"$/) do |text|
|
|
11
11
|
page.should have_content text
|
12
12
|
end
|
13
13
|
|
14
|
-
When(/^I fill "(.*?)" into field with (.+) "(.*?)"$/) do |data,
|
14
|
+
When(/^I fill "(.*?)" into field with (.+) "(.*?)"$/) do |data, _type, locator|
|
15
15
|
fill_in locator, with: data
|
16
16
|
end
|
17
17
|
|
18
|
-
When(/^I select the "(.*?)" link$/)
|
18
|
+
When(/^I select the "(.*?)" link$/) do |link|
|
19
19
|
click_link(link)
|
20
20
|
end
|
21
21
|
|
@@ -40,7 +40,7 @@ When(/^I choose radio button"(.*?)"$/) do |radiobutton|
|
|
40
40
|
end
|
41
41
|
|
42
42
|
When(/^I select option "(.*?)" from the dropdown "(.*?)"$/) do |option, dropdown|
|
43
|
-
select(option, :
|
43
|
+
select(option, from: dropdown)
|
44
44
|
end
|
45
45
|
|
46
46
|
When(/^I attach the file "(.*?)" to the field "(.*?)"$/) do |file, locator|
|
data/lib/bddfire.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Accessibility Steps
|
2
|
+
|
3
|
+
|
4
|
+
Then page should have title html attribute with meaningful text
|
5
|
+
Then there should be one instance of role=main as an attribute of an HTML element
|
6
|
+
Then There must be no instances of attributes with positive or zero values
|
7
|
+
Then the page should have exactly one h1 heading and heading order must follow
|
8
|
+
|
9
|
+
|
10
|
+
## Axe Steps
|
11
|
+
|
12
|
+
You can still use all the steps from Axe Matcher
|
13
|
+
|
14
|
+
Then the page should be accessible
|
15
|
+
Then the page should be accessible within "#selector"
|
16
|
+
Then the page should be accessible excluding "#selector"
|
17
|
+
Then the page should be accessible within "main"; excluding "aside"
|
18
|
+
Then the page should be accessible within "main" but excluding "aside"
|
19
|
+
Then the page should be accessible according to: tag-name
|
20
|
+
Then the page should be accessible within "#header"; according to: best-practice
|
21
|
+
Then the page should be accessible according to: wcag2a; checking: color-contrast
|
22
|
+
Then the page should be accessible according to: wcag2a and checking: color-contrast
|
23
|
+
Then the page should be accessible according to: wcag2a; skipping: accesskeys
|
24
|
+
Then the page should be accessible according to: wcag2a but skipping: accesskeys
|
@@ -0,0 +1,9 @@
|
|
1
|
+
@language
|
2
|
+
Feature: Specify content language
|
3
|
+
|
4
|
+
Scenario Outline: Check for other elements with lang attributes
|
5
|
+
Given I am on the page
|
6
|
+
Then page should have all relevant "<attributes>" for the accessibility guideline
|
7
|
+
Examples:
|
8
|
+
|attributes|
|
9
|
+
|html-lang |
|
@@ -0,0 +1,8 @@
|
|
1
|
+
@resize
|
2
|
+
Feature: Minimum and Re-sizable text size
|
3
|
+
|
4
|
+
Scenario: Text size is readable
|
5
|
+
Given I am on the page
|
6
|
+
Then Text must be styled with units that are resizable in all browsers.
|
7
|
+
And Content must be visible and usable with text resized to 200% of normal.
|
8
|
+
And Content must be visible and usable with page zoomed to 200% of normal.
|
@@ -0,0 +1,10 @@
|
|
1
|
+
@color_contrast
|
2
|
+
Feature: Color Contrast
|
3
|
+
|
4
|
+
Scenario Outline: Page should have valid color combinations according to BBC accessibility standards
|
5
|
+
Given I am on the page
|
6
|
+
Then page should have all relevant "<attributes>" for the accessibility guideline
|
7
|
+
Examples:
|
8
|
+
| attributes |
|
9
|
+
| accesskeys |
|
10
|
+
| color-contrast |
|
@@ -0,0 +1,11 @@
|
|
1
|
+
@forms
|
2
|
+
Feature: Form on the page
|
3
|
+
|
4
|
+
Scenario Outline: Make sure all the form elements are accessible
|
5
|
+
Given I am on the page
|
6
|
+
Then page should have all relevant "<attributes>" for the accessibility guideline
|
7
|
+
|
8
|
+
Examples:
|
9
|
+
| attributes |
|
10
|
+
| label-title-only |
|
11
|
+
|
@@ -0,0 +1,9 @@
|
|
1
|
+
@all
|
2
|
+
Feature: Accessibility Standards
|
3
|
+
|
4
|
+
|
5
|
+
Scenario: Check the page against BBC Accessibility Standards
|
6
|
+
Given I am on the page
|
7
|
+
Then the page should be accessible
|
8
|
+
And the page should be accessible according to: wcag2a
|
9
|
+
And the page should be accessible according to: wcag2aa
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'axe/cucumber/step_definitions'
|
2
|
+
|
3
|
+
Given(/^I am on the page$/) do
|
4
|
+
@page = Capybara.current_session
|
5
|
+
@page.visit(ENV['URL'])
|
6
|
+
puts "=====You are currently checking the page====="
|
7
|
+
puts @page.current_url
|
8
|
+
sleep(1)
|
9
|
+
end
|
10
|
+
|
11
|
+
Then(/^page should have all relevant "([^"]*)" for the accessibility guideline$/) do |attributes|
|
12
|
+
ban = ENV['EXCLUDE'] || "#crapy-selector"
|
13
|
+
step 'the page should be accessible checking: #{attributes} but excluding "#{ban}"'
|
14
|
+
end
|
15
|
+
|
16
|
+
Then(/^page should not check section "([^"]*)" for the accessibility guideline$/) do |section|
|
17
|
+
step 'the page should be accessible excluding "#{section}"'
|
18
|
+
end
|
19
|
+
|
20
|
+
Then(/^page should check section"([^"]*)" for the accessibility guideline$/) do |section|
|
21
|
+
step 'the page should be accessible excluding "#{section}"'
|
22
|
+
end
|
File without changes
|
@@ -0,0 +1,7 @@
|
|
1
|
+
Then(/^the page should have exactly one h(\d+) heading and heading order must follow$/) do |headings|
|
2
|
+
@page = Capybara.current_session
|
3
|
+
@page.html.should include('<h1')
|
4
|
+
@page.should have_css("h1", :count => 1)
|
5
|
+
step 'the page should be accessible checking: heading-order'
|
6
|
+
step 'the page should be accessible checking: empty-heading'
|
7
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Then(/^there should be one instance of role=main as an attribute of an HTML element$/) do
|
2
|
+
@page = Capybara.current_session
|
3
|
+
@page.html.should include('role="main"')
|
4
|
+
step 'the page should be accessible checking: area-alt'
|
5
|
+
step 'the page should be accessible checking: aria-allowed-attr'
|
6
|
+
step 'the page should be accessible checking: aria-required-attr'
|
7
|
+
step 'the page should be accessible checking: aria-required-children'
|
8
|
+
step 'the page should be accessible checking: aria-required-parent'
|
9
|
+
step 'the page should be accessible checking: aria-valid-attr-value'
|
10
|
+
step 'the page should be accessible checking: aria-roles'
|
11
|
+
step 'the page should be accessible checking: aria-valid-attr-value'
|
12
|
+
step 'the page should be accessible checking: aria-valid-attr'
|
13
|
+
step 'the page should be accessible checking: aria-roles'
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Then(/^Text must be styled with units that are resizable in all browsers\.$/) do
|
2
|
+
pending # Write code here that turns the phrase above into concrete actions
|
3
|
+
end
|
4
|
+
|
5
|
+
Then(/^Content must be visible and usable with text resized to (\d+)% of normal\.$/) do |arg1|
|
6
|
+
pending # Write code here that turns the phrase above into concrete actions
|
7
|
+
end
|
8
|
+
|
9
|
+
Then(/^Content must be visible and usable with page zoomed to (\d+)% of normal\.$/) do |arg1|
|
10
|
+
pending # Write code here that turns the phrase above into concrete actions
|
11
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Then(/^page should have title html attribute with meaningful text$/) do
|
2
|
+
@page = Capybara.current_session
|
3
|
+
title = @page.title
|
4
|
+
puts "======You page title is '#{title}'. We hope it's meaningful===="
|
5
|
+
expect(title).not_to be_empty
|
6
|
+
end
|
7
|
+
|
8
|
+
Then(/^title atttribute shouldn't reapeat the content$/) do
|
9
|
+
#to do
|
10
|
+
end
|
File without changes
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'capybara'
|
4
|
+
require 'capybara/dsl'
|
5
|
+
require 'capybara/poltergeist'
|
6
|
+
require 'axe/cucumber/step_definitions'
|
7
|
+
require 'rest-client'
|
8
|
+
require 'rspec'
|
9
|
+
require 'capybara/rspec'
|
10
|
+
require 'be_valid_asset'
|
11
|
+
include BeValidAsset
|
12
|
+
|
13
|
+
BeValidAsset::Configuration.display_invalid_content = true
|
14
|
+
|
15
|
+
|
16
|
+
url = ENV['URL']
|
17
|
+
ban = ENV['EXCLUDE'] || "#crapy-selector"
|
18
|
+
|
19
|
+
Capybara.current_driver = :poltergeist
|
20
|
+
Capybara.default_driver = :poltergeist
|
21
|
+
Capybara.configure do |config|
|
22
|
+
config.run_server = false
|
23
|
+
config.javascript_driver = config.default_driver
|
24
|
+
config.default_selector = :css
|
25
|
+
config.default_wait_time = 60
|
26
|
+
end
|
27
|
+
Capybara.register_driver :poltergeist do |app|
|
28
|
+
options = {
|
29
|
+
:js_errors => false,
|
30
|
+
:timeout => 180,
|
31
|
+
:debug => false
|
32
|
+
}
|
33
|
+
Capybara::Poltergeist::Driver.new(app, options)
|
34
|
+
end
|
35
|
+
|
36
|
+
Before do
|
37
|
+
Capybara.use_default_driver
|
38
|
+
end
|
39
|
+
|
40
|
+
After do
|
41
|
+
Capybara.reset_sessions!
|
42
|
+
end
|
@@ -8,7 +8,7 @@ AllCops:
|
|
8
8
|
- tmp/**/*
|
9
9
|
|
10
10
|
CollectionMethods:
|
11
|
-
Enabled: false
|
11
|
+
Enabled: false
|
12
12
|
|
13
13
|
Encoding:
|
14
14
|
Enabled: false
|
@@ -30,14 +30,14 @@ MethodLength:
|
|
30
30
|
Max: 20
|
31
31
|
|
32
32
|
Blocks:
|
33
|
-
Enabled: false
|
34
|
-
Enabled: false
|
33
|
+
Enabled: false
|
34
|
+
Enabled: false
|
35
35
|
|
36
36
|
AlignParameters:
|
37
37
|
Enabled: false
|
38
38
|
|
39
39
|
IfUnlessModifier:
|
40
|
-
Enabled: false
|
40
|
+
Enabled: false
|
41
41
|
|
42
|
-
|
42
|
+
TrailingCommaInLiteral:
|
43
43
|
Enabled: false
|
@@ -0,0 +1,24 @@
|
|
1
|
+
FROM ruby:latest
|
2
|
+
|
3
|
+
MAINTAINER bddfire@bddire.co.uk
|
4
|
+
|
5
|
+
ENV PHANTOM_JS="phantomjs-2.1.1-linux-x86_64"
|
6
|
+
|
7
|
+
RUN apt-get update && \
|
8
|
+
apt-get upgrade -y && \
|
9
|
+
apt-get install -y build-essential chrpath libssl-dev libxft-dev libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev && \
|
10
|
+
curl -L -O https://bitbucket.org/ariya/phantomjs/downloads/$PHANTOM_JS.tar.bz2 && \
|
11
|
+
tar xvjf $PHANTOM_JS.tar.bz2 && \
|
12
|
+
mv $PHANTOM_JS /usr/local/share && \
|
13
|
+
ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin
|
14
|
+
|
15
|
+
RUN apt-get update && apt-get install -y \
|
16
|
+
build-essential \
|
17
|
+
nodejs
|
18
|
+
|
19
|
+
RUN mkdir -p /opt/bddfire
|
20
|
+
WORKDIR /opt/bddfire
|
21
|
+
|
22
|
+
|
23
|
+
RUN gem install bundler
|
24
|
+
RUN gem install nokogiri
|
@@ -1,8 +1,8 @@
|
|
1
|
-
source
|
2
|
-
gem 'nokogiri', '1.
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
gem 'nokogiri', '1.5.9'
|
3
3
|
gem 'cucumber'
|
4
4
|
gem 'capybara'
|
5
|
-
gem 'bddfire',
|
5
|
+
gem 'bddfire', '1.9.4'
|
6
6
|
gem 'selenium-webdriver'
|
7
7
|
gem 'poltergeist'
|
8
8
|
gem 'rake'
|
@@ -14,5 +14,9 @@ gem 'json'
|
|
14
14
|
gem 'rspec'
|
15
15
|
gem 'relish'
|
16
16
|
gem 'rubocop-checkstyle_formatter'
|
17
|
-
gem
|
18
|
-
gem
|
17
|
+
gem 'parallel_tests'
|
18
|
+
gem 'axe-matchers'
|
19
|
+
gem 'site_prism'
|
20
|
+
gem 'chromedriver-helper', '0.0.6'
|
21
|
+
gem 'magic_encoding'
|
22
|
+
gem 'be_valid_asset'
|