mediawiki-skins-MinervaNeue/tests/selenium
Jon Robson 05231bb254 Support extension of page actions via hook and addPortletLink
This adds support for:
mw.util.addPortletLink('p-views', '#', 'text', 'fooz',null,
  null,'#page-actions-overflow' )

and adding multiple edit icons via hooks.

Depends-On: I655097769620301143140ded1cde4c7a16879ef4
Depends-On: I401805224c0f387ac85b52b50c1f298b83c03a91
Bug: T346944
Change-Id: I3c9d59f49f1b939981a7b2b450448db6736d5958
2023-10-04 22:15:47 +00:00
..
config build: Update eslint-config-wikimedia to 0.16.0 2020-06-04 08:39:32 -07:00
features Support extension of page actions via hook and addPortletLink 2023-10-04 22:15:47 +00:00
pageobjects Remove or document remaining mw-ui-icon usages 2023-09-13 00:03:38 +00:00
specs Disable flakey test 2023-07-27 09:45:57 -07:00
.eslintrc.json build: Update eslint-config-wikimedia to 0.16.0 2020-06-04 08:39:32 -07:00
README.md selenium: Update README.md file 2021-08-16 12:23:20 +05:30
wdio.conf.cucumber.js build: Update eslint-config-wikimedia to 0.16.0 2020-06-04 08:39:32 -07:00
wdio.conf.js selenium: run tests concurrently 2022-01-05 16:44:12 +00:00

Selenium tests

For more information see https://www.mediawiki.org/wiki/Selenium

Setup

See https://www.mediawiki.org/wiki/MediaWiki-Docker/MinervaNeue

Run all specs

npm run selenium-test

Run specific tests

Filter by file name:

npm run selenium-test -- --spec tests/selenium/specs/[FILE-NAME]

Filter by file name and test name:

npm run selenium-test -- --spec tests/selenium/specs/[FILE-NAME] --mochaOpts.grep [TEST-NAME]

Migrating a test from Ruby to Node.js

Currently we are in the midst of porting our Ruby tests to Node.js. When the tests/browser/features folder is empty, we are done and the whole tests/browser folder can be removed.

This is a slow process (porting a single test can take an entire afternoon).

Step 1 - move feature file

Move the feature you want to port to Node.js

mv tests/browser/features/<name>.feature tests/selenium/features/

Example: https://gerrit.wikimedia.org/r/#/c/mediawiki/skins/MinervaNeue/+/501792/1/tests/selenium/features/editor_wikitext_saving.feature

Step 2 - add boilerplate for missing steps

Run the feature in cucumber

npm run selenium-test-cucumber -- --spec tests/selenium/features/<name>.feature

You will get warnings such as:

Step "I go to a page that has languages" is not defined. You can ignore this error by setting cucumberOpts.ignoreUndefinedDefinitions as true.

For each missing step define them as one liners inside selenium/features/step_definitions/index.js

Create functions with empty bodies for each step.

Function names should be camel case without space, for example, I go to a page that has languages becomes iGoToAPageThatHasLanguages. Each function should be imported from a step file inside the features/step_definitions folder.

Rerun the test. If done correctly this should now pass.

Example: https://gerrit.wikimedia.org/r/#/c/mediawiki/skins/MinervaNeue/+/501792/1..2

Step 3 - copy across Ruby function bodies

Copy across the body of the Ruby equivalent inside each function body in tests/browser/features/step_definitions as comments.

Example: https://gerrit.wikimedia.org/r/#/c/mediawiki/skins/MinervaNeue/+/501792/2..3

Step 4 - rewrite Ruby to Node.js

Sadly there is no shortcut here. Reuse as much as you can. Work with the knowledge that the parts you are adding will aid the next browser test migration.

The docs are your friend: http://v4.webdriver.io/api/utility/waitForVisible.html

Example: https://gerrit.wikimedia.org/r/#/c/mediawiki/skins/MinervaNeue/+/501792/2..4

Step 5 - Make it work without Cucumber

Now the tests should be passing when run the browser tests using wdio.conf.cucumber.js or npm run selenium-test-cucumber

The final step involves making these run with npm run selenium-test

This is relatively straightforward and mechanical.

  1. Copy the feature file to the specs folder
cp tests/selenium/features/editor_wikitext_saving.feature tests/selenium/specs/editor_wikitext_saving.js
  1. Convert indents to tabs
  2. Add // before any tags
  3. Replace Scenario: <name> with it( '<name>', () => {
  4. Add closing braces for all scenarios: } );
  5. Replace Feature: <feature> with describe('<feature>)', () => { and add closing brace.
  6. Replace Background: with beforeEach( () => { and add closing brace.
  7. Find and replace Given , When , And , Then with empty strings.
  8. At top of file copy and paste imports from selenium/features/step_definitions/index.js to top of your new file and rewrite their paths.
  9. Relying on autocomplete (VisualStudio Code works great) replace all the lines with the imports
  10. Drop unused imports from the file.