mediawiki_selenium 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/.yardopts +1 -0
- data/README.md +43 -318
- data/RELEASES.md +353 -0
- data/features/login_helper.feature +15 -0
- data/features/rspec.feature +64 -0
- data/features/saucelabs.feature +7 -2
- data/features/screenshots.feature +21 -0
- data/features/step_definitions/browser_steps.rb +4 -0
- data/features/step_definitions/environment_steps.rb +2 -2
- data/features/step_definitions/login_helper_steps.rb +11 -0
- data/features/step_definitions/rspec_steps.rb +32 -0
- data/features/step_definitions/saucelabs_steps.rb +18 -0
- data/features/step_definitions/screenshot_steps.rb +3 -0
- data/lib/mediawiki_selenium.rb +6 -3
- data/lib/mediawiki_selenium/browser_factory/base.rb +5 -1
- data/lib/mediawiki_selenium/cucumber.rb +4 -0
- data/lib/mediawiki_selenium/{support → cucumber}/env.rb +2 -4
- data/lib/mediawiki_selenium/cucumber/hooks.rb +73 -0
- data/lib/mediawiki_selenium/cucumber/sauce.rb +22 -0
- data/lib/mediawiki_selenium/{support/modules → cucumber}/strict_pending.rb +0 -0
- data/lib/mediawiki_selenium/environment.rb +41 -20
- data/lib/mediawiki_selenium/{support/modules → helpers}/api_helper.rb +15 -0
- data/lib/mediawiki_selenium/{support/modules → helpers}/headless_helper.rb +21 -13
- data/lib/mediawiki_selenium/helpers/login_helper.rb +36 -0
- data/lib/mediawiki_selenium/helpers/screenshot_helper.rb +58 -0
- data/lib/mediawiki_selenium/{support/modules → helpers}/user_factory_helper.rb +0 -0
- data/lib/mediawiki_selenium/pages.rb +3 -0
- data/lib/mediawiki_selenium/{support/pages → pages}/login_page.rb +0 -0
- data/lib/mediawiki_selenium/{support/pages → pages}/random_page.rb +0 -0
- data/lib/mediawiki_selenium/{support/pages → pages}/reset_preferences_page.rb +0 -0
- data/lib/mediawiki_selenium/remote_browser_factory.rb +12 -3
- data/lib/mediawiki_selenium/rspec.rb +51 -0
- data/lib/mediawiki_selenium/rspec/environment.rb +36 -0
- data/lib/mediawiki_selenium/rspec/features.rb +49 -0
- data/lib/mediawiki_selenium/step_definitions/login_steps.rb +1 -3
- data/lib/mediawiki_selenium/version.rb +1 -1
- data/mediawiki_selenium.gemspec +2 -2
- data/spec/environment_spec.rb +12 -0
- data/spec/screenshot_helper_spec.rb +95 -0
- data/templates/tests/browser/features/support/env.rb +2 -1
- metadata +52 -38
- data/lib/mediawiki_selenium/support.rb +0 -4
- data/lib/mediawiki_selenium/support/hooks.rb +0 -92
- data/lib/mediawiki_selenium/support/pages.rb +0 -3
- data/lib/mediawiki_selenium/support/sauce.rb +0 -26
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: Login Helper
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I have configured my environment from `ENV` and with:
|
5
|
+
"""
|
6
|
+
user_factory: true
|
7
|
+
"""
|
8
|
+
And I have set "MEDIAWIKI_API_URL" in my shell
|
9
|
+
And I have set "MEDIAWIKI_URL" in my shell
|
10
|
+
And I am using the user factory
|
11
|
+
And I am using the login helper
|
12
|
+
|
13
|
+
Scenario: Login helper logs in in via the API
|
14
|
+
When I log in via the helper method
|
15
|
+
Then I should be logged in to the wiki
|
@@ -0,0 +1,64 @@
|
|
1
|
+
@integration
|
2
|
+
Feature: RSpec integration
|
3
|
+
|
4
|
+
As a developer, I want the option to use a test framework with less
|
5
|
+
indirection so that my tests are more straightforward to implement and
|
6
|
+
easier to reason about.
|
7
|
+
|
8
|
+
Background:
|
9
|
+
Given I have set up my `environments.yml`
|
10
|
+
And the following RSpec support file:
|
11
|
+
"""
|
12
|
+
require 'bundler/setup'
|
13
|
+
require 'mediawiki_selenium/rspec'
|
14
|
+
"""
|
15
|
+
|
16
|
+
Scenario: RSpec examples have access to the `Environment` via `#mw`
|
17
|
+
Given the following RSpec examples:
|
18
|
+
"""
|
19
|
+
describe 'my feature' do
|
20
|
+
describe 'my component' do
|
21
|
+
it 'can access `mw` to implement its tests' do
|
22
|
+
expect(mw).to be_a(MediawikiSelenium::Environment)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
"""
|
27
|
+
When I run `rspec` against my examples
|
28
|
+
Then I should see 1 passing example
|
29
|
+
|
30
|
+
Scenario: Calls to `mw` methods can be unqualified/indirect
|
31
|
+
Given the following RSpec examples:
|
32
|
+
"""
|
33
|
+
describe 'my feature' do
|
34
|
+
describe 'my component' do
|
35
|
+
it 'can call `mw` methods indirectly via `self`' do
|
36
|
+
expect(mw).to respond_to(:on_wiki)
|
37
|
+
expect(self).to respond_to(:on_wiki)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
"""
|
42
|
+
When I run `rspec` against my examples
|
43
|
+
Then I should see 1 passing example
|
44
|
+
|
45
|
+
Scenario: An alternative feature/scenario syntax is supported
|
46
|
+
Given the following RSpec examples:
|
47
|
+
"""
|
48
|
+
feature 'my feature' do
|
49
|
+
background do
|
50
|
+
# do common stuff
|
51
|
+
@stuff = 'stuff'
|
52
|
+
end
|
53
|
+
|
54
|
+
scenario 'my scenario' do
|
55
|
+
expect(@stuff).to eq('stuff')
|
56
|
+
end
|
57
|
+
|
58
|
+
scenario 'my other scenario' do
|
59
|
+
expect(@stuff).to eq('stuff')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
"""
|
63
|
+
When I run `rspec` against my examples
|
64
|
+
Then I should see 2 passing examples
|
data/features/saucelabs.feature
CHANGED
@@ -6,9 +6,14 @@ Feature: Remote browser sessions through SauceLabs
|
|
6
6
|
browser: firefox
|
7
7
|
platform: linux
|
8
8
|
"""
|
9
|
+
And I have set "SAUCE_ONDEMAND_USERNAME" in my shell
|
10
|
+
And I have set "SAUCE_ONDEMAND_ACCESS_KEY" in my shell
|
9
11
|
|
10
12
|
Scenario: SauceLabs sessions start just like a normal browser
|
11
|
-
Given I have set "SAUCE_ONDEMAND_USERNAME" in my shell
|
12
|
-
And I have set "SAUCE_ONDEMAND_ACCESS_KEY" in my shell
|
13
13
|
When I start interacting with the browser
|
14
14
|
Then the browser is open
|
15
|
+
|
16
|
+
Scenario: Failed scenarios mark SauceLabs jobs as failed
|
17
|
+
Given I have started interacting with the browser
|
18
|
+
When the scenario fails
|
19
|
+
Then the SauceLabs job should be marked as failed
|
@@ -0,0 +1,21 @@
|
|
1
|
+
@integration
|
2
|
+
Feature: Screenshots of failed scenarios
|
3
|
+
|
4
|
+
As a developer writing and running tests, it would be helpful to have a
|
5
|
+
screenshot of the browser window at the point where each scenario has
|
6
|
+
failed.
|
7
|
+
|
8
|
+
Background:
|
9
|
+
Given I have configured my environment with:
|
10
|
+
"""
|
11
|
+
screenshot_failures: true
|
12
|
+
screenshot_failures_path: tmp/screenshots
|
13
|
+
"""
|
14
|
+
And the "tmp/screenshots" directory exists
|
15
|
+
And I am using the screenshot helper
|
16
|
+
|
17
|
+
Scenario: A screenshot is taken for failed scenarios
|
18
|
+
Given the current scenario name is "Some scenario"
|
19
|
+
And I have started a browser
|
20
|
+
When the scenario fails
|
21
|
+
Then the file "tmp/screenshots/Some scenario.png" should exist
|
@@ -8,6 +8,10 @@ Given(/^I am using a local browser$/) do
|
|
8
8
|
allow(@env).to receive(:remote?).and_return(false)
|
9
9
|
end
|
10
10
|
|
11
|
+
When(/^I have started interacting with the browser$/) do
|
12
|
+
@env.browser
|
13
|
+
end
|
14
|
+
|
11
15
|
When(/^I start interacting with the browser$/) do
|
12
16
|
@env.browser
|
13
17
|
end
|
@@ -3,7 +3,7 @@ Before do
|
|
3
3
|
end
|
4
4
|
|
5
5
|
After do
|
6
|
-
@env.teardown unless @env.nil?
|
6
|
+
@env.teardown unless @env.nil? || @env_torndown
|
7
7
|
@tmp_files.each { |path| FileUtils.rm_r(path) if File.exist?(path) }
|
8
8
|
end
|
9
9
|
|
@@ -56,7 +56,7 @@ When(/^the scenario ends$/) do
|
|
56
56
|
sleep 0.3
|
57
57
|
@env.teardown(name: @scenario_name, status: @scenario_status)
|
58
58
|
ensure
|
59
|
-
@
|
59
|
+
@env_torndown = true
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Given(/^I am using the login helper$/) do
|
2
|
+
@env.extend(MediawikiSelenium::LoginHelper)
|
3
|
+
end
|
4
|
+
|
5
|
+
When(/^I log in via the helper method$/) do
|
6
|
+
@env.log_in
|
7
|
+
end
|
8
|
+
|
9
|
+
Then(/^I should be logged in to the wiki$/) do
|
10
|
+
expect(@env.browser.element(id: 'pt-logout')).to be_present
|
11
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
Given(/^I have set up my `environments\.yml`$/) do
|
5
|
+
step 'the "tmp/rspec/spec" directory exists'
|
6
|
+
File.open('tmp/rspec/environments.yml', 'w') { |io| io.write(YAML.dump({ 'default' => {} })) }
|
7
|
+
end
|
8
|
+
|
9
|
+
Given(/^the following RSpec support file:$/) do |content|
|
10
|
+
File.open('tmp/rspec/spec/spec_helper.rb', 'w') { |io| io.write(content) }
|
11
|
+
end
|
12
|
+
|
13
|
+
Given(/^the following RSpec examples:$/) do |content|
|
14
|
+
content = "require 'spec_helper'\n#{content}"
|
15
|
+
File.open('tmp/rspec/spec/examples_spec.rb', 'w') { |io| io.write(content) }
|
16
|
+
end
|
17
|
+
|
18
|
+
Given(/^$the following "(.+)" file for use with RSpec$/) do |path, content|
|
19
|
+
File.open(File.join('tmp/rspec', path), 'w') { |io| io.write(content) }
|
20
|
+
end
|
21
|
+
|
22
|
+
When(/^I run `rspec` against my examples$/) do
|
23
|
+
env = { 'MEDIAWIKI_ENVIRONMENT' => 'default' }
|
24
|
+
cmd = "'#{Gem.bin_path('bundler', 'bundle')}' exec rspec"
|
25
|
+
|
26
|
+
@rspec_output, @rspec_status = Open3.capture2e(env, cmd, chdir: 'tmp/rspec')
|
27
|
+
end
|
28
|
+
|
29
|
+
Then(/^I should see (\d+) passing examples?$/) do |n|
|
30
|
+
expect(@rspec_status).to be_success, "Examples did not pass. Output:\n---\n#{@rspec_output}---\n"
|
31
|
+
expect(@rspec_output).to match(/^#{n} examples?, 0 failures/)
|
32
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'net/https'
|
2
|
+
|
3
|
+
Then(/^the SauceLabs job should be marked as failed$/) do
|
4
|
+
job_id = @env.browser.driver.session_id
|
5
|
+
|
6
|
+
username = @env[:sauce_ondemand_username]
|
7
|
+
access_key = @env[:sauce_ondemand_access_key]
|
8
|
+
|
9
|
+
job_uri = URI.parse("https://saucelabs.com/rest/v1/#{username}/jobs/#{job_id}")
|
10
|
+
|
11
|
+
job_uri.user = username
|
12
|
+
job_uri.password = access_key
|
13
|
+
|
14
|
+
job = JSON.parse(Net::HTTP.get(job_uri))
|
15
|
+
|
16
|
+
expect(job).to include('passed')
|
17
|
+
expect(job['passed']).to be(false)
|
18
|
+
end
|
data/lib/mediawiki_selenium.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
module MediawikiSelenium
|
2
2
|
autoload :VERSION, 'mediawiki_selenium/version'
|
3
|
-
autoload :ApiHelper, 'mediawiki_selenium/
|
3
|
+
autoload :ApiHelper, 'mediawiki_selenium/helpers/api_helper'
|
4
4
|
autoload :BrowserFactory, 'mediawiki_selenium/browser_factory'
|
5
5
|
autoload :ConfigurationError, 'mediawiki_selenium/configuration_error'
|
6
6
|
autoload :Environment, 'mediawiki_selenium/environment'
|
7
|
-
autoload :HeadlessHelper, 'mediawiki_selenium/
|
7
|
+
autoload :HeadlessHelper, 'mediawiki_selenium/helpers/headless_helper'
|
8
8
|
autoload :Initializer, 'mediawiki_selenium/initializer'
|
9
|
+
autoload :LoginHelper, 'mediawiki_selenium/helpers/login_helper'
|
9
10
|
autoload :PageFactory, 'mediawiki_selenium/page_factory'
|
10
11
|
autoload :Raita, 'mediawiki_selenium/raita'
|
11
12
|
autoload :RemoteBrowserFactory, 'mediawiki_selenium/remote_browser_factory'
|
13
|
+
autoload :ScreenshotHelper, 'mediawiki_selenium/helpers/screenshot_helper'
|
14
|
+
autoload :StrictPending, 'mediawiki_selenium/cucumber/strict_pending'
|
12
15
|
autoload :UserFactory, 'mediawiki_selenium/user_factory'
|
13
|
-
autoload :UserFactoryHelper, 'mediawiki_selenium/
|
16
|
+
autoload :UserFactoryHelper, 'mediawiki_selenium/helpers/user_factory_helper'
|
14
17
|
end
|
@@ -200,8 +200,12 @@ module MediawikiSelenium
|
|
200
200
|
# @param _env [Environment] Environment.
|
201
201
|
# @param _status [Symbol] Status of the executed scenario.
|
202
202
|
#
|
203
|
+
# @return [Hash{String => String}] Artifacts.
|
204
|
+
#
|
205
|
+
# @see Environment#teardown
|
206
|
+
#
|
203
207
|
def teardown(_env, _status)
|
204
|
-
|
208
|
+
{}
|
205
209
|
end
|
206
210
|
|
207
211
|
protected
|
@@ -1,14 +1,12 @@
|
|
1
|
-
# before all
|
2
1
|
require 'bundler/setup'
|
3
2
|
require 'page-object/page_factory'
|
4
3
|
require 'watir-webdriver'
|
5
4
|
|
6
|
-
require 'mediawiki_selenium/support/modules/api_helper'
|
7
|
-
require 'mediawiki_selenium/support/modules/strict_pending'
|
8
|
-
|
9
5
|
World { MediawikiSelenium::Environment.load_default }
|
10
6
|
|
11
7
|
World(MediawikiSelenium::ApiHelper)
|
8
|
+
World(MediawikiSelenium::LoginHelper)
|
12
9
|
World(MediawikiSelenium::PageFactory)
|
10
|
+
World(MediawikiSelenium::ScreenshotHelper)
|
13
11
|
World(MediawikiSelenium::StrictPending)
|
14
12
|
World(MediawikiSelenium::UserFactoryHelper)
|
@@ -0,0 +1,73 @@
|
|
1
|
+
Before('@custom-browser') do |scenario|
|
2
|
+
@scenario = scenario
|
3
|
+
end
|
4
|
+
|
5
|
+
AfterConfiguration do |config|
|
6
|
+
# Install a formatter that can be used to show feature-related warnings
|
7
|
+
pretty_format, io = config.formats.find { |(format, _io)| format == 'pretty' }
|
8
|
+
config.formats << ['MediawikiSelenium::WarningsFormatter', io] if pretty_format
|
9
|
+
|
10
|
+
# Set up Raita logging if RAITA_DB_URL is set. Include any useful
|
11
|
+
# environment variables that Jenkins would have set.
|
12
|
+
env = MediawikiSelenium::Environment.load_default
|
13
|
+
raita_url = env.lookup(:raita_url, default: nil)
|
14
|
+
|
15
|
+
if raita_url
|
16
|
+
raita_build = MediawikiSelenium::Raita.build_from(env)
|
17
|
+
config.formats << ['MediawikiSelenium::Raita::Logger', { url: raita_url, build: raita_build }]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Determine scenario name and setup the environment
|
22
|
+
Before do |scenario|
|
23
|
+
@scenario_name =
|
24
|
+
if scenario.respond_to? :feature
|
25
|
+
"#{scenario.feature.title}: #{scenario.title}"
|
26
|
+
elsif scenario.respond_to? :scenario_outline
|
27
|
+
outline = scenario.scenario_outline
|
28
|
+
"#{outline.feature.title}: #{outline.title}: #{scenario.name}"
|
29
|
+
else
|
30
|
+
scenario.name
|
31
|
+
end
|
32
|
+
|
33
|
+
setup(name: @scenario_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Enforce a dependency check for all scenarios tagged with @extension- tags
|
37
|
+
Before do |scenario|
|
38
|
+
# Backgrounds themselves don't have tags, so get them from the feature
|
39
|
+
if scenario.is_a?(Cucumber::Ast::Background)
|
40
|
+
tag_source = scenario.feature
|
41
|
+
else
|
42
|
+
tag_source = scenario
|
43
|
+
end
|
44
|
+
|
45
|
+
tags = tag_source.source_tag_names
|
46
|
+
dependencies = tags.map { |tag| tag.match(/^@extension-(.+)$/) { |m| m[1].downcase } }.compact
|
47
|
+
missing = missing_extensions(dependencies)
|
48
|
+
|
49
|
+
if missing.any?
|
50
|
+
scenario.skip_invoke!
|
51
|
+
|
52
|
+
if scenario.feature.respond_to?(:mw_warn)
|
53
|
+
warning = "Skipped feature due to missing MediaWiki extensions: #{missing.join(", ")}"
|
54
|
+
scenario.feature.mw_warn(warning, 'missing MediaWiki extensions')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
Before do
|
60
|
+
# Create a unique random string for this scenario
|
61
|
+
@random_string = Random.new.rand.to_s
|
62
|
+
end
|
63
|
+
|
64
|
+
After do |scenario|
|
65
|
+
artifacts =
|
66
|
+
if scenario.respond_to?(:status)
|
67
|
+
teardown(name: @scenario_name, status: scenario.status)
|
68
|
+
else
|
69
|
+
teardown(name: @scenario_name)
|
70
|
+
end
|
71
|
+
|
72
|
+
artifacts.each { |path, mime_type| embed(path, mime_type) }
|
73
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'cucumber/formatter/junit'
|
2
|
+
require 'mediawiki_selenium/remote_browser_factory'
|
3
|
+
|
4
|
+
module Cucumber::Formatter
|
5
|
+
class Sauce < Junit
|
6
|
+
private
|
7
|
+
|
8
|
+
def format_exception(exception)
|
9
|
+
sids = MediawikiSelenium::RemoteBrowserFactory.last_session_ids
|
10
|
+
|
11
|
+
if sids.nil? || sids.empty?
|
12
|
+
message = 'Uh-oh. Could not find link to Sauce Labs job URL.'
|
13
|
+
else
|
14
|
+
message = sids.map { |sid| "Sauce Labs job URL: http://saucelabs.com/jobs/#{sid}\n" }.join
|
15
|
+
end
|
16
|
+
|
17
|
+
msgs = [message] + ["#{exception.message} (#{exception.class})"] + exception.backtrace
|
18
|
+
|
19
|
+
msgs.join("\n")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
File without changes
|
@@ -298,7 +298,7 @@ module MediawikiSelenium
|
|
298
298
|
# @option options [Symbol] :id Alternative ID.
|
299
299
|
# @option options [Object] :default Default if no configuration is found.
|
300
300
|
#
|
301
|
-
# @return [
|
301
|
+
# @return [Hash{Symbol => String}]
|
302
302
|
#
|
303
303
|
# @see #lookup
|
304
304
|
#
|
@@ -346,12 +346,43 @@ module MediawikiSelenium
|
|
346
346
|
RemoteBrowserFactory::REQUIRED_CONFIG.all? { |name| lookup(name, default: false) }
|
347
347
|
end
|
348
348
|
|
349
|
+
# Executes setup tasks, annotating the Selenium session with any
|
350
|
+
# configured `job_name` and `build_number`.
|
351
|
+
#
|
352
|
+
# Additional helpers may perform their own tasks by implementing this
|
353
|
+
# method.
|
354
|
+
#
|
355
|
+
# @example Setup the environment before each scenario starts
|
356
|
+
# Before do |scenario|
|
357
|
+
# setup(name: scenario.name)
|
358
|
+
# end
|
359
|
+
#
|
360
|
+
# @param info [Hash] Hash of test case information.
|
361
|
+
#
|
362
|
+
def setup(info = {})
|
363
|
+
browser_factory.configure do |options|
|
364
|
+
options[:desired_capabilities][:name] = info[:name] || 'scenario'
|
365
|
+
end
|
366
|
+
|
367
|
+
browser_factory.configure(:job_name) do |job, options|
|
368
|
+
options[:desired_capabilities][:name] += " #{job}"
|
369
|
+
end
|
370
|
+
|
371
|
+
browser_factory.configure(:build_number) do |build, options|
|
372
|
+
options[:desired_capabilities][:name] += "##{build}"
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
349
376
|
# Executes teardown tasks including instructing all browser factories to
|
350
377
|
# close any open browsers and perform their own teardown tasks.
|
351
378
|
#
|
379
|
+
# Teardown tasks may produce artifacts, which will be returned in the form
|
380
|
+
# `{ path => mime_type }`.
|
381
|
+
#
|
352
382
|
# @example Teardown environment resources after each scenario completes
|
353
383
|
# After do |scenario|
|
354
|
-
# teardown(name: scenario.name, status: scenario.status)
|
384
|
+
# artifacts = teardown(name: scenario.name, status: scenario.status)
|
385
|
+
# artifacts.each { |path, mime_type| embed(path, mime_type) }
|
355
386
|
# end
|
356
387
|
#
|
357
388
|
# @param info [Hash] Hash of test case information.
|
@@ -359,32 +390,22 @@ module MediawikiSelenium
|
|
359
390
|
# @yield [browser]
|
360
391
|
# @yieldparam browser [Watir::Browser] Browser object, before it's closed.
|
361
392
|
#
|
393
|
+
# @return [Hash{String => String}] Hash of path/mime-type artifacts.
|
394
|
+
#
|
362
395
|
def teardown(info = {})
|
396
|
+
artifacts = {}
|
397
|
+
|
363
398
|
@_factory_cache.each do |(_, browser_name), factory|
|
364
399
|
factory.each do |browser|
|
365
400
|
yield browser if block_given?
|
366
401
|
browser.close unless keep_browser_open? && browser_name != :phantomjs
|
367
402
|
end
|
368
403
|
|
369
|
-
factory.teardown(self, info[:status] || :passed)
|
404
|
+
factory_artifacts = factory.teardown(self, info[:status] || :passed)
|
405
|
+
artifacts.merge!(factory_artifacts) if factory_artifacts.is_a?(Hash)
|
370
406
|
end
|
371
|
-
end
|
372
407
|
|
373
|
-
|
374
|
-
#
|
375
|
-
# @param scenario [Cucumber::Ast::Scenario]
|
376
|
-
#
|
377
|
-
# @return [String]
|
378
|
-
#
|
379
|
-
def test_name(scenario)
|
380
|
-
if scenario.respond_to? :feature
|
381
|
-
"#{scenario.feature.title}: #{scenario.title}"
|
382
|
-
elsif scenario.respond_to? :scenario_outline
|
383
|
-
outline = scenario.scenario_outline
|
384
|
-
"#{outline.feature.title}: #{outline.title}: #{scenario.name}"
|
385
|
-
else
|
386
|
-
scenario.name
|
387
|
-
end
|
408
|
+
artifacts
|
388
409
|
end
|
389
410
|
|
390
411
|
# Returns the current value for `:mediawiki_user` or the value for the
|
@@ -416,7 +437,7 @@ module MediawikiSelenium
|
|
416
437
|
# @yield [url]
|
417
438
|
# @yieldparam url [String] Wiki URL.
|
418
439
|
#
|
419
|
-
def visit_wiki(id)
|
440
|
+
def visit_wiki(id = nil)
|
420
441
|
on_wiki(id) do |url|
|
421
442
|
browser.goto url
|
422
443
|
yield url if block_given?
|