From 57a753be0a7fcda5f767318f5e3e3b933eab1ef9 Mon Sep 17 00:00:00 2001 From: petschki Date: Tue, 12 Nov 2024 08:56:46 +0100 Subject: [PATCH] [fc] Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/b0732b6cfed7257fdbe1d0d71113b86769aace71 delete unused files Files changed: D Products/CMFPlone/tests/robot/common.robot D Products/CMFPlone/tests/robot/robodoc/README.rst D Products/CMFPlone/tests/robot/robodoc/TODO.rst D Products/CMFPlone/tests/robot/robodoc/anonymous.robot D Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot D Products/CMFPlone/tests/robot/robodoc/collaboration.robot D Products/CMFPlone/tests/robot/robodoc/common.robot D Products/CMFPlone/tests/robot/robodoc/config-screens.robot D Products/CMFPlone/tests/robot/robodoc/content.robot D Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot D Products/CMFPlone/tests/robot/robodoc/managing_content.robot D Products/CMFPlone/tests/robot/robodoc/personalsettings.robot D Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/af1c4e3adb3f599acbb61677a15cea24c5e9292a refactoring keywords.robot Files changed: M Products/CMFPlone/tests/robot/keywords.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/544b6df27143a1c1daa72b55ceb7ae7a95e599b2 refactoring actionmenu robot test Files changed: M Products/CMFPlone/tests/robot/test_actionmenu.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/a794eca8ea8fe10e33ba9d9fe2e2c9253f19208a refactoring controlpanel_actions robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_actions.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/a025dc1c865a12297d9eb1e6e11bfdde020fe18b refactoring controlpanel_editing robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_editing.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/2b989f5812f4bb58b989fb20e378280ffc8faa79 refactoring controlpanel_filter robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_filter.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/944d2e905845856a921c31436853182db3fab04a refactoring controlpanel_language robot tests Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_language.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/d367e6c51c26b0503accb7f91600fd566183442b refactoring controlpanel_markup robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_markup.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/6d4a74657e97ea47c88ad924ac6eb19096a45072 refactoring controlpanel_navigation robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/bd4636a5d112b76f640cb460d912a04b059c7539 refactoring controlpanel_redirection robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/c0f87a02796bf1cca390ef24e27fee25baab904e refactoring controlpanel_search robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_search.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/478e841dd41e0553181dab22d31469f1c94ebf42 refactoring controlpanel_security robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_security.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/ff14636d7c8a33d8e41302259694ba012d2cb0da refactoring controlpanel_site robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_site.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/22eb8e2012e451a5ac9fade6aba5312337cb68cf refactoring controlpanel_social robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_social.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/3ce8327ea4d1c14e36f9cc909f03195809a6b1c3 refactoring controlpanel_types robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_types.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/580f64ef956cb902bc14be0b803394e5dbd0edc5 refactoring controlpanel_usergroups robot test Files changed: M Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/fb830b0b55808c5fd8aad5acbfd1655b5696cc8b refactoring edit_user_schema robot test Files changed: M Products/CMFPlone/tests/robot/test_edit_user_schema.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/19a467e345bbf6854fd27edd46a6d4d611cb754d refactoring edit robot test Files changed: M Products/CMFPlone/tests/robot/test_edit.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/5e2e585c6798cbb1719b3da6d48edcaa55a720fd refactoring folder_contents robot test Files changed: M Products/CMFPlone/tests/robot/test_folder_contents.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/5e939df0053842de2db86ba4ce6df60ab31cf053 refactoring linkintegrity robot test Files changed: M Products/CMFPlone/tests/robot/test_linkintegrity.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/fa15014e24fa0a3b78ae5674d69ff7e5b500b3f1 refactoring livesearch robot test Files changed: M Products/CMFPlone/tests/robot/test_livesearch.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/802b570057c8bb4f49dd1d0766b510fbc185f02a refactoring overlays robot test Files changed: M Products/CMFPlone/tests/robot/test_overlays.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/a855f5408b50c496e11f7a416c679ffb422dbfd7 refactoring portlets robot test Files changed: M Products/CMFPlone/tests/robot/test_portlets.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/7de02bd2b4478934608ae8aed12a8abf6527c2a1 refactoring querystring robot test Files changed: M Products/CMFPlone/tests/robot/test_querystring.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/b3ae61814ec340f5a443900720d811546209499e refactoring tinymce robot test Files changed: M Products/CMFPlone/tests/robot/test_tinymce.robot Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> Commit: https://github.com/plone/Products.CMFPlone/commit/ae7d51e94c42cb2df767c6d310372bb7e50fb7d8 add news Files changed: A news/4056.tests Repository: Products.CMFPlone Branch: refs/heads/6.0.x Date: 2024-11-12T08:56:46+01:00 Author: Peter Mathis (petschki) Commit: https://github.com/plone/Products.CMFPlone/commit/553817e74b8cce0fdf38f949f4b850602b7267ce Merge pull request #4058 from plone/port-robot-tests-6.0.x Port robot tests 6.0.x Files changed: A news/4056.tests M Products/CMFPlone/tests/robot/keywords.robot M Products/CMFPlone/tests/robot/test_actionmenu.robot M Products/CMFPlone/tests/robot/test_controlpanel_actions.robot M Products/CMFPlone/tests/robot/test_controlpanel_editing.robot M Products/CMFPlone/tests/robot/test_controlpanel_filter.robot M Products/CMFPlone/tests/robot/test_controlpanel_language.robot M Products/CMFPlone/tests/robot/test_controlpanel_markup.robot M Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot M Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot M Products/CMFPlone/tests/robot/test_controlpanel_search.robot M Products/CMFPlone/tests/robot/test_controlpanel_security.robot M Products/CMFPlone/tests/robot/test_controlpanel_site.robot M Products/CMFPlone/tests/robot/test_controlpanel_social.robot M Products/CMFPlone/tests/robot/test_controlpanel_types.robot M Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot M Products/CMFPlone/tests/robot/test_edit.robot M Products/CMFPlone/tests/robot/test_edit_user_schema.robot M Products/CMFPlone/tests/robot/test_folder_contents.robot M Products/CMFPlone/tests/robot/test_linkintegrity.robot M Products/CMFPlone/tests/robot/test_livesearch.robot M Products/CMFPlone/tests/robot/test_overlays.robot M Products/CMFPlone/tests/robot/test_portlets.robot M Products/CMFPlone/tests/robot/test_querystring.robot M Products/CMFPlone/tests/robot/test_tinymce.robot D Products/CMFPlone/tests/robot/common.robot D Products/CMFPlone/tests/robot/robodoc/README.rst D Products/CMFPlone/tests/robot/robodoc/TODO.rst D Products/CMFPlone/tests/robot/robodoc/anonymous.robot D Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot D Products/CMFPlone/tests/robot/robodoc/collaboration.robot D Products/CMFPlone/tests/robot/robodoc/common.robot D Products/CMFPlone/tests/robot/robodoc/config-screens.robot D Products/CMFPlone/tests/robot/robodoc/content.robot D Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot D Products/CMFPlone/tests/robot/robodoc/managing_content.robot D Products/CMFPlone/tests/robot/robodoc/personalsettings.robot D Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot --- last_commit.txt | 454 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 407 insertions(+), 47 deletions(-) diff --git a/last_commit.txt b/last_commit.txt index 7f8fe292ef..98a9c40ea5 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,96 +1,456 @@ -Repository: plone.app.multilingual +Repository: Products.CMFPlone -Branch: refs/heads/7.x -Date: 2024-11-12T06:59:59+01:00 +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> -Commit: https://github.com/plone/plone.app.multilingual/commit/c4ad29b00905bd91d4bfde34f185765d3ecd99a8 +Commit: https://github.com/plone/Products.CMFPlone/commit/b0732b6cfed7257fdbe1d0d71113b86769aace71 -Update test setup +delete unused files Files changed: -M src/plone/app/multilingual/testing.py +D Products/CMFPlone/tests/robot/common.robot +D Products/CMFPlone/tests/robot/robodoc/README.rst +D Products/CMFPlone/tests/robot/robodoc/TODO.rst +D Products/CMFPlone/tests/robot/robodoc/anonymous.robot +D Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot +D Products/CMFPlone/tests/robot/robodoc/collaboration.robot +D Products/CMFPlone/tests/robot/robodoc/common.robot +D Products/CMFPlone/tests/robot/robodoc/config-screens.robot +D Products/CMFPlone/tests/robot/robodoc/content.robot +D Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot +D Products/CMFPlone/tests/robot/robodoc/managing_content.robot +D Products/CMFPlone/tests/robot/robodoc/personalsettings.robot +D Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot + +b"diff --git a/Products/CMFPlone/tests/robot/common.robot b/Products/CMFPlone/tests/robot/common.robot\ndeleted file mode 100644\nindex 33791aa6dc..0000000000\n--- a/Products/CMFPlone/tests/robot/common.robot\n+++ /dev/null\n@@ -1,69 +0,0 @@\n-*** Settings ***\n-\n-Resource plone/app/robotframework/variables.robot\n-\n-Library Remote ${PLONE_URL}/RobotRemote\n-\n-*** Variables ***\n-\n-${TEST_FOLDER} test-folder\n-\n-*** Keywords ***\n-\n-a document\n- [Arguments] ${title}\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Document\n- Given patterns are loaded\n- Execute Javascript $('#form-widgets-IDublinCore-title').val('${title}'); return 0;\n- Click Button Save\n-\n-a folder\n- [Arguments] ${title}\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Folder\n- Given patterns are loaded\n- Execute Javascript $('#form-widgets-IDublinCore-title').val('${title}'); return 0;\n- Click Button Save\n-\n-a folder '${foldername}' with a document '${documentname}'\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Folder\n- Given patterns are loaded\n- Execute Javascript $('#form-widgets-IDublinCore-title').val('${foldername}'); return 0;\n- Click Button Save\n- Go to ${PLONE_URL}/${TEST_FOLDER}/folder/edit\n- Given patterns are loaded\n- Execute Javascript $('#form-widgets-IDublinCore-title').val('${documentname}'); return 0;\n- Click Button Save\n-\n-a collection\n- [Arguments] ${title}\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Collection\n- Given patterns are loaded\n- Execute Javascript $('#form-widgets-IDublinCore-title').val('${title}'); return 0;\n- Click Button Save\n-\n-a site owner\n- Log in as site owner\n-\n-the site root\n- Go to ${PLONE_URL}\n-\n-a test folder\n- Go to ${PLONE_URL}/++add++Folder\n- Given patterns are loaded\n- Execute Javascript $('#form-widgets-IDublinCore-title').val('Test Folder'); return 0;\n- Click Button Save\n-\n-the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n-\n-there should be '${count}' livesearch results\n- Wait until keyword succeeds 5s 1s Element Should Be Visible css=div#LSResult\n- Wait until keyword succeeds 5s 1s Xpath Should Match X Times //div[@id = 'LSResult']/descendant::li ${count}\n-\n-patterns are loaded\n- Wait For Condition return !!document.querySelector('body.patterns-loaded')\n-\n-Refresh JS/CSS resources\n- # Not needed anymore, and it is breaking the Plone Zope 4 tests.\n- # Keep the keyword for backwards compatibility purposes.\n- Sleep 0.0000001\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/README.rst b/Products/CMFPlone/tests/robot/robodoc/README.rst\ndeleted file mode 100644\nindex d25585bf30..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/README.rst\n+++ /dev/null\n@@ -1,85 +0,0 @@\n-==============\n-ROBODOC README\n-==============\n-\n-The ``robodoc`` folder contains Robot Framework tests moved from the Plone documentation project.\n-Because they are designed to be run as test suite level stories (sandbox is cleared only when changing a robot file),\n-they are not integrated with zope.testrunner (``./bin/test``), but are designed to be run with Robot Framework test runner (``pybot``).\n-\n-\n-Installing Robot Framework\n-==========================\n-\n-Most tools needed to run the tests and generate the screenshots are available from within a standard Plone buildout.coredev environment.\n-The only extra piece of software needed is `webdriver` for your operating system and browser of choice, and that browser.\n-\n-Minimal buildout to generate a good enough Robot Framework test runner would look like the following:\n-\n-.. code:: ini\n-\n- [buildout]\n- extends = https://dist.plone.org/release/5-latest/versions.cfg\n- parts = robot\n-\n- [robot]\n- recipe = zc.recipe.egg\n- eggs =\n- Plone\n- Pillow\n- robotframework-selenium2screenshots\n- plone.app.robotframework [debug]\n-\n-\n-Running the tests\n-=================\n-\n-There are two possible ways to run the tests.\n-\n-The first option is to run them with a single command:\n-\n-.. code:: bash\n-\n- $ bin/pybot -v BROWSER:phantomjs src/Products.CMFPlone/Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot\n-\n-This command will 1) start up a Plone site, 2) run the defined test suite and 3) shut down the Plone site. It will take some time.\n-``-v BROWSER:phantomjs`` is optional, and will define a Robot Framework variable named ``BROWSER`` with value ``phantomjs``, effectively running the test suite using headless PhantomJS browser.\n-\n-You can run multiple test suites in the same directory,\n-\n-.. code:: bash\n-\n- $ bin/pybot -v BROWSER:phantomjs src/Products.CMFPlone/Products/CMFPlone/tests/robot/robodoc\n-\n-will run all tests and generate all screenshots.\n-\n-The second option is to first start a robot server and only then, in parallel, to execute the desired test suite:\n-\n-.. code:: bash\n-\n- $\xc2\xa0APPLY_PROFILES=plone.app.contenttypes:plone-content bin/robot-server plone.app.robotframework.PLONE_ROBOT_TESTING\n-\n-or\n-\n-.. code:: bash\n-\n- $\xc2\xa0CONFIGURE_PACKAGES=plone.app.iterate APPLY_PROFILES=plone.app.contenttypes:plone-content,plone.app.iterate:default bin/robot-server plone.app.robotframework.PLONE_ROBOT_TESTING\n-\n-and\n-\n- $ bin/pybot -v ROBOT_SERVER:True -v BROWSER:phantomjs src/Products.CMFPlone/Products/CMFPlone/tests/robot/robodoc/screenshot-tall/collaboration-advanced_control.robot\n-\n-This option will be faster for subsequent runs.\n-\n-Environment variable ``APPLY_PROFILES`` can be set to a comma separated list of Generic Setup profiles and is used by the very special test fixture ``PLONE_ROBOT_TESTING`` to prepare a Plone site with those profiles installed. There's also an another special variable ``CONFIGURE_PACKAGES`` that can be set to a comma separated list of package names (e.g. to ``plone.app.iterate``) to configure more profiles to be available for ``APPLY_PROFILES``.\n-\n-A special variable ``ROBOT_SERVER:True`` must be set for Robot Framework test runner to fix the test suite to be aware of being executed against long-running robot server.\n-\n-Screenshots for documentation\n-=============================\n-\n-The screenshots are meant for the Plone documentation.\n-\n-As there are still browser bugs, it is good to visually inspect them before they are uploaded in the repository\n-https://github.com/plone/documentation-roboshots\n-\n-In there, the tagged releases should contain known-good-sets of screenshots for a particular Plone version.\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/TODO.rst b/Products/CMFPlone/tests/robot/robodoc/TODO.rst\ndeleted file mode 100644\nindex f6136f2724..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/TODO.rst\n+++ /dev/null\n@@ -1,10 +0,0 @@\n-Browser and webdriver support\n------------------------------\n-\n-2017-07-20:\n-\n-Ubuntu 16.04:\n-\n-- Phantomjs works well, but has issues with iframes. The `working_with_tinymce.robot` tests have visual errors in the screenshots.\n-- Chrome 59 with chromedriver has issues, reportedly Chrome 60 should be better, and be able to do headless screenshots.\n-- Firefox 54 does not work with the current geckodriver software for Linux.\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/anonymous.robot b/Products/CMFPlone/tests/robot/robodoc/anonymous.robot\ndeleted file mode 100644\nindex 89cb4c1c16..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/anonymous.robot\n+++ /dev/null\n@@ -1,96 +0,0 @@\n-*** Settings ***\n-\n-Resource plone/app/robotframework/keywords.robot\n-Resource Selenium2Screenshots/keywords.robot\n-\n-Library plone.app.robotframework.Zope2Server\n-Library OperatingSystem\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-${FIXTURE} plone.app.robotframework.PLONE_ROBOT_TESTING\n-@{CONFIGURE_PACKAGES}\n-@{APPLY_PROFILES} plone.app.contenttypes:plone-content\n-@{DIMENSIONS} 1024 768\n-${ROBOT_SERVER} False\n-\n-*** Keywords ***\n-\n-Common Suite Setup\n- Run keyword if ${ROBOT_SERVER} Setup Plone keywords\n- Run keyword if ${ROBOT_SERVER} Remote ZODB setup ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} Setup Plone site ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} ZODB setup ${FIXTURE}\n-\n- ${language} = Get environment variable LANGUAGE 'en'\n- Set default language ${language}\n-\n- Open test browser\n- Run keyword and ignore error Set window size @{DIMENSIONS}\n-\n-Common Suite Teardown\n- Close all browsers\n- Run keyword if ${ROBOT_SERVER} Remote ZODB TearDown ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} ZODB TearDown ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} Teardown Plone site\n-\n-Setup Plone site\n- [Arguments] ${zope_layer_dotted_name}\n- Start Zope server ${zope_layer_dotted_name}\n- Wait until keyword succeeds 2min 0s Setup Plone keywords\n-\n-Setup Plone keywords\n- Import library Remote ${PLONE_URL}/RobotRemote\n-\n-Teardown Plone site\n- Close all browsers\n- Stop Zope server\n-\n-Highlight link\n- [Arguments] ${locator}\n- Update element style ${locator} padding 0.5em\n- Highlight ${locator}\n-\n-\n-*** Test Cases ***\n-\n-Take login link screenshot\n- Go to ${PLONE_URL}\n- Highlight link css=#personaltools-login\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/login-link.png\n- ... css=#content-header\n- ... css=#above-content-wrapper\n-\n-\n-Take login screenshot\n- Go to ${PLONE_URL}/login\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/login-popup.png\n- ... css=#content-core\n-\n-Take annotated screenshot\n- Go to ${PLONE_URL}\n- Highlight link css=#personaltools-login\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/anonymous-surfing.png\n- ... css=#content-header\n- ... css=#above-content-wrapper\n-\n- Enable autologin as Manager\n- ${user_id} = Translate user_id\n- ... default=jane-doe\n- ${user_fullname} = Translate user_fullname\n- ... default=Jane Doe\n- Create user ${user_id} Member fullname=${user_fullname}\n- Set autologin username ${user_id}\n-\n-Take logged in screenshot\n- Go to ${PLONE_URL}\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/loggedin-surfing.png\n- ... css=#above-content-wrapper\n- ... css=div.plone-toolbar-container\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot b/Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot\ndeleted file mode 100644\nindex a81141374d..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot\n+++ /dev/null\n@@ -1,44 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-@{DIMENSIONS} 1024 1200\n-\n-*** Test Cases ***\n-\n-Create sample content\n- Go to ${PLONE_URL}\n- Capture page screenshot\n-\n- ${item} = Create content type=Folder\n- ... id=documentation title=Documentation\n- ... description=Here you can find the documentation on our new product\n-\n-Show state menu\n- Go to ${PLONE_URL}/documentation\n-\n- Click link css=#plone-contentmenu-workflow a\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-workflow li.plone-toolbar-submenu-header\n-\n- Mouse over workflow-transition-advanced\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/workflow-advanced-menu.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n- Click link workflow-transition-advanced\n- Wait until element is visible\n- ... css=div.modal-content\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/workflow-advanced.png\n- ... css=div.modal-wrapper\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/collaboration.robot b/Products/CMFPlone/tests/robot/robodoc/collaboration.robot\ndeleted file mode 100644\nindex 32508a142a..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/collaboration.robot\n+++ /dev/null\n@@ -1,92 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-@{DIMENSIONS} 1280 1600\n-\n-*** Test Cases ***\n-\n-Create sample content\n- Go to ${PLONE_URL}\n-\n- ${item} = Create content type=Document\n- ... id=samplepage title=Sample Page\n- ... description=The long wait is now over\n- ... text=

Our new site is built with Plone.

\n-\n-\n-Show state menu\n- Go to ${PLONE_URL}/samplepage\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-workflow\n- Click element css=span.icon-plone-contentmenu-workflow\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-workflow li.plone-toolbar-submenu-header\n-\n- Mouse over workflow-transition-publish\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/workflow-basic.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show sendback\n- Go to ${PLONE_URL}/samplepage\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-workflow\n- Click element css=span.icon-plone-contentmenu-workflow\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-workflow li.plone-toolbar-submenu-header\n-\n- click link workflow-transition-submit\n-\n- Go to ${PLONE_URL}/samplepage\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-workflow\n- Click element css=span.icon-plone-contentmenu-workflow\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-workflow li.plone-toolbar-submenu-header\n-\n- Mouse over workflow-transition-reject\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/workflow-reject.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Create sample folder\n- Go to ${PLONE_URL}\n-\n- ${item} = Create content type=Folder\n- ... id=documentation title=Documentation\n- ... description=Here you can find the documentation on our new product\n-\n-Show sharing menu\n-\n- Go to ${PLONE_URL}/documentation\n-\n- Click link css=#contentview-local_roles a\n-\n- Wait until element is visible\n- ... css=#user-group-sharing-container\n-\n- Update element style portal-footer display none\n-\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/sharing-menu.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/common.robot b/Products/CMFPlone/tests/robot/robodoc/common.robot\ndeleted file mode 100644\nindex 7c2a33733b..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/common.robot\n+++ /dev/null\n@@ -1,55 +0,0 @@\n-*** Settings ***\n-\n-Resource plone/app/robotframework/keywords.robot\n-Resource Selenium2Screenshots/keywords.robot\n-\n-Library plone.app.robotframework.Zope2Server\n-Library OperatingSystem\n-\n-*** Variables ***\n-\n-${FIXTURE} plone.app.robotframework.PLONE_ROBOT_TESTING\n-@{CONFIGURE_PACKAGES}\n-@{APPLY_PROFILES} plone.app.contenttypes:plone-content\n-@{DIMENSIONS} 1024 768\n-${ROBOT_SERVER} False\n-\n-*** Keywords ***\n-\n-Common Suite Setup\n- Run keyword if ${ROBOT_SERVER} Setup Plone keywords\n- Run keyword if ${ROBOT_SERVER} Remote ZODB setup ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} Setup Plone site ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} ZODB setup ${FIXTURE}\n-\n- ${language} = Get environment variable LANGUAGE 'en'\n- Set default language ${language}\n-\n- Enable autologin as Manager\n- ${user_id} = Translate user_id\n- ... default=jane-doe\n- ${user_fullname} = Translate user_fullname\n- ... default=Jane Doe\n- Create user ${user_id} Member fullname=${user_fullname}\n- Set autologin username ${user_id}\n-\n- Open test browser\n- Run keyword and ignore error Set window size @{DIMENSIONS}\n-\n-Common Suite Teardown\n- Close all browsers\n- Run keyword if ${ROBOT_SERVER} Remote ZODB TearDown ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} ZODB TearDown ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} Teardown Plone site\n-\n-Setup Plone site\n- [Arguments] ${zope_layer_dotted_name}\n- Start Zope server ${zope_layer_dotted_name}\n- Wait until keyword succeeds 2min 0s Setup Plone keywords\n-\n-Setup Plone keywords\n- Import library Remote ${PLONE_URL}/RobotRemote\n-\n-Teardown Plone site\n- Close all browsers\n- Stop Zope server\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/config-screens.robot b/Products/CMFPlone/tests/robot/robodoc/config-screens.robot\ndeleted file mode 100644\nindex 8422f57999..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/config-screens.robot\n+++ /dev/null\n@@ -1,212 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-@{DIMENSIONS} 1280 1600\n-@{CONFIGURE_PACKAGES} plone.app.caching\n-@{APPLY_PROFILES} plone.app.contenttypes:plone-content plone.app.caching:default\n-\n-\n-*** Keywords ***\n-\n-Highlight field\n- [Arguments] ${locator}\n- Update element style ${locator} padding 0.5em\n- Highlight ${locator}\n-\n-*** Test Cases ***\n-\n-Show Add-ons setup screen\n- Go to ${PLONE_URL}/prefs_install_products_form\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/addon-setup.png\n- ... css=#content\n-\n-Show caching setup screen\n- Go to ${PLONE_URL}/@@caching-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/caching-setup.png\n- ... css=#content\n-\n-Show Configuration Registry screen\n- Go to ${PLONE_URL}/portal_registry\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/configuration-registry.png\n- ... css=#content\n-\n-Show Content setup screen\n- Go to ${PLONE_URL}/@@content-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/content-setup.png\n- ... css=#content\n-\n- Click element type_id\n-\n- Select From List By Label name=type_id Document\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/content-document.png\n- ... css=#content\n-\n-Show Date setup screen\n- Go to ${PLONE_URL}/@@dateandtime-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/date-setup.png\n- ... css=#content\n-\n-Show Dexterity setup screen\n- Go to ${PLONE_URL}/@@dexterity-types\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/dexterity-setup.png\n- ... css=#content\n-\n-Show Discussion setup screen\n- Go to ${PLONE_URL}/@@discussion-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/discussion-setup.png\n- ... css=#content\n-\n-Show Editing setup screen\n- Go to ${PLONE_URL}/@@editing-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/editing-setup.png\n- ... css=#content\n-\n-Show Error log setup screen\n- Go to ${PLONE_URL}/@@error-log-form\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/errorlog-setup.png\n- ... css=#content\n-\n-Show HTML filter setup screen\n- Go to ${PLONE_URL}/@@filter-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/filter-setup.png\n- ... css=#content\n-\n-Show Image handling setup screen\n- Go to ${PLONE_URL}/@@imaging-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/imaging-setup.png\n- ... css=#content\n-\n-Show Site setup overview screen\n- Go to ${PLONE_URL}/@@overview-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/site-overview.png\n- ... css=#content\n-\n-Show Language setup screen\n- Go to ${PLONE_URL}/@@language-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/language-setup.png\n- ... css=#content\n-\n- Click link autotoc-item-autotoc-1\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/language-negotiation.png\n- ... css=#content\n-\n-Show Mail setup screen\n- Go to ${PLONE_URL}/@@mail-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/mail-setup.png\n- ... css=#content\n-\n-Show ZODB maintenance setup screen\n- Go to ${PLONE_URL}/@@maintenance-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/zodb-setup.png\n- ... css=#content\n-\n-Show Markup setup screen\n- Go to ${PLONE_URL}/@@markup-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/markup-setup.png\n- ... css=#content\n-\n-Show Navigation setup screen\n- Go to ${PLONE_URL}/@@navigation-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/navigation-setup.png\n- ... css=#content\n-\n-Show Resource Registry screen\n- Go to ${PLONE_URL}/@@resourceregistry-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/resource-registry.png\n- ... css=#content\n-\n-Show Search setup screen\n- Go to ${PLONE_URL}/@@search-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/search-setup.png\n- ... css=#content\n-\n-Show Security setup screen\n- Go to ${PLONE_URL}/@@security-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/security-setup.png\n- ... css=#content\n-\n-Show Site setup screen\n- Go to ${PLONE_URL}/@@site-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/site-setup.png\n- ... css=#content\n-\n-Show socialmedia setup screen\n- Go to ${PLONE_URL}/@@social-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/social-setup.png\n- ... css=#content\n-\n-Show Syndication setup screen\n- Go to ${PLONE_URL}/@@syndication-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/syndication-setup.png\n- ... css=#content\n-\n-Show Theming setup screen\n- Go to ${PLONE_URL}/@@theming-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/theme-setup.png\n- ... css=#content\n-\n-Show Tinymce setup screen\n- Go to ${PLONE_URL}/@@tinymce-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-setup.png\n- ... css=#content\n-\n-Show Users setup screen\n- Go to ${PLONE_URL}/@@usergroup-userprefs\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/users-setup.png\n- ... css=#content\n-\n- Go to ${PLONE_URL}/@@usergroup-groupprefs\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/groups-setup.png\n- ... css=#content\n- Go to ${PLONE_URL}/@@usergroup-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/users-settings.png\n- ... css=#content\n- Go to ${PLONE_URL}/@@member-fields\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/users-fields.png\n- ... css=#content\n-\n-Changing the logo\n- Go to ${PLONE_URL}/@@site-controlpanel\n- Highlight field css=#formfield-form-widgets-site_logo\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/change-logo-in-site-control-panel.png\n- ... css=#content\n- ... css=#formfield-form-widgets-site_logo\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/content.robot b/Products/CMFPlone/tests/robot/robodoc/content.robot\ndeleted file mode 100644\nindex 891622ab6a..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/content.robot\n+++ /dev/null\n@@ -1,334 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-\n-\n-*** Test Cases ***\n-\n-Show add collection menu\n- Go to ${PLONE_URL}\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over collection\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-collections_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-\n-Select collection criteria\n- Go to ${PLONE_URL}/++add++Collection\n- Click element css=div.querystring-criteria-index a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/collection-criteria.png\n- ... css=div.select2-drop-active\n-\n-Show add new event menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over event\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-events_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new event add form\n- Page should contain element event\n- Click link event\n-\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Wait until element is visible\n- ... id=portal-footer\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-events_add-form.png\n- ... id=content\n-\n-Show add files menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over file\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-files_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new file add form\n- Page should contain element file\n- Click link file\n-\n- Wait until element is visible\n- ... css=#form-widgets-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-files_add-form.png\n- ... css=#content\n-\n-Show add new folder menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over folder\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-folders_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new folder add form\n- Page should contain element folder\n- Click link folder\n-\n- Wait until element is visible\n- ... css=#form-widgets-IDublinCore-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-folders_add-form.png\n- ... css=#content\n-\n-Show add new image menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over image\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-images_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new image edit form\n- Page should contain element image\n- Click link image\n-\n- Wait until element is visible\n- ... css=#form-widgets-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-images_add-form.png\n- ... css=#content\n-\n-*** Test Cases ***\n-\n-Show add new link menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over link\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-links_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-*** Test Cases ***\n-\n-Show new link add form\n- Page should contain element link\n- Click link link\n-\n- Wait until element is visible\n- ... css=#form-widgets-IDublinCore-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-links_add-form.png\n- ... css=#content\n-\n-Show add new content menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over document\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-content_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show add new news-item menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over news-item\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-news-items_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new news-item edit form\n- Page should contain element news-item\n- Click link news-item\n-\n- Wait until element is visible\n- ... css=#mceu_16-body\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-news-items_add-form.png\n- ... css=#content\n-\n-Show add new page menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over document\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-pages_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new page edit form\n- Page should contain element document\n- Click link document\n-\n- Wait until element is visible\n- ... css=#mceu_16-body\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-pages_add-form.png\n- ... css=#content\n-\n-Show Content restrictions\n- Go to ${PLONE_URL}/news\n-\n- Click link css=#plone-contentmenu-factories a\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over plone-contentmenu-settings\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/show-restrictions.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Menu restrictions\n- Go to ${PLONE_URL}/news/folder_constraintypes_form\n-\n- Click element form-widgets-constrain_types_mode\n-\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/menu-restrictions.png\n- ... css=#main-container\n-\n-Show basic content properties tab\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Page should contain element document\n- Click link document\n- Update element style portal-footer display none\n-\n- Wait until element is visible\n- ... css=#form-widgets-IDublinCore-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/basicpropertiestabs.png\n- ... css=nav.autotoc-nav\n-\n-Show edit page categorization\n- Click link Categorization\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/editpagecategorization.png\n- ... css=#content-core\n-\n-Show content dates settings\n- Click link Dates\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/datessettings.png\n- ... css=#content-core\n-\n-Show content ownershippanel\n- Click link Ownership\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/ownershippanel.png\n- ... css=#content-core\n-\n-Show content settingspanel\n- Click link Settings\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/settingspanel.png\n- ... css=#content-core\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot b/Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot\ndeleted file mode 100644\nindex 6677e9cb83..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot\n+++ /dev/null\n@@ -1,114 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-@{CONFIGURE_PACKAGES} plone.app.iterate\n-@{APPLY_PROFILES} plone.app.contenttypes:plone-content plone.app.iterate:default\n-# ${REGISTER_TRANSLATIONS} ${CURDIR}/../../_locales\n-\n-*** Test Cases ***\n-\n-Show how to checkout\n- Go to ${PLONE_URL}/front-page\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-actions\n- Click element css=span.icon-plone-contentmenu-actions\n- Wait until element is visible\n- ... css=#plone-contentmenu-actions li.plone-toolbar-submenu-header\n-\n- Mouse over css=#plone-contentmenu-actions-iterate_checkout\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_checkout.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show checkout notification\n- Go to ${PLONE_URL}/front-page\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-actions\n- Click element css=span.icon-plone-contentmenu-actions\n- Wait until element is visible\n- ... css=#plone-contentmenu-actions li.plone-toolbar-submenu-header\n- Click link css=#plone-contentmenu-actions-iterate_checkout\n- Wait until element is visible\n- ... name=form.button.Checkout\n- Click button name=form.button.Checkout\n- Element should be visible css=.portalMessage\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_checkout-notification.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show locked original\n- Go to ${PLONE_URL}/front-page\n-\n- Element should be visible css=#plone-lock-status\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_locked.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show check-in option\n- Go to ${PLONE_URL}/copy_of_front-page\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-actions\n- Click element css=span.icon-plone-contentmenu-actions\n- Wait until element is visible\n- ... css=#plone-contentmenu-actions li.plone-toolbar-submenu-header\n-\n- Mouse over css=#plone-contentmenu-actions-iterate_checkin\n- Update element style portal-footer display none\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_checkin.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n- Click link css=#plone-contentmenu-actions-iterate_checkin\n-\n- Element should be visible css=#checkin_message\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_checkin-form.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show cancel checkout\n- Go to ${PLONE_URL}/copy_of_front-page\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-actions\n- Click element css=span.icon-plone-contentmenu-actions\n- Wait until element is visible\n- ... css=#plone-contentmenu-actions li.plone-toolbar-submenu-header\n-\n- Mouse over css=#plone-contentmenu-actions-iterate_checkout_cancel\n- Update element style portal-footer display none\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_cancel-checkout.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n- Click link css=#plone-contentmenu-actions-iterate_checkout_cancel\n-\n- Element should be visible css=.destructive\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_cancel-checkout-form.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/managing_content.robot b/Products/CMFPlone/tests/robot/robodoc/managing_content.robot\ndeleted file mode 100644\nindex 1d5de8ccb7..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/managing_content.robot\n+++ /dev/null\n@@ -1,198 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-\n-\n-*** Test Cases ***\n-\n-Show contentrules\n- Go to ${PLONE_URL}/@@rules-controlpanel\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/contentrules-start.png\n- ... css=#content\n- ... css=div.plone-toolbar-container\n-\n-add rule\n- Go to ${PLONE_URL}/+rule/plone.ContentRule\n- Wait until element is visible\n- ... css=#formfield-form-widgets-title\n- Click element css=#form-widgets-title\n- Input text css=#form-widgets-title Send Email when any Page is Modified\n-\n- Click element css=#form-widgets-description\n- Input text css=#form-widgets-description this rule is meant for folders where new staff is having a go\n- Click element css=#formfield-form-widgets-event\n- Select From List By Label id=form-widgets-event Object modified\n-\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/contentrules-add.png\n- ... css=#content\n- Click button css=#form-buttons-save\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/contentrules-conditions.png\n- ... css=#content\n- Wait until element is visible\n- ... name=form.button.Save\n- Click button name=form.button.Save\n-\n-\n-assign rule\n- Go to ${PLONE_URL}/news\n- Click link css=#contentview-contentrules a\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/contentrules-assign.png\n- ... css=#content\n- ... css=div.plone-toolbar-container\n-\n-Edit folder\n- Go to ${PLONE_URL}\n- Click element css=#contentview-folderContents a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-cutpaste.png\n- ... css=#content\n-\n-Deleting content\n- Go to ${PLONE_URL}\n- Click element css=#contentview-folderContents a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-delete.png\n- ... css=#content\n-\n-Edit Page\n- Go to ${PLONE_URL}\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/edit-page.png\n- ... css=#content\n-\n-Foldercontents\n- Go to ${PLONE_URL}\n- Click element css=#contentview-folderContents a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents.png\n- ... css=#content\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-columns.png\n- ... css=#btn-attribute-columns\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-selected.png\n- ... css=#btn-selected-items\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-rearrange.png\n- ... css=#btn-rearrange\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-rearrange.png\n- ... css=#btn-rearrange\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-upload.png\n- ... css=#btn-upload\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-cut.png\n- ... css=#btn-cut\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-copy.png\n- ... css=#btn-copy\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-paste.png\n- ... css=#btn-paste\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-delete.png\n- ... css=#btn-delete\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-rename.png\n- ... css=#btn-rename\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-tags.png\n- ... css=#btn-tags\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-state.png\n- ... css=#btn-workflow\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-properties.png\n- ... css=#btn-properties\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-searchbox.png\n- ... css=#filter\n-\n-Show display menu\n- Go to ${PLONE_URL}\n-\n- Click link css=#plone-contentmenu-display a\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-display li.plone-toolbar-submenu-header\n-\n-\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/display-menu.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Reordering\n- Go to ${PLONE_URL}\n- Click element css=#contentview-folderContents a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-reorder.png\n- ... css=#content\n-\n-Create sample content for history\n- Go to ${PLONE_URL}\n-\n- ${item} = Create content type=Document\n- ... id=samplepage title=Sample Page\n- ... description=The long wait is now over\n- ... text=

Our new site is built with Plone.

\n- Fire transition ${item} publish\n-\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Click element css=#form-widgets-IDublinCore-title\n- Input text css=#form-widgets-IDublinCore-title Hurray\n- Click element css=#form-widgets-IVersionable-changeNote\n- Input text css=#form-widgets-IVersionable-changeNote Title should be Hurray, not Sample Page.\n- Click button css=#form-buttons-save\n-\n-Show history\n- Go to ${PLONE_URL}/samplepage\n- Click link css=#contentview-history a\n- Wait until element is visible\n- ... css=#history-list\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/content-history.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show portlet management\n- Go to ${PLONE_URL}\n- Click link css=#plone-contentmenu-portletmanager a\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-portletmanager li.plone-toolbar-submenu-header\n-\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/portlet-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#content-header\n-\n-Show right portlets\n- Go to ${PLONE_URL}/@@topbar-manage-portlets/plone.footerportlets\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/portlet-footer.png\n- ... css=#content\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/personalsettings.robot b/Products/CMFPlone/tests/robot/robodoc/personalsettings.robot\ndeleted file mode 100644\nindex 7c1edf71a8..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/personalsettings.robot\n+++ /dev/null\n@@ -1,45 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Test Cases ***\n-\n-Show menubar\n- Go to ${PLONE_URL}\n-\n- Click link css=#portal-personaltools a\n-\n- Wait until element is visible\n- ... css=#portal-personaltools li.plone-toolbar-submenu-header\n-\n- Mouse over personaltools-preferences\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/show-preferences.png\n- ... css=div.plone-toolbar-container\n- ... css=li.plone-toolbar-submenu-header\n-\n-Show personal preferences\n- Go to ${PLONE_URL}/@@personal-preferences\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/personal-preferences.png\n- ... css=#main-container\n-\n-Show personal information\n- Go to ${PLONE_URL}/@@personal-information\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/personal-information.png\n- ... css=#main-container\n-\n-Show changing password\n- Go to ${PLONE_URL}/@@change-password\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/change-password.png\n- ... css=#main-container\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot b/Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot\ndeleted file mode 100644\nindex 296ba742c0..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot\n+++ /dev/null\n@@ -1,79 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-\n-*** Test Cases ***\n-\n-Create sample content\n- Go to ${PLONE_URL}\n-\n- ${item} = Create content type=Document\n- ... id=samplepage title=Sample Page\n- ... description=The long wait is now over\n- ... text=

Our new site is built with Plone.

\n-\n-\n-Show TinyMCE\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Click element css=#mceu_2-open\n- Click element css=#mceu_2-open\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce.png\n- ... css=#mceu_16\n-\n-Show TinyMCE image\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-imgbutton.png\n- ... css=#mceu_15\n-\n- Click element css=#mceu_15 button\n- Wait until element is visible\n- ... css=h2.modal-title\n- Wait until element is visible\n- ... css=div.common-controls\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-imgdialog.png\n- ... css=div.outer-wrapper\n- ... css=div.modal-content\n-\n-Show TinyMCE insert links\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-linkbutton.png\n- ... css=#mceu_14\n-\n- Click element css=#mceu_14 button\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-linkdialog.png\n- ... css=div.outer-wrapper\n- ... css=div.modal-content\n-\n-Show TinyMCE insert tables\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n-\n- Click element css=#mceu_22-open\n- Click element css=#mceu_42-text\n- Wait until element is visible\n- ... css=#mceu_42-text\n- Mouse over css=#mceu_42-text\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-table.png\n- ... css=div.outer-wrappper\n\\ No newline at end of file\n" + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/af1c4e3adb3f599acbb61677a15cea24c5e9292a + +refactoring keywords.robot + +Files changed: +M Products/CMFPlone/tests/robot/keywords.robot + +b'diff --git a/Products/CMFPlone/tests/robot/keywords.robot b/Products/CMFPlone/tests/robot/keywords.robot\nindex ca0c598c4b..7e7254ee5d 100644\n--- a/Products/CMFPlone/tests/robot/keywords.robot\n+++ b/Products/CMFPlone/tests/robot/keywords.robot\n@@ -1,39 +1,115 @@\n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- SETUP ------------------------------------------------------------------\n+# SETUP\n \n Refresh JS/CSS resources\n # Not needed anymore, and it is breaking the Plone Zope 4 tests.\n # Keep the keyword for backwards compatibility purposes.\n Sleep 0.0000001\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n+\n+a logged-in manager\n+ Enable autologin as\n+ ... Manager\n+\n+a logged-in member\n+ Enable autologin as\n+ ... Member\n \n a logged-in site administrator\n- Enable autologin as Site Administrator Contributor Reviewer\n+ Enable autologin as\n+ ... Site Administrator\n+ ... Contributor\n+ ... Reviewer\n+\n \n a document \'${title}\'\n- Create content type=Document id=doc title=${title}\n+ Create content\n+ ... type=Document\n+ ... id=doc\n+ ... title=${title}\n \n a file \'${title}\'\n- Create content type=File id=file title=${title}\n+ Create content\n+ ... type=File\n+ ... id=file\n+ ... title=${title}\n \n a news item \'${title}\'\n- Create content type=News Item id=doc title=${title}\n+ Create content\n+ ... type=News Item\n+ ... id=doc\n+ ... title=${title}\n \n an image \'${title}\'\n- Create content type=Image id=doc title=${title}\n+ Create content\n+ ... type=Image\n+ ... id=doc\n+ ... title=${title}\n \n a folder \'${title}\'\n- Create content type=Folder title=${title}\n-\n-patterns are loaded\n- Wait For Condition return !!document.querySelector(\'body.patterns-loaded\')\n+ Create content\n+ ... type=Folder\n+ ... title=${title}\n \n a folder with a document \'${title}\'\n- ${folder_uid}= Create content type=Folder title=folder\n- Create content type=Document container=${folder_uid} title=${title}\n+ ${folder_uid}= Create content type=Folder title=folder\n+ Create content\n+ ... type=Document\n+ ... container=${folder_uid}\n+ ... title=${title}\n+\n+Remove line from textarea\n+ [Arguments] ${fieldName} ${value}\n+\n+ Import library String\n+ ${lines}= Get Text //textarea[@name="${fieldName}"]\n+ ${lines}= Remove String ${lines} ${value}\\n\n+ Type Text //textarea[@name="${fieldName}"] ${lines}\n+\n+\n+Click item in contenbrowser column\n+ [arguments] ${colnumber} ${itemposition}\n+ Wait For Condition Element States //div[contains(@class, "content-browser-wrapper")]//div[contains(@class, "levelColumns")]/div[${colnumber}]/div[contains(@class, "levelItems")]/div[${itemposition}] contains visible\n+ Click //div[contains(@class, "content-browser-wrapper")]//div[contains(@class, "levelColumns")]/div[${colnumber}]/div[contains(@class, "levelItems")]/div[${itemposition}]\n+\n+\n+Fill text to tinymce editor\n+ [Arguments] ${text}\n+\n+ Wait For Condition Classes //body contains patterns-loaded\n+\n+ ${old} = Set Selector Prefix //div[contains(@class, "tox-edit-area")]//iframe >>>\n+ Wait for Condition Element States //body contains visible\n+ Type Text //body ${text}\n+ Wait for Condition Text //body != ""\n+ Set Selector Prefix ${old}\n+\n+Fill source code to tinymce editor\n+ [Arguments] ${source_code}\n+\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Wait For Condition Element States //div[contains(@class,"tox-tinymce") and @role="application"] contains visible\n+ Wait for Condition Element States //div[contains(@class, "tox-edit-area")]//iframe >>> body contains visible\n+\n+ # Click the View menu button\n+ Click //span[contains(@class,"tox-mbtn__select-label") and contains(text(),"View")]/parent::button\n+ Wait for Condition Element States //div[@class="tox-collection__group"] contains visible\n+\n+ # Click the Source code menu button\n+ Click //div[@class="tox-collection__item-label" and contains(text(),"Source code")]/parent::div\n+\n+ # Open dialog for source code insert\n+ ${textarea}= Get Element //textarea[@class="tox-textarea"]\n+ Wait for Condition Element States ${textarea} contains visible\n+ Type Text ${textarea} ${source_code}\n+ # Save\n+ Click //button[@class="tox-button" and contains(text(),"Save")]\n+\n+ Wait for Condition Text //div[contains(@class, "tox-edit-area")]//iframe >>> body != ""\n+\n \n-folder contents pattern loaded\n- Page should contain element css=.pat-structure\n- Wait For Condition return !!document.querySelector(\'.pat-structure div.navbar\')\n+Pause\n+ Import library Dialogs\n+ Pause execution\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/544b6df27143a1c1daa72b55ceb7ae7a95e599b2 + +refactoring actionmenu robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_actionmenu.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_actionmenu.robot b/Products/CMFPlone/tests/robot/test_actionmenu.robot\nindex 58539cb3ec..27a4bd10c2 100644\n--- a/Products/CMFPlone/tests/robot/test_actionmenu.robot\n+++ b/Products/CMFPlone/tests/robot/test_actionmenu.robot\n@@ -1,24 +1,21 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n+*** Variables ***\n \n-*** Variables ****************************************************************\n+${TITLE} An actionsmenu page\n+${PAGE_ID} an-actionsmenu-page\n \n-${TITLE} An actionsmenu page\n-${PAGE_ID} an-actionsmenu-page\n \n-\n-*** Test cases ***************************************************************\n+*** Test Cases ***\n \n # ---\n # Basic Contentactions menu\n@@ -41,13 +38,13 @@ Scenario: Clicking again collapses action menu\n and an actionsmenu page\n When menu link is clicked\n and menu link is clicked\n+ Then actions menu should not be visible\n \n # ---\n # Switching Contentactions menu by MouseOver\n # ---\n \n-Scenario: Hovering mouse from expanded menu on other menu shows that menu\n- Pass Execution This functionality needs to be fixed for Plone 5, but let\'s not make it break the build for now.\n+Scenario: Click from expanded menu on other menu shows that menu\n Given a logged-in site administrator\n and an actionsmenu page\n When first menu link is clicked\n@@ -88,95 +85,78 @@ Scenario:\n Then I should see \'Item(s) pasted.\' in the page\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n an actionsmenu page\n- Create content type=Document title=${TITLE}\n- Go to ${PLONE_URL}/${PAGE_ID}\n- Wait until page contains An actionsmenu page\n+ Create content type=Document title=${TITLE}\n+ Go To ${PLONE_URL}/${PAGE_ID}\n+ Get Text //body contains An actionsmenu page\n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n+\n+first menu link is clicked\n+ Click xpath=//li[@id=\'plone-contentmenu-workflow\']/a\n \n mouse moves to second menu\n- Click Link xpath=(//div[@class="contentActions"]//a[contains(@class, \'actionMenuHeader\')])[2]\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']/a\n \n I click outside of menu\n- Click Element xpath=//h1\n+ Click xpath=//h1\n \n workflow link is clicked\n # store current state\n- ${OLD_STATE} = Get Text xpath=(//span[contains(@class,\'state-\')])\n- Set Suite Variable ${OLD_STATE} ${OLD_STATE}\n- Given patterns are loaded\n- Click Link xpath=//li[@id=\'plone-contentmenu-workflow\']/a\n- Click Link xpath=(//li[@id=\'plone-contentmenu-workflow\']/ul/li/a)[1]\n- Page Should Contain Item state changed.\n-\n-Open Menu\n- [Arguments] ${elementId}\n- Element Should Not Be Visible css=#${elementId} ul.actionMenuContent\n- Click link css=#${elementId} a.actionMenuHeader\n- Wait until keyword succeeds 5 1 Element Should Be Visible css=#${elementId} .actionMenuContent\n-\n-Open Action Menu\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-actions\']/a\n- Wait until keyword succeeds 5 1 Element Should Be Visible css=#plone-contentmenu-actions .dropdown-menu\n+ ${OLD_STATE}= Get Text xpath=(//span[contains(@class,\'state-\')])\n+ Set Suite Variable ${OLD_STATE} ${OLD_STATE}\n+ Click xpath=//li[@id=\'plone-contentmenu-workflow\']/a\n+ Click xpath=(//li[@id=\'plone-contentmenu-workflow\']/ul/li/a)[1]\n+ Get Text //body contains Item state changed.\n \n I copy the page\n Open Action Menu\n- Click Link css=#plone-contentmenu-actions .actionicon-object_buttons-copy\n- Page should contain copied\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']//a[contains(@class,\'actionicon-object_buttons-copy\')]\n+ Get Text //body contains copied\n \n I paste\n Go to ${PLONE_URL}\n Open Action Menu\n- Click Link css=#plone-contentmenu-actions .actionicon-object_buttons-paste\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']//a[contains(@class,\'actionicon-object_buttons-paste\')]\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n delete link exists\n- Page Should Contain Element xpath=//a[@id=\'plone-contentmenu-actions-delete\']\n+ Get Element Count xpath=//a[@id=\'plone-contentmenu-actions-delete\'] should be 1\n \n delete link should not be visible\n- Element Should Not Be Visible xpath=//div[@class=\'contentActions\']//a[@id=\'plone-contentmenu-actions-delete\']\n+ Wait For Elements State xpath=//li[@id=\'plone-contentmenu-actions\']/a[@id=\'plone-contentmenu-actions-delete\'] hidden\n \n menu link is clicked\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-actions\']/a\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']/a\n \n-delete link should be visible\n- Given patterns are loaded\n- Element Should Be Visible xpath=//div[@class=\'contentActions\']//a[@id=\'plone-contentmenu-actions-delete\']\n+second menu should be visible\n+ Get Element States xpath=//li[@id=\'plone-contentmenu-actions\']/ul[contains(@class,\'dropdown-menu\')] contains visible\n \n-actions menu should be visible\n- Given patterns are loaded\n- Element Should Be Visible xpath=//li[@id=\'plone-contentmenu-actions\']\n+first menu should not be visible\n+ Get Element States xpath=//li[@id=\'plone-contentmenu-workflow\']/ul[contains(@class,\'dropdown-menu\')] contains hidden\n \n-first menu link is clicked\n- Given patterns are loaded\n- Click Link xpath=(//div[@class="contentActions"]//a[contains(@class, \'actionMenuHeader\')])[1]\n+actions menu should not be visible\n+ Get Element States xpath=//li[@id=\'plone-contentmenu-actions\']/ul[contains(@class,\'dropdown-menu\')] contains hidden\n \n-I should see \'${message}\' in the page\n- Wait until page contains ${message}\n- Page should contain ${message}\n+actions menu should be visible\n+ Get Element States xpath=//li[@id=\'plone-contentmenu-actions\']/ul[contains(@class,\'dropdown-menu\')] contains visible\n \n state should have changed\n- Wait until page contains Item state changed\n- ${NEW_STATE} = Get Text xpath=(//span[contains(@class,\'state-\')])\n- # Should Not Be Equal ${NEW_STATE} ${OLD_STATE}\n+ ${NEW_STATE}= Get Text xpath=(//span[contains(@class,\'state-\')])\n+ Should Not Be Equal As Strings ${NEW_STATE} ${OLD_STATE}\n \n-second menu should be visible\n- Element Should Be Visible xpath=(//li[contains(@class, \'actionMenu\')])[2]\n+I should see \'${message}\' in the page\n+ Get Text //body contains ${message}\n \n-first menu should not be visible\n- Given patterns are loaded\n- Wait until keyword succeeds 10s 1s Element Should Not Be Visible xpath=(//li[contains(@class, \'actionMenu\')])[1]//li\n \n-actions menu should not be visible\n- Given patterns are loaded\n- Wait until keyword succeeds 10s 1s Element Should Not Be Visible xpath=//li[@id=\'plone-contentmenu-actions-delete\']\n+# DRY\n \n+Open Action Menu\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']/a\n+ actions menu should be visible\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/a794eca8ea8fe10e33ba9d9fe2e2c9253f19208a + +refactoring controlpanel_actions robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_actions.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_actions.robot b/Products/CMFPlone/tests/robot/test_controlpanel_actions.robot\nindex 8bb0a2513c..a297bb9521 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_actions.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_actions.robot\n@@ -1,137 +1,139 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n \n+*** Test Cases ***\n \n-*** Test Cases ***************************************************************\n+# hint: the `Sleep` Statement is needed for the `Disable autologin` and the commit in the DB, it takes a while\n \n Scenario: Modify an existing action in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I modify an action title\n- Sleep 1\n- Then anonymous users can see the new action title\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I modify an action title\n+ and Sleep 1\n+ Then anonymous users can see the new action title\n \n Scenario: Reorder in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I change the actions order\n- Sleep 1\n- Then anonymous users can see the actions new ordering\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I change the actions order\n+ and Sleep 1\n+ Then anonymous users can see the actions new ordering\n \n Scenario: Create a new action in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I add a new action\n- Sleep 1\n- Then logged-in users can see the new action\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I add a new action\n+ and Sleep 1\n+ Then logged-in users can see the new action\n \n Scenario: Hide/show an action in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I hide an action\n- Sleep 1\n- Then anonymous users cannot see the action anymore\n- Given a logged-in administrator\n- and the actions control panel\n- When I unhide the action\n- Sleep 1\n- Then anonymous users can see the action again\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I hide an action\n+ and Sleep 1\n+ Then anonymous users cannot see the action anymore\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I unhide the action\n+ and Sleep 1\n+ Then anonymous users can see the action again\n \n Scenario: Delete an action in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I delete an action\n- Sleep 1\n- Then anonymous users cannot see the action anymore\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I delete an action\n+ and Sleep 1\n+ Then anonymous users cannot see the action anymore\n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n-\n-a logged-in administrator\n- Enable autologin as Manager\n+# GIVEN\n \n the actions control panel\n- Go to ${PLONE_URL}/@@actions-controlpanel\n- Wait until page contains Portal actions\n+ Go to ${PLONE_URL}/@@actions-controlpanel\n+ Get Text //body contains Portal actions\n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I modify an action title\n- Click Link css=section:nth-child(3) li:first-child a\n- Wait until page contains Action Settings\n- Input Text for sure form.widgets.title A new site map\n- Wait For Then Click Element css=.pattern-modal-buttons > button\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/a\n+ Wait For Condition Text //body contains Action Settings\n+ Type Text //input[@name="form.widgets.title"] A new site map\n+ Click //div[contains(@class,\'pattern-modal-buttons\')]/button\n+\n \n I change the actions order\n- Click Link css=section:nth-child(3) li:first-child a\n- Wait until page contains Action Settings\n- Input Text for sure form.widgets.position 3\n- Wait For Then Click Element css=.pattern-modal-buttons > button\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/a\n+ Wait For Condition Text //body contains Action Settings\n+ Type Text //input[@name="form.widgets.position"] 3\n+ Click //div[contains(@class,\'pattern-modal-buttons\')]/button\n+\n \n I add a new action\n- Click Link Add new action\n- Wait until page contains New action\n- Select From List By Label form.widgets.category:list User actions\n- Input Text for sure form.widgets.id favorites\n- Wait For Then Click Element css=.pattern-modal-buttons > button\n- Wait until page contains favorites\n- Wait For Then Click Element css=section.category:last-child li:last-child a\n- Wait until page contains Action Settings\n- Input Text for sure form.widgets.title My favorites\n- Input Text for sure form.widgets.url_expr string:\\${globals_view/navigationRootUrl}/favorites\n- Wait For Then Click Element css=.pattern-modal-buttons > button\n+ Click //*[@id="content-core"]/p[@class="addAction"]/a\n+ Wait For Condition Text //body contains New action\n+ Select Options By //select[@name="form.widgets.category:list"] label User actions\n+ Type Text //input[@name="form.widgets.id"] favorites\n+ Click //div[contains(@class,\'pattern-modal-buttons\')]/button\n+ Wait For Condition Text //body contains favorites\n+ Click //*[@id="content-core"]/section[6]/section/ol/li[9]/form/a\n+ Wait For Condition Text //body contains Action Settings\n+ Type Text //input[@name="form.widgets.title"] My favorites\n+ Type Text //input[@name="form.widgets.url_expr"] string:\\${globals_view/navigationRootUrl}/favorites\n+ Click //div[contains(@class,\'pattern-modal-buttons\')]/button\n \n-I delete an action\n- Click Button css=section:nth-child(3) li:first-child button[name=delete]\n- Handle alert\n \n I hide an action\n- Click Button css=section:nth-child(3) li:first-child button[name=hide]\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/button[@name="hide"]\n+\n \n I unhide the action\n- Click Button css=section:nth-child(3) li:first-child button[name=show]\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/button[@name="show"]\n+\n \n-# --- THEN -------------------------------------------------------------------\n+I delete an action\n+ Handle Future Dialogs action=accept\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/button[@name="delete"]\n+\n+\n+# THEN\n \n anonymous users can see the new action title\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Contain A new site map\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Text //body contains A new site map\n+\n \n anonymous users can see the actions new ordering\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Contain Element xpath=//div[@id=\'portal-footer\']//ul/li[1]/a/span[contains(text(), \'Accessibility\')]\n- Page Should Contain Element xpath=//div[@id=\'portal-footer\']//ul/li[3]/a/span[contains(text(), \'Site Map\')]\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Element //div[@id=\'portal-footer\']//ul/li[1]/a/span[contains(text(), \'Accessibility\')]\n+ Get Element //div[@id=\'portal-footer\']//ul/li[3]/a/span[contains(text(), \'Site Map\')]\n+\n \n logged-in users can see the new action\n- Disable autologin\n- Enable autologin as Contributor\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Contain My favorites\n+ Disable autologin\n+ Enable autologin as Contributor\n+ Go to ${PLONE_URL}\n+ Get Element Count //*[@id="personaltools-favorites"] should be 1\n+ Get Text //*[@id="personaltools-favorites"] contains My favorites\n+\n \n anonymous users cannot see the action anymore\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Not Contain Site Map\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Text //body not contains Site Map\n+\n \n anonymous users can see the action again\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Contain Site Map\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Text //body contains Site Map\n' -b'diff --git a/src/plone/app/multilingual/testing.py b/src/plone/app/multilingual/testing.py\nindex 9e587dae..aa64c841 100644\n--- a/src/plone/app/multilingual/testing.py\n+++ b/src/plone/app/multilingual/testing.py\n@@ -18,7 +18,8 @@\n from plone.dexterity.utils import iterSchemataForType\n from plone.rfc822 import constructMessageFromSchemata\n from plone.rfc822 import initializeObjectFromSchemata\n-from plone.testing import z2\n+from plone.testing.layer import Layer\n+from plone.testing.zope import WSGI_SERVER_FIXTURE\n from plone.uuid.interfaces import IUUID\n from Products.CMFCore.utils import getToolByName\n from zope.configuration import xmlconfig\n@@ -156,7 +157,7 @@ def setUpPloneSite(self, portal):\n )\n \n \n-class MultipleLanguagesLayer(z2.Layer):\n+class MultipleLanguagesLayer(Layer):\n defaultBases = (PLONE_APP_MULTILINGUAL_PRESET_FIXTURE,)\n \n \n@@ -257,7 +258,11 @@ def create_translation(self, *args, **kwargs):\n )\n \n PLONE_APP_MULTILINGUAL_ROBOT_TESTING = FunctionalTesting(\n- bases=(MULTIPLE_LANGUAGES_LAYER, REMOTE_LIBRARY_BUNDLE_FIXTURE, z2.ZSERVER_FIXTURE),\n+ bases=(\n+ MULTIPLE_LANGUAGES_LAYER,\n+ REMOTE_LIBRARY_BUNDLE_FIXTURE,\n+ WSGI_SERVER_FIXTURE,\n+ ),\n name="plone.app.multilingual:Robot",\n )\n \n' +Repository: Products.CMFPlone -Repository: plone.app.multilingual +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/a025dc1c865a12297d9eb1e6e11bfdde020fe18b + +refactoring controlpanel_editing robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_editing.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_editing.robot b/Products/CMFPlone/tests/robot/test_controlpanel_editing.robot\nindex 3d997f0899..1b76469bc6 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_editing.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_editing.robot\n@@ -1,105 +1,109 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n+*** Variables ***\n \n-*** Test Cases ***************************************************************\n+${PAGE_TITLE} Doc\n+${PAGE_ID} doc\n+\n+*** Test Cases ***\n \n Scenario: Disable Standard Editor in the Editing Control Panel\n- Given a logged-in site administrator\n- and the editing control panel\n- When I disable the standard editor\n-# XXX: This test fails because the TinyMCE 4 widget ignores both the old and\n-# the new setting.\n-# Then I do not see the standard editor when I create a document\n+ Given a logged-in site administrator\n+ and the editing control panel\n+ When I disable the standard editor\n+ Then I do not see the standard editor when I create a document\n+\n+ When I go to the editing control panel\n+ and I enable the standard editor\n+ Then I see the standard editor when I create a document\n+\n \n Scenario: Enable Link Integrity Check in the Editing Control Panel\n- Given a logged-in site administrator\n- and the editing control panel\n- When I enable link integrity checks\n-# XXX: Enabling referencefield behaviour for Documents to make this test work makes other tests fail.\n-# See https://github.com/plone/Products.CMFPlone/issues/255 for details.\n-# Then I will be warned if I remove a linked document\n+ Given a logged-in site administrator\n+ and the editing control panel\n+ When I enable link integrity checks\n+ # Linkintegrity checks are in `test_linkintegrity.robot`\n \n \n Scenario: Enable Lock on Through The Web in the Editing Control Panel\n- Given a logged-in site administrator\n- and the editing control panel\n- When I enable lock on through the web\n-# XXX: This test is not finished yet.\n-# Then I will see a warning if a document is edited by another user\n+ Given a logged-in site administrator\n+ and the editing control panel\n+ and a document \'${PAGE_TITLE}\'\n+ When I enable lock on through the web\n+ and I edit the document\n+ Then I will see a warning if a document is edited by another user\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+the editing control panel\n+ Go to ${PLONE_URL}/@@editing-controlpanel\n \n-a logged-in manager\n- Enable autologin as Manager\n \n-a document \'${title}\'\n- Create content type=Document id=doc title=${title}\n+# WHEN\n \n-the editing control panel\n- Go to ${PLONE_URL}/@@editing-controlpanel\n- Wait until page contains Editing Settings\n+I disable the standard editor\n+ Select Options By //select[@name="form.widgets.default_editor:list"] label None\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n-# --- WHEN -------------------------------------------------------------------\n \n-I disable the standard editor\n- Select from list by label name=form.widgets.default_editor:list None\n- Click Button Save\n- Wait until page contains Changes saved\n+I enable the standard editor\n+ Select Options By //select[@name="form.widgets.default_editor:list"] label TinyMCE\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n+\n+I go to the editing control panel\n+ Go to ${PLONE_URL}/@@editing-controlpanel\n+\n \n I enable link integrity checks\n- Select Checkbox name=form.widgets.enable_link_integrity_checks:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_link_integrity_checks:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n \n I enable lock on through the web\n- Select Checkbox name=form.widgets.lock_on_ttw_edit:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.lock_on_ttw_edit:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n+I edit the document\n+ Go to ${PLONE_URL}/${PAGE_ID}\n+ Click //li[@id="contentview-edit"]/a\n+ Get Text //body contains Edit Page\n \n-# --- THEN -------------------------------------------------------------------\n \n-I can see an id field in the settings tab when I create a document\n- Go To ${PLONE_URL}/++add++Document\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'My Document\'); return 0;\n- Click Link Settings\n- Page should contain element name=form.widgets.IShortName.id\n- Input Text name=form.widgets.IShortName.id this-is-my-custom-short-name\n- Click Button Save\n- Wait until page contains Item created\n- Location should be ${PLONE_URL}/this-is-my-custom-short-name/view\n+# THEN\n \n I do not see the standard editor when I create a document\n- Go To ${PLONE_URL}/++add++Document\n- Wait until page contains Add Page\n- Page should not contain element css=.mce-tinymce\n-\n-I will be warned if I remove a linked document\n- ${doc1_uid}= Create content id=doc1 type=Document\n- ${doc2_uid}= Create content id=doc2 type=Document\n- Set field value uid=${doc1_uid} field=text field_type=text/html value=

link

\n- Go To ${PLONE_URL}/doc2/delete_confirmation\n- Wait until page contains doc2\n- Click Button Delete\n- Wait until page contains Potential link breakage\n+ Go To ${PLONE_URL}/++add++Document\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Wait For Condition Element Count //*[@id="formfield-form-widgets-IRichTextBehavior-text"]/div[@role="application"] should be 0\n+ Wait For Condition Element States //textarea[@name="form.widgets.IRichTextBehavior.text"] contains visible\n+\n+\n+I see the standard editor when I create a document\n+ Go To ${PLONE_URL}/++add++Document\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Wait For Condition Element Count //*[@id="formfield-form-widgets-IRichTextBehavior-text"]/div[@role="application"] should be 1\n+ Wait For Condition Element States //textarea[@name="form.widgets.IRichTextBehavior.text"] contains hidden\n \n I will see a warning if a document is edited by another user\n- ${doc1_uid}= Create content id=doc1 type=Document\n+ Disable autologin\n+ Enable autologin as Contributor Reviewer Manager\n+ New Page ${PLONE_URL}/${PAGE_ID}\n+ Wait For Condition Text //body contains Lock\n+ Wait For Condition Element Count //input[@value="Unlock"] should be 1\n' + +Repository: Products.CMFPlone -Branch: refs/heads/7.x -Date: 2024-11-12T07:00:42+01:00 + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> -Commit: https://github.com/plone/plone.app.multilingual/commit/33693b4c47fd2245225323d79b0efa46e536ea76 +Commit: https://github.com/plone/Products.CMFPlone/commit/2b989f5812f4bb58b989fb20e378280ffc8faa79 -refactoring translate_content robot test +refactoring controlpanel_filter robot test Files changed: -M src/plone/app/multilingual/tests/robot/test_translate_content.robot +M Products/CMFPlone/tests/robot/test_controlpanel_filter.robot -b'diff --git a/src/plone/app/multilingual/tests/robot/test_translate_content.robot b/src/plone/app/multilingual/tests/robot/test_translate_content.robot\nindex 6c3a9d20..355f1e24 100644\n--- a/src/plone/app/multilingual/tests/robot/test_translate_content.robot\n+++ b/src/plone/app/multilingual/tests/robot/test_translate_content.robot\n@@ -1,16 +1,13 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n+Test Setup Run Keywords Plone Test Setup\n+Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***\n+*** Test cases ***\n \n Scenario: As an editor I can translate a document\n Given a site owner\n@@ -24,7 +21,6 @@ Scenario: As a visitor I can view the translation\n When I switch to Catalan\n Then I can view the document in Catalan\n \n-\n *** Keywords ***\n \n # Given\n@@ -32,48 +28,30 @@ Scenario: As a visitor I can view the translation\n a site owner\n Enable autologin as Manager\n \n-a visitor\n- Disable autologin\n-\n a document in English\n- Create content type=Document\n- ... container=/${PLONE_SITE_ID}/en/\n- ... id=an-english-document\n- ... title=An English Document\n+ Create content type=Document container=/${PLONE_SITE_ID}/en/ id=an-english-document title=An English Document\n \n a document in English with Catalan translation\n- ${uid} = Create content type=Document\n- ... container=/${PLONE_SITE_ID}/en/\n- ... id=an-english-document\n- ... title=An English Document\n- Create translation ${uid} ca\n- ... title=A Catalan Document\n- Go to ${PLONE_URL}/resolveuid/${uid}\n- Wait until page contains An English Document\n+ ${uid}= Create content type=Document container=/${PLONE_SITE_ID}/en/ id=an-english-document title=An English Document\n+ Create translation ${uid} ca title=A Catalan Document\n+ Go to ${PLONE_URL}/resolveuid/${uid}\n+ Get Element //h1[1][text()=\'An English Document\']\n \n # When\n \n I translate the document into Catalan\n- Go to ${PLONE_URL}/en/an-english-document/@@create_translation?language=ca\n- Capture page screenshot\n- Input Text form.widgets.IDublinCore.title A Catalan Document\n- Click Link Dates # workaround for of TinyMCE editor field problem\n- Capture page screenshot\n- Click button css=#form-buttons-save\n-\n- # Wait until page contains Element creat\n- # (Catalan translations not currently available)\n-\n- Wait until page contains A Catalan Document\n+ Go to ${PLONE_URL}/en/an-english-document/@@create_translation?language=ca\n+ Take screenshot\n+ Type Text //input[@name="form.widgets.IDublinCore.title"] A Catalan Document\n+ Take screenshot\n+ Click //button[@id="form-buttons-save"]\n \n I switch to Catalan\n- Click Link xpath=//a[@title=\'Catal\xc3\xa0\']\n- Wait until page contains A Catalan Document\n+ Click //a[@title=\'Catal\xc3\xa0\']\n+ Get Element //h1[1][text()=\'A Catalan Document\']\n \n # Then\n \n I can view the document in Catalan\n- Page Should Contain Element\n- ... xpath=//h1[1][text()=\'A Catalan Document\']\n- Page Should Contain Element\n- ... xpath=//ul[@id=\'portal-languageselector\']/li[contains(@class, \'currentLanguage\')]/a[@title=\'Catal\xc3\xa0\']\n+ Get Element //h1[1][text()=\'A Catalan Document\']\n+ Get Element //ul[@id=\'portal-languageselector\']/li[contains(@class, \'currentLanguage\')]/a[@title=\'Catal\xc3\xa0\']\n' +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot b/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot\nindex bcdf3307aa..008639c174 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot\n@@ -1,160 +1,162 @@\n-# ============================================================================\n-# Tests for the Plone Filter Control Panel\n-# ============================================================================\n-#\n-# $ bin/robot-server --reload-path src/Products.CMFPlone/Products/CMFPlone/ Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-#\n-# $ bin/robot src/Products.CMFPlone/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot\n-#\n-# ============================================================================\n-\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n-\n-Library Remote ${PLONE_URL}/RobotRemote\n-Library Collections\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource keywords.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n \n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Configure Filter Control Panel to filter out nasty tags\n- Given a logged-in site administrator\n- and the filter control panel\n- When I add \'h1\' to the nasty tags list and remove it from the valid tags list\n- Then the \'h1\' tag is filtered out when a document is saved\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I add \'h1\' to the nasty tags list and remove it from the valid tags list\n+ Then the \'h1\' tag is filtered out when a document is saved\n \n Scenario: Configure Filter Control Panel to strip out tags\n- Given a logged-in site administrator\n- and the filter control panel\n- When I remove \'h1\' from the valid tags list\n- Then the \'h1\' tag is stripped when a document is saved\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I remove \'h1\' from the valid tags list\n+ Then the \'h1\' tag is stripped when a document is saved\n \n Scenario: Configure Filter Control Panel to allow custom tags\n- Given a logged-in site administrator\n- and the filter control panel\n- When I add \'foobar\' to the valid tags list\n- Then the \'foobar\' tag is preserved when a document is saved\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I add \'foobar\' to the valid tags list\n+ Then the \'foobar\' tag is preserved when a document is saved\n \n Scenario: Configure Filter Control Panel to allow custom attributes\n- Given a logged-in site administrator\n- and the filter control panel\n- When I add \'foo-foo\' to the custom attributes list\n- Then the \'foo-foo\' attribute is preserved when a document is saved\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I add \'foo-foo\' to the custom attributes list\n+ Then the \'foo-foo\' attribute is preserved when a document is saved\n \n Scenario: Filter Control Panel displays information regarding caching when saved\n- Given a logged-in site administrator\n- and the filter control panel\n- When I save the form\n- Then success message should contain information regarding caching\n-\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I save the form\n+ Then success message should contain information regarding caching\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the filter control panel\n- Go to ${PLONE_URL}/@@filter-controlpanel\n- Wait until page contains HTML Filtering Settings\n-\n-Input RichText\n- [Arguments] ${input}\n- # Sleep to avoid random failures where the text is not actually set.\n- # This warning from the robotframework docs might be the cause:\n- # "Starting from Robot Framework 2.5 errors caused by invalid syntax, timeouts,\n- # or fatal exceptions are not caught by this keyword."\n- # See https://robotframework.org/robotframework/2.6.1/libraries/BuiltIn.html#Wait%20Until%20Keyword%20Succeeds\n- Sleep 1\n- Wait until keyword succeeds 5s 1s Set and Check TinyMCE Content ${input}\n-\n-Set and Check TinyMCE Content\n- [Arguments] ${input}\n- # Simply check if tinyMCE.getContent() isn\'t empty when we set an input\n- Execute Javascript tinyMCE.activeEditor.setContent(\'${input}\');\n- Sleep 0.5\n- ${check}= Execute Javascript return tinyMCE.activeEditor.getContent();\n- Should not be empty ${check}\n-\n-\n-# --- WHEN -------------------------------------------------------------------\n+ Go to ${PLONE_URL}/@@filter-controlpanel\n+\n+# WHEN\n \n I add \'${tag}\' to the nasty tags list and remove it from the valid tags list\n- Input Text name=form.widgets.nasty_tags ${tag}\n- Remove line from textarea form.widgets.valid_tags ${tag}\n- I save the form\n+ Type Text //textarea[@name="form.widgets.nasty_tags"] ${tag}\n+ Remove line from textarea form.widgets.valid_tags ${tag}\n+ I save the form\n+\n+\n+I save the form\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n \n I remove \'${tag}\' from the valid tags list\n- Remove line from textarea form.widgets.valid_tags ${tag}\n- I save the form\n+ Remove line from textarea form.widgets.valid_tags ${tag}\n+ I save the form\n+\n \n I add \'${tag}\' to the valid tags list\n- Input Text name=form.widgets.valid_tags ${tag}\n- I save the form\n- Page Should Contain ${tag}\n+ Type Text //textarea[@name="form.widgets.valid_tags"] ${tag}\n+ I save the form\n+ Get Text //textarea[@name="form.widgets.valid_tags"] contains ${tag}\n+\n \n I add \'${tag}\' to the custom attributes list\n- Input Text name=form.widgets.custom_attributes ${tag}\n- I save the form\n- Page Should Contain ${tag}\n+ Type Text //textarea[@name="form.widgets.custom_attributes"] ${tag}\n+ I save the form\n+ Get Text //textarea[@name="form.widgets.custom_attributes"] contains ${tag}\n \n-I save the form\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+# THEN\n \n+the \'h1\' tag is filtered out when a document is saved\n \n-# --- THEN -------------------------------------------------------------------\n+ ${doc1_uid}= Create content\n+ ... id=doc1\n+ ... title=Document 1\n+ ... type=Document\n+ Go To ${PLONE_URL}/doc1/edit\n+ Fill text to tinymce editor heading\\nSpanish Inquisition\n+ Mark text heading as h1 in tinymce editor\n+ I save the form\n+ Get Text //body contains Spanish Inquisition\n+ Get Text //body not contains heading\n \n-the \'h1\' tag is filtered out when a document is saved\n- ${doc1_uid}= Create content id=doc1 title=Document 1 type=Document\n- Go To ${PLONE_URL}/doc1/edit\n- patterns are loaded\n- Input RichText

h1 heading

Spanish Inquisition

\n- I save the form\n- # We check that some standard text is there, before checking the interesting part.\n- # If the standard text is invisible, then something completely different is wrong.\n- # I see tests randomly fail where the safe html transform is not even called.\n- # In fact, no text is saved. Maybe some timing problem.\n- # I suspect the Input RichText keyword, which is why I added Sleep in there.\n- Page should contain Spanish Inquisition\n- Page should not contain heading\n \n the \'h1\' tag is stripped when a document is saved\n- ${doc1_uid}= Create content id=doc1 title=Document 1 type=Document\n- Go To ${PLONE_URL}/doc1/edit\n- patterns are loaded\n- Input RichText

h1 heading

Spanish Inquisition

\n- I save the form\n- Page should contain Spanish Inquisition\n- Page should contain heading\n- Page Should Contain Element //div[@id=\'content-core\']//h1 limit=0 message=h1 should have been stripped out\n+\n+ ${doc1_uid}= Create content\n+ ... id=doc1\n+ ... title=Document 1\n+ ... type=Document\n+ Go To ${PLONE_URL}/doc1/edit\n+ Fill text to tinymce editor heading\\nSpanish Inquisition\n+ Mark text heading as h1 in tinymce editor\n+ I save the form\n+ Get Text //body contains Spanish Inquisition\n+ Get Text //body contains heading\n+ Get Element Count //div[@id=\'content-core\']//h1 should be 0 message=h1 should have been stripped out\n+\n \n the \'${tag}\' tag is preserved when a document is saved\n- ${doc1_uid}= Create content id=doc1 title=Document 1 type=Document\n- Go To ${PLONE_URL}/doc1/edit\n- patterns are loaded\n- Input RichText <${tag}>lorem ipsum

Spanish Inquisition

\n- I save the form\n- Page should contain Spanish Inquisition\n- Page Should Contain Element //div[@id=\'content-core\']//${tag} limit=1 message=the ${tag} tag should have been preserved\n+\n+ ${doc1_uid}= Create content\n+ ... id=doc1\n+ ... title=Document 1\n+ ... type=Document\n+ Go To ${PLONE_URL}/doc1/edit\n+ Fill source code to tinymce editor <${tag}>lorem ipsum

Spanish Inquisition

\n+ I save the form\n+ Get Text //body contains Spanish Inquisition\n+ Get Element Count //div[@id=\'content-core\']//${tag} should be 1 message=the ${tag} tag should have been preserved\n+\n \n the \'${attribute}\' attribute is preserved when a document is saved\n- ${doc1_uid}= Create content id=doc1 title=Document 1 type=Document\n- Go To ${PLONE_URL}/doc1/edit\n- patterns are loaded\n- Input RichText lorem ipsum

Spanish Inquisition

\n- I save the form\n- Page should contain Spanish Inquisition\n- Page Should Contain Element //span[@${attribute}] limit=1 message=the ${attribute} tag should have been preserved\n+\n+ ${doc1_uid}= Create content\n+ ... id=doc1\n+ ... title=Document 1\n+ ... type=Document\n+ Go To ${PLONE_URL}/doc1/edit\n+ Fill source code to tinymce editor lorem ipsum

Spanish Inquisition

\n+ I save the form\n+ Get Text //body contains Spanish Inquisition\n+ Get Element Count //span[@${attribute}] should be 1 message=the ${attribute} tag should have been preserved\n+\n \n success message should contain information regarding caching\n- Element Should Contain css=.alert-warning HTML generation is heavily cached across Plone. You may have to edit existing content or restart your server to see the changes.\n+ Get Text //*[contains(@class,"alert-warning")] contains HTML generation is heavily cached across Plone. You may have to edit existing content or restart your server to see the changes.\n+\n+\n+# DRY\n+\n+Mark text heading as h1 in tinymce editor\n+\n+ # select the text `heading` via javascript\n+ Evaluate JavaScript //div[contains(@class, \'tox-edit-area\')]//iframe\n+ ... (elem, args) => {\n+ ... let iframe_document = elem.contentDocument;\n+ ... let body = iframe_document.body;\n+ ... let p = body.firstChild;\n+ ... let range = new Range();\n+ ... range.setStart(p.firstChild, 0);\n+ ... range.setEnd(p.firstChild, 7);\n+ ... iframe_document.getSelection().removeAllRanges();\n+ ... iframe_document.getSelection().addRange(range);\n+ ... }\n+ ... all_elements=False\n+ # here we use the editor to format the text `heading` with h1\n+ Click //button[@aria-label="Formats"]\n+ Hover //div[@title="Headers"]\n+ Click //h1[contains(text(), "Header 1")]\n' -Repository: plone.app.multilingual +Repository: Products.CMFPlone -Branch: refs/heads/7.x -Date: 2024-11-12T07:01:31+01:00 +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> -Commit: https://github.com/plone/plone.app.multilingual/commit/fe4fdfec8a4759705fabe373df22a69537def812 +Commit: https://github.com/plone/Products.CMFPlone/commit/944d2e905845856a921c31436853182db3fab04a -refactoring schemaeditor robot test +refactoring controlpanel_language robot tests Files changed: -M src/plone/app/multilingual/tests/robot/test_schemaeditor.robot +M Products/CMFPlone/tests/robot/test_controlpanel_language.robot -b'diff --git a/src/plone/app/multilingual/tests/robot/test_schemaeditor.robot b/src/plone/app/multilingual/tests/robot/test_schemaeditor.robot\nindex 0ce75781..bda8cfc3 100644\n--- a/src/plone/app/multilingual/tests/robot/test_schemaeditor.robot\n+++ b/src/plone/app/multilingual/tests/robot/test_schemaeditor.robot\n@@ -1,16 +1,13 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-\n-*** Test Cases ***\n+*** Test cases ***\n \n Scenario: As a site owner I can see language independent field setting\n Given a site owner\n@@ -42,54 +39,54 @@ Scenario: As a site owner I can unset field from being language independent\n # Given\n \n a site owner\n- Enable autologin as Manager\n+ Enable autologin as Manager\n \n a dexterity content type with a TTW field\n- Create content type Custom\n- Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n- Wait until page contains element css=body.template-fields\n+ Create content type Custom\n+ Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n+ Get Element //body[contains(@class, "template-fields")]\n \n a dexterity content type field settings form\n- Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n- Go to ${PLONE_URL}/dexterity-types/Custom/custom\n- Wait until page contains Language independent field\n+ Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n+ Go to ${PLONE_URL}/dexterity-types/Custom/custom\n+ Get Text //div[@id="form-widgets-IFieldLanguageIndependent-languageindependent"] contains Language independent field\n \n a dexterity content type with a language independent TTW field\n- Create content type Custom\n- Set field language independent Custom custom on\n- Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n- Wait until page contains element css=body.template-fields\n+ Create content type Custom\n+ Set field language independent Custom custom on\n+ Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n+ Get Element //body[contains(@class, "template-fields")]\n \n # When\n \n I open the field settings\n- Go to ${PLONE_URL}/dexterity-types/Custom/custom\n- Page should contain Language independent field\n+ Go to ${PLONE_URL}/dexterity-types/Custom/custom\n+ Get Text //div[@id="form-widgets-IFieldLanguageIndependent-languageindependent"] contains Language independent field\n \n I select the language independent field setting\n- Select checkbox form-widgets-IFieldLanguageIndependent-languageindependent-0\n- Checkbox should be selected form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Check Checkbox //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"]\n+ Get Checkbox State //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"] == checked\n \n I save the form\n- Wait until page contains element css=#form-buttons-save\n- Click button css=#form-buttons-save\n- Wait until keyword succeeds 1 10 Element should not be visible .plone-modal-wrapper\n+ Get Element //*[@id="form-buttons-save"]\n+ Click //*[@id="form-buttons-save"]\n+ Get Element Count //div[contains(@class,"plone-modal-wrapper")] should be 0\n \n I open the form again\n- Go to ${PLONE_URL}/dexterity-types/Custom/custom\n- Wait until page contains Language independent field\n+ Go to ${PLONE_URL}/dexterity-types/Custom/custom\n+ Get Text //div[@id="form-widgets-IFieldLanguageIndependent-languageindependent"] contains Language independent field\n \n I unselect the language independent field setting\n- Unselect checkbox form-widgets-IFieldLanguageIndependent-languageindependent-0\n- Checkbox should not be selected form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Uncheck Checkbox //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"]\n+ Get Checkbox State //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"] == unchecked\n \n # Then\n \n I can see the language independent field setting\n- Wait until page contains element id=form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Get Element //*[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"]\n \n the language independent field setting is selected\n- Checkbox should be selected form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Get Checkbox State //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"] == checked\n \n the language independent field setting is not selected\n- Checkbox should not be selected form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Get Checkbox State //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"] == unchecked\n' +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_language.robot b/Products/CMFPlone/tests/robot/test_controlpanel_language.robot\nindex 163081cffa..f7f9c265ad 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_language.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_language.robot\n@@ -1,51 +1,43 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Set Site Language in the Language Control Panel\n- Given a logged-in site administrator\n- and the language control panel\n- When I set the site language to German\n- Then the Plone user interface is in German\n-\n+ Given a logged-in site administrator\n+ and the language control panel\n+ When I set the site language to German\n+ Then the Plone user interface is in German\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the language control panel\n- Go to ${PLONE_URL}/@@language-controlpanel\n- Wait until page contains Language Settings\n+ Go to ${PLONE_URL}/@@language-controlpanel\n+ Get Text //body contains Language Settings\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I set the site language to German\n- Select From List By Label form.widgets.default_language:list Deutsch\n- Select From List By Label form.widgets.available_languages.from Deutsch\n- Click Button \xe2\x86\x92\n- Click Button Save\n- Wait until page contains Changes saved\n+ Select Options By //select[@name="form.widgets.default_language:list"] label Deutsch\n+ Select Options By //select[@name="form.widgets.available_languages.from"] label Deutsch\n+ Click //button[@value="\xe2\x86\x92"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n the Plone user interface is in German\n- Go to ${PLONE_URL}\n- Wait until page contains Lizensiert unter der\n- Page should contain Lizensiert unter der\n+ Go to ${PLONE_URL}\n+ Get Text //body contains Lizensiert unter der\n' -Repository: plone.app.multilingual +Repository: Products.CMFPlone -Branch: refs/heads/7.x -Date: 2024-11-12T07:20:37+01:00 +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> -Commit: https://github.com/plone/plone.app.multilingual/commit/61a7bde414d0b0f84688a7fd31312918e1f9a682 +Commit: https://github.com/plone/Products.CMFPlone/commit/d367e6c51c26b0503accb7f91600fd566183442b -refactoring add_translation robot test +refactoring controlpanel_markup robot test Files changed: -M src/plone/app/multilingual/tests/robot/test_add_translation.robot +M Products/CMFPlone/tests/robot/test_controlpanel_markup.robot -b'diff --git a/src/plone/app/multilingual/tests/robot/test_add_translation.robot b/src/plone/app/multilingual/tests/robot/test_add_translation.robot\nindex 46a5b9ac..6a990b85 100644\n--- a/src/plone/app/multilingual/tests/robot/test_add_translation.robot\n+++ b/src/plone/app/multilingual/tests/robot/test_add_translation.robot\n@@ -1,14 +1,11 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n-Resource Products/CMFPlone/tests/robot/keywords.robot\n+Resource plone/app/robotframework/browser.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n *** Test Cases ***\n \n@@ -24,74 +21,57 @@ Scenario: As an editor I can add new translation\n \n *** Keywords ***\n \n-Setup test browser\n- Set Selenium speed 0.5s\n- Open test browser\n- Set window size 1200 900\n-\n # Given\n \n a site owner\n- Enable autologin as Manager\n+ Enable autologin as Manager\n \n a document in English\n- Create content type=Document\n- ... container=/${PLONE_SITE_ID}/en/\n- ... id=an-english-document\n- ... title=An English Document\n+ Create content type=Document container=/${PLONE_SITE_ID}/en/ id=an-english-document title=An English Document\n \n a document in Catalan\n- Create content type=Document\n- ... container=/${PLONE_SITE_ID}/ca/\n- ... id=a-catalan-document\n- ... title=A Catalan Document\n+ Create content type=Document container=/${PLONE_SITE_ID}/ca/ id=a-catalan-document title=A Catalan Document\n \n # When\n \n I view the Catalan document\n- Go to ${PLONE_URL}/ca/a-catalan-document\n- Wait until page contains A Catalan Document\n+ Go to ${PLONE_URL}/ca/a-catalan-document\n+ Get Element //h1[1][text()=\'A Catalan Document\']\n \n I link the document in English as a translation\n- Page should contain element css=#plone-contentmenu-multilingual a\n- Capture page screenshot\n- Element should be visible css=#plone-contentmenu-multilingual a\n- Click Element css=#plone-contentmenu-multilingual a\n- Wait until page contains element css=#_modify_translations\n- Wait until element is visible css=#_modify_translations\n-\n- Click Element css=#_modify_translations\n- Given patterns are loaded\n- Wait until page contains element css=#translations-overview .connectTranslationAction\n-\n- Click Element css=#translations-overview .connectTranslationAction\n- Wait until page contains element css=.select2-choices\n- Wait until element is visible css=.select2-choices\n- Click Element css=#formfield-form-widgets-content .pat-relateditems-container button.mode.search\n- Input Text css=#formfield-form-widgets-content .select2-input en\n- Wait until page contains element xpath=(//span[contains(., \'An English Document\')])\n- Wait until element is visible xpath=(//span[contains(., \'An English Document\')])\n- Click Element xpath=(//span[contains(., \'An English Document\')])\n- Wait until page contains An English Document\n-\n- # We need a complicated xpath, because for some reason a button with this id is there twice.\n- # The first one is hidden.\n- Click Element xpath=(//*[contains(@class, \'modal-footer\')]//button[@id=\'form-buttons-connect_translation\'])\n- Wait until page contains element xpath=(//h3[@class="translationTitle"])\n- Sleep 5\n- Wait until element is visible xpath=(//h3[@class="translationTitle"])\n- Set Focus To Element xpath=(//*[@id="translations-overview"]//a[contains(@href,"a-catalan-document")])\n- Click Element xpath=(//*[@id="translations-overview"]//a[contains(text(),\'/plone/ca/a-catalan-document\')])\n- Wait until page contains A Catalan Document\n+ Get Element //li[@id="plone-contentmenu-multilingual"]/a\n+ Take Screenshot\n+ Get Element States //li[@id="plone-contentmenu-multilingual"]/a contains visible\n+ Click //li[@id="plone-contentmenu-multilingual"]/a\n+ Get Element States //a[@id="_modify_translations"] contains visible\n+ Click //a[@id="_modify_translations"]\n+ Click //table[@id="translations-overview"]/tbody/tr[1]/td[3]/a[contains(@class,"connectTranslationAction")]\n+ Click //form[@id="form"]//div[@id="formfield-form-widgets-content"]//button[contains(@class,"mode") and contains(@class,"browse")]\n+ Wait For Condition Element States //ul[@class="select2-results"] contains visible\n+ Click //ul[@class="select2-results"]/li/div/div/div/a[@data-path="/en" and contains(@class,"pat-relateditems-result-browse")]\n+ Click //a[@data-path="/en/an-english-document"]\n+ Click //*[contains(@class, \'modal-footer\')]//button[@name=\'form.buttons.connect_translation\']\n+ Get Text //table[@id="translations-overview"]/tbody/tr[1]/td[2]/h3[@class="translationTitle"] should be An English Document\n+ Click //table[@id="translations-overview"]//a[contains(text(),\'/plone/ca/a-catalan-document\')]\n+ Get Text //*[@id="content"]/header/h1 should be A Catalan Document\n \n I switch to English\n- Click Link xpath=//a[@title=\'English\']\n- Wait until page contains An English Document\n+ Click //a[@title=\'English\']\n+ Get Element //h1[1][contains(text(),\'An English Document\')]\n \n # Then\n \n I can view the document in English\n- Wait until page contains element\n- ... xpath=//h1[1][contains(text(),\'English Document\')]\n- Wait until page contains element\n- ... xpath=//ul[@id=\'portal-languageselector\']/li[contains(@class, \'currentLanguage\')]/a[@title=\'English\']\n+ Get Element //h1[1][contains(text(),\'English Document\')]\n+ Get Element //ul[@id=\'portal-languageselector\']/li[contains(@class, \'currentLanguage\')]/a[@title=\'English\']\n+\n+\n+# DRY\n+\n+Click item in column\n+ [arguments] ${colnumber} ${itemposition}\n+ Click //div[contains(@class, "content-browser-wrapper")]//div[contains(@class, "levelColumns")]/div[${colnumber}]/div[contains(@class, "levelItems")]/div[${itemposition}]\n+\n+Pause\n+ Import library Dialogs\n+ Pause execution\n' +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot\nindex d629df48a9..9b43a45cec 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot\n@@ -1,70 +1,67 @@\n-Documentation\n-... $ bin/robot-server Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-... $ bin/robot test_controlpanel_markup.robot\n+*** Settings ***\n \n-*** Settings *****************************************************************\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Resource keywords.robot\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Change Default Markup Types in the Markup Control Panel\n- Given a logged-in site administrator\n- and the markup control panel\n- When I set allowed types to "text/restructured"\n-#TODO: Waiting on richtext pattern to support this\n-# Then I do not see the standard editor when I create a document\n+ Given a logged-in site administrator\n+ and the markup control panel\n+ When I set allowed types to text/restructured\n+\n+ #TODO: Waiting on richtext pattern to support this\n+ #Then I do not see the standard editor when I create a document\n \n Scenario: Set Default Markup to be Restructured Text\n- Given a logged-in site administrator\n- and the markup control panel\n- When I set the default type to "text/restructured"\n-#TODO: Waiting on richtext pattern to support this\n-# Then I do not see the standard editor when I create a document\n+ Given a logged-in manager\n+ and the markup control panel\n+ When I set the default type to text/restructured\n \n-*** Keywords *****************************************************************\n+ #TODO: Waiting on richtext pattern to support this\n+ #Then I do not see the standard editor when I create a document\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a document \'${title}\'\n- Create content type=Document id=doc title=${title}\n+# GIVEN\n \n the markup control panel\n- Go to ${PLONE_URL}/@@markup-controlpanel\n- Wait until page contains Markup Settings\n+ Go to ${PLONE_URL}/@@markup-controlpanel\n+ Get Text //body contains Markup Settings\n \n \n # --- WHEN -------------------------------------------------------------------\n \n-I set allowed types to "${type}"\n- with the label ${type} Select Checkbox\n- with the label text/html UnSelect Checkbox\n- with the label text/x-web-textile UnSelect Checkbox\n- Click Button Save\n- Wait until page contains Changes saved\n- Checkbox Should Be Selected ${type}\n- Checkbox Should Not Be Selected text/html\n- Checkbox Should Not Be Selected text/x-web-textile\n+I set allowed types to\n+ [Arguments] ${type}\n \n-I set the default type to "${type}"\n- Select from list by label name=form.widgets.default_type:list ${type}\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.allowed_types:list" and @value="${type}"]\n+ Uncheck Checkbox //input[@name="form.widgets.allowed_types:list" and @value="text/html"]\n+ Uncheck Checkbox //input[@name="form.widgets.allowed_types:list" and @value="text/x-web-textile"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n-I disable the standard editor\n- Select from list by label name=form.widgets.default_editor:list None\n- Click Button Save\n- Wait until page contains Changes saved\n+ Get Element States //input[@name="form.widgets.allowed_types:list" and @value="${type}"] contains checked\n+ Get Element States //input[@name="form.widgets.allowed_types:list" and @value="text/html"] not contains checked\n+ Get Element States //input[@name="form.widgets.allowed_types:list" and @value="text/x-web-textile"] not contains checked\n+\n+I set the default type to\n+ [Arguments] ${type}\n+\n+ Select Options By //select[@name="form.widgets.default_type:list"] value ${type}\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n+\n+# I disable the standard editor\n+# Select from list by label name=form.widgets.default_editor:list None\n+# Click Button Save\n+# Wait until page contains Changes saved\n \n \n # --- THEN -------------------------------------------------------------------\n@@ -80,22 +77,7 @@ Then I can see only "${type}" when creating a document\n Wait until page contains Item created\n Location should be ${PLONE_URL}/this-is-my-custom-short-name/view\n \n-I do not see the standard editor when I create a document\n- Go To ${PLONE_URL}/++add++Document\n- Wait until page contains Add Page\n- Page should not contain element css=.mce-tinymce\n-\n-# --- Helpers -----------------------------------------------------------------\n-\n-With the label\n- [arguments] ${title} ${extra_keyword} @{list}\n- ${for}= label "${title}"\n- Run Keyword ${extra_keyword} id=${for} @{list}\n-\n-label "${title}"\n- [Return] ${for}\n- ${for}= Get Element Attribute xpath=//label[contains(., "${title}")] for\n-\n-label2 "${title}"\n- [Return] ${for}\n- ${for}= Get Element Attribute xpath=//label[contains(., "${title}")]//input\n+# I do not see the standard editor when I create a document\n+# Go To ${PLONE_URL}/++add++Document\n+# Pause\n+# Page should not contain element css=.mce-tinymce\n' -Repository: plone.app.multilingual +Repository: Products.CMFPlone -Branch: refs/heads/7.x -Date: 2024-11-12T07:23:14+01:00 +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 Author: 1letter (1letter) <1letter@gmx.de> -Commit: https://github.com/plone/plone.app.multilingual/commit/04d1ab2dae9cf5799c7f5af56af90edfd3098ce2 +Commit: https://github.com/plone/Products.CMFPlone/commit/6d4a74657e97ea47c88ad924ac6eb19096a45072 + +refactoring controlpanel_navigation robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot b/Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot\nindex c277aedf52..f40e8b751c 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot\n@@ -1,115 +1,115 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Disable Generate Tabs in the Navigation Control Panel\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the navigation control panel\n- When I disable generate tabs\n- Then the document \'My Document\' does not show up in the navigation\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the navigation control panel\n+ When I disable generate tabs\n+ Then the document \'My Document\' does not show up in the navigation\n \n Scenario: Enable Folderish Tabs in the Navigation Control Panel\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the navigation control panel\n- When I disable non-folderish tabs\n- Then the document \'My Document\' does not show up in the navigation\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the navigation control panel\n+ When I disable non-folderish tabs\n+ Then the document \'My Document\' does not show up in the navigation\n \n Scenario: Filter Navigation By Displayed Types in the Navigation Control Panel\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the navigation control panel\n- When I remove \'Document\' from the displayed types list\n- Then the document \'My Document\' does not show up in the navigation\n- and the document \'My Document\' does not show up in the sitemap\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the navigation control panel\n+ When I remove \'Document\' from the displayed types list\n+ Then the document \'My Document\' does not show up in the navigation\n+ and the document \'My Document\' does not show up in the sitemap\n \n-#Scenario: Filter Navigation By Workflow States in the Navigation Control Panel\n-# Given a logged-in site administrator\n-# and a published document \'My Document\'\n-# and a private document \'My Internal Document\'\n-# and the navigation control panel\n-# When I enable filtering by workflow states\n-# and I choose to show \'published\' items\n-# and I choose to not show \'private\' items\n-# Then the document \'My Document\' shows up in the navigation\n-# and the document \'My Internal Document\' does not show up in the navigation\n+Scenario: Filter Navigation By Workflow States in the Navigation Control Panel\n+ Given a logged-in site administrator\n+ and a published document \'My Document\'\n+ and a private document \'My Internal Document\'\n+ and the navigation control panel\n+ When I enable filtering by workflow states\n+ and I choose to show \'published\' items\n+ and I choose to not show \'private\' items\n+ Then the document \'My Document\' shows up in the navigation\n+ and the document \'My Internal Document\' does not show up in the navigation\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n the navigation control panel\n- Go to ${PLONE_URL}/@@navigation-controlpanel\n- Wait until page contains Navigation Settings\n+ Go to ${PLONE_URL}/@@navigation-controlpanel\n+ Get Text //body contains Navigation Settings\n \n a published document \'${title}\'\n- ${uid}= a document \'${title}\'\n- Fire transition ${uid} publish\n+ ${uid}= Create content\n+ ... type=Document\n+ ... id=doc\n+ ... title=${title}\n+ Fire transition ${uid} publish\n \n a private document \'${title}\'\n- a document \'${title}\'\n+ Create content\n+ ... type=Document\n+ ... id=doc1\n+ ... title=${title}\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I disable generate tabs\n- Unselect Checkbox form.widgets.generate_tabs:list\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@name="form.widgets.generate_tabs:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I disable non-folderish tabs\n- Unselect Checkbox xpath=//input[@value=\'Document\']\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@value=\'Document\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I remove \'${portal_type}\' from the displayed types list\n- Unselect Checkbox xpath=//input[@value=\'Document\']\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@value=\'Document\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I enable filtering by workflow states\n- Select Checkbox name=form.widgets.filter_on_workflow:list\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.filter_on_workflow:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I choose to show \'${workflow_state}\' items\n- Select Checkbox xpath=//input[@value=\'${workflow_state}\']\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@value=\'${workflow_state}\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I choose to not show \'${workflow_state}\' items\n- Unselect Checkbox xpath=//input[@value=\'${workflow_state}\']\n- Click Button Save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@value=\'${workflow_state}\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n the document \'${title}\' shows up in the navigation\n- Go to ${PLONE_URL}\n- Wait until page contains Powered by Plone\n- Page Should Contain Element //ul[@id=\'portal-globalnav\']/li/a[contains(text(), \'${title}\')] limit=1 message=The global navigation should have contained the item \'${title}\'\n+ Go to ${PLONE_URL}\n+ Get Element Count //ul[@id=\'portal-globalnav\']/li/a[contains(text(), \'${title}\')] should be 1 message=The global navigation should have contained the item \'${title}\'\n \n the document \'${title}\' does not show up in the navigation\n- Go to ${PLONE_URL}\n- Wait until page contains Powered by Plone\n- Page Should Contain Element //ul[@id=\'portal-globalnav\']/li/a[contains(text(), \'${title}\')] limit=0 message=The global navigation should not have contained the item \'${title}\'\n+ Go to ${PLONE_URL}\n+ Get Element Count //ul[@id=\'portal-globalnav\']/li/a[contains(text(), \'${title}\')] should be 0 message=The global navigation should not have contained the item \'${title}\'\n \n the document \'${title}\' does not show up in the sitemap\n- Go to ${PLONE_URL}/sitemap\n- Wait until page contains Powered by Plone\n- Page Should Contain Element //ul[@id=\'portal-sitemap\']/li/a/span[contains(text(), \'${title}\')] limit=0 message=The sitemap should not have contained the item \'${title}\'\n+ Go to ${PLONE_URL}/sitemap\n+ Get Element Count //ul[@id=\'portal-sitemap\']/li/a/span[contains(text(), \'${title}\')] should be 0 message=The sitemap should not have contained the item \'${title}\'\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/bd4636a5d112b76f640cb460d912a04b059c7539 + +refactoring controlpanel_redirection robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot b/Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot\nindex 6c2f6673c5..037cea873f 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot\n@@ -1,43 +1,40 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Add redirect in the URL Management Control Panel\n- Given a logged-in site administrator\n- and the URL Management control panel\n- When I add a redirect to the test folder from alternative url /old\n- Then I get redirected to the test folder when visiting /old\n+ Given a logged-in site administrator\n+ and the URL Management control panel\n+ When I add a redirect to the test folder from alternative url /old\n+ Then I get redirected to the test folder when visiting /old\n \n \n Scenario: Remove redirect in the URL Management Control Panel\n- Given a logged-in site administrator\n- and the URL Management control panel\n- When I add a redirect to the test folder from alternative url /old\n- and I remove the redirect from alternative url /old\n- Then I do not get redirected when visiting /old\n+ Given a logged-in site administrator\n+ and the URL Management control panel\n+ When I add a redirect to the test folder from alternative url /old\n+ and I remove the redirect from alternative url /old\n+ Then I do not get redirected when visiting /old\n \n \n Scenario: Remove filtered redirects in the URL Management Control Panel\n- Given a logged-in site administrator\n- and the URL Management control panel\n- When I add a redirect to the test folder from alternative url /a\n- and I add a redirect to the test folder from alternative url /b\n- and I filter the redirects with path /a\n- and I remove the matching redirects\n- Then I do not get redirected when visiting /a\n- and I get redirected to the test folder when visiting /b\n+ Given a logged-in site administrator\n+ and the URL Management control panel\n+ When I add a redirect to the test folder from alternative url /a\n+ and I add a redirect to the test folder from alternative url /b\n+ and I filter the redirects with path /a\n+ and I remove the matching redirects\n+ Then I do not get redirected when visiting /a\n+ and I get redirected to the test folder when visiting /b\n \n \n Scenario: Download all redirects in the URL Management Control Panel\n@@ -48,58 +45,59 @@ Scenario: Download all redirects in the URL Management Control Panel\n Then I can download all redirects as CSV\n \n \n-*** Keywords *****************************************************************\n-\n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the URL Management control panel\n- Go to ${PLONE_URL}/@@redirection-controlpanel\n+ Go to ${PLONE_URL}/@@redirection-controlpanel\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I add a redirect to the test folder from alternative url\n- [Documentation] target path must exist in the site\n- [Arguments] ${old}\n- Input Text name=redirection ${old}\n- Input Text name=target_path /test-folder\n- Click Button Add\n+ [Documentation] target path must exist in the site\n+ [Arguments] ${old}\n+ Type Text //input[@name="redirection"] ${old}\n+ Type Text //input[@name="target_path"] /test-folder\n+ Click //button[@name="form.button.Add"]\n \n \n I remove the redirect from alternative url\n- [Arguments] ${old}\n- Select Checkbox xpath=//input[@value=\'/plone${old}\']\n- Click Button Remove selected\n-\n+ [Arguments] ${old}\n+ Check Checkbox //input[@value="/plone${old}"]\n+ Click //button[@name="form.button.Remove"]\n \n I filter the redirects with path\n- [Arguments] ${old}\n- Input Text name=q ${old}\n- Click Button Filter\n+ [Arguments] ${old}\n+ Type Text //input[@name="q"] ${old}\n+ Click //button[@name="form.button.filter"]\n \n I remove the matching redirects\n- Click Button Remove all that match filter\n+ Click //button[@name="form.button.MatchRemove"]\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n I get redirected to the test folder when visiting\n- [Arguments] ${old}\n- Go to ${PLONE_URL}/${old}\n- Location Should Be ${PLONE_URL}/test-folder\n+ [Arguments] ${old}\n+ Go to ${PLONE_URL}/${old}\n+ Get Url should be ${PLONE_URL}/test-folder\n \n \n I do not get redirected when visiting\n- [Arguments] ${old}\n- Go to ${PLONE_URL}/${old}\n- Location Should Be ${PLONE_URL}/${old}\n- Wait Until Page Contains This page does not seem to exist\n+ [Arguments] ${old}\n+ Go to ${PLONE_URL}/${old}\n+ Get Url should be ${PLONE_URL}/${old}\n+ Get Text //body contains This page does not seem to exist\n \n \n I can download all redirects as CSV\n- [Documentation] I don\'t know how to get the contents of the downloaded file\n- Click Button Download all as CSV\n- Page Should Not Contain there seems to be an error\n+ [Documentation] Test the download of CSV file\n+\n+ Import library OperatingSystem\n+\n+ ${dl_promise} Promise To Wait For Download saveAs=redirections.csv\n+ Click //button[@name="form.button.Download"]\n+ ${file_obj}= Wait For ${dl_promise}\n+ File Should Exist ${file_obj}[saveAs]\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/c0f87a02796bf1cca390ef24e27fee25baab904e + +refactoring controlpanel_search robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_search.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_search.robot b/Products/CMFPlone/tests/robot/test_controlpanel_search.robot\nindex de9c3b5cfe..8bc821890b 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_search.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_search.robot\n@@ -1,81 +1,65 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Enable Livesearch in the Search Control Panel\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the search control panel\n- When I enable livesearch\n-# Then then searching for \'My Document\' will show a live search\n-# XXX: Not implemented yet. See https://github.com/plone/Products.CMFPlone/issues/176 for details\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the search control panel\n+ When I enable livesearch\n+ Then then searching for \'My Document\' will show a live search\n \n Scenario: Exclude Content Types from Search\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the search control panel\n- When I exclude the \'Document\' type from search\n- Then searching for \'My Document\' will not return any results\n-\n-\n-*** Keywords *****************************************************************\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the search control panel\n+ When I exclude the \'Document\' type from search\n+ Then searching for \'My Document\' will not return any results\n \n-# --- GIVEN ------------------------------------------------------------------\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+*** Keywords ***\n \n-a document \'${title}\'\n- Create content type=Document id=doc title=${title}\n+# GIVEN\n \n the search control panel\n- Go to ${PLONE_URL}/@@search-controlpanel\n- Wait until page contains Search Settings\n+ Go to ${PLONE_URL}/@@search-controlpanel\n+ Get Text //body contains Search Settings\n \n-\n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I enable livesearch\n- Select Checkbox form.widgets.enable_livesearch:list\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_livesearch:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I exclude the \'${portal_type}\' type from search\n- # Make sure we see the checkbox, in expanded in jenkins it gets a bit under the toolbar\n- ${element} Set Variable xpath=//input[@name=\'form.widgets.types_not_searched:list\' and @value=\'${portal_type}\']\n- Wait For Element ${element}\n- Unselect Checkbox ${element}\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ # Make sure we see the checkbox, in expanded in jenkins it gets a bit under the toolbar\n+ Check Checkbox //input[@name=\'form.widgets.types_not_searched:list\' and @value=\'${portal_type}\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n then searching for \'My Document\' will show a live search\n- # XXX: Not implemented yet.\n- Go to ${PLONE_URL}\n- Wait until page contains element xpath=//input[@name=\'SearchableText\']\n- Input Text name=SearchableText My\n+ Go to ${PLONE_URL}\n+ Type Text //input[@name="SearchableText"] My D\n+ Get Element States //ul[contains(@class,"livesearch-results")] contains visible\n+ Get Text //ul[contains(@class,"livesearch-results")] contains My Document\n \n searching for \'${search_term}\' will not return any results\n- Go to ${PLONE_URL}/@@search\n- Given patterns are loaded\n- Wait until page contains No results were found\n- Input Text xpath=//form[@id=\'searchform\']//input[@name=\'SearchableText\'] ${search_term}\n- Submit Form name=searchform\n- Wait until page contains items matching your search terms\n- Page Should Contain Element //span[@id=\'search-results-number\' and contains(.,\'0\')] 1\n-\n-\n+ Go to ${PLONE_URL}/@@search\n+ Get Text //body contains No results were found\n+ Type Text //form[@id=\'searchform\']//input[@name=\'SearchableText\'] ${search_term}\n+ Click //input[@type="submit" and @value="Search"]\n+ Get Text //body contains items matching your search terms\n+ Get Text //span[@id=\'search-results-number\'] should be 0\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/478e841dd41e0553181dab22d31469f1c94ebf42 + +refactoring controlpanel_security robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_security.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_security.robot b/Products/CMFPlone/tests/robot/test_controlpanel_security.robot\nindex 535f96945e..f7dd470b21 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_security.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_security.robot\n@@ -1,190 +1,172 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Enable self registration in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable self registration\n- Then anonymous users can register to the site\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable self registration\n+ Then anonymous users can register to the site\n \n Scenario: Enable users to select their own passwords in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable users to select their own passwords\n- Then users can select their own passwords when registering\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable users to select their own passwords\n+ Then users can select their own passwords when registering\n \n Scenario: Enable user folders in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable user folders\n- Then a user folder should be created when a user registers and logs in to the site\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable user folders\n+ Then a user folder should be created when a user registers and logs in to the site\n \n Scenario: Enable anyone to view \'about\' information in the Security Control Panel\n- Given a logged-in site administrator\n- and a published test folder\n- and the security control panel\n- When I enable anyone to view \'about\' information\n- Then anonymous users can view \'about\' information\n+ Given a logged-in site administrator\n+ and a published test folder\n+ and the security control panel\n+ When I enable anyone to view \'about\' information\n+ Then anonymous users can view \'about\' information\n \n Scenario: Enable use email as login in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable email to be used as a login name\n- Then users can use email as their login name\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable email to be used as a login name\n+ Then users can use email as their login name\n \n Scenario: Enable use uuid as uid in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable UUID to be used as a user id\n- Then UUID should be used for the user id\n-\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable UUID to be used as a user id\n+ Then UUID should be used for the user id\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the security control panel\n- Go to ${PLONE_URL}/@@security-controlpanel\n- Wait until page contains Security Settings\n+ Go to ${PLONE_URL}/@@security-controlpanel\n+ Get Text //body contains Security Settings\n \n a published test folder\n- Go to ${PLONE_URL}/test-folder\n- Wait For Element css=#plone-contentmenu-workflow\n- Click link xpath=//li[@id=\'plone-contentmenu-workflow\']/a\n- Wait For Element id=workflow-transition-publish\n- Click link id=workflow-transition-publish\n- Wait until page contains Item state changed\n+ Go to ${PLONE_URL}/test-folder\n+ Click //li[@id="plone-contentmenu-workflow"]/a\n+ Click //*[@id="workflow-transition-publish"]\n+ Get Text //body contains Item state changed\n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I enable self registration\n- Select Checkbox form.widgets.enable_self_reg:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable users to select their own passwords\n- Select Checkbox form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_user_pwd_choice:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_pwd_choice:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable user folders\n- Select Checkbox form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_user_pwd_choice:list\n- Select Checkbox form.widgets.enable_user_folders:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_pwd_choice:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_folders:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable anyone to view \'about\' information\n- Select Checkbox form.widgets.allow_anon_views_about:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.allow_anon_views_about:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable email to be used as a login name\n- Select Checkbox form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_user_pwd_choice:list\n- Select Checkbox form.widgets.use_email_as_login:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_pwd_choice:list"]\n+ Check Checkbox //input[@name="form.widgets.use_email_as_login:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable UUID to be used as a user id\n- Select Checkbox form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_user_pwd_choice:list\n- Select Checkbox form.widgets.use_uuid_as_userid:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_pwd_choice:list"]\n+ Check Checkbox //input[@name="form.widgets.use_uuid_as_userid:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n Anonymous users can register to the site\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Element Should Be Visible xpath=//a[@id=\'personaltools-join\']\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Text //body contains Plone site\n+ Get Element States //a[@id="personaltools-join"] contains visible\n \n Users can select their own passwords when registering\n- Disable autologin\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Registration form\n- Element Should Be Visible xpath=//input[@id=\'form-widgets-password\']\n+ Disable autologin\n+ Go to ${PLONE_URL}/@@register\n+ Get Text //body contains Registration form\n+ Get Element States //input[@id="form-widgets-password"] contains visible\n \n Users can use email as their login name\n- Disable autologin\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Registration form\n- Element Should Be Visible xpath=//input[@id=\'form-widgets-email\']\n- Element Should Not Be Visible xpath=//input[@id=\'form-widgets-username\']\n+ Disable autologin\n+ Go to ${PLONE_URL}/@@register\n+ Get Text //body contains Registration form\n+ Get Element States //input[@id="form-widgets-email"] contains visible\n+ Get Element States //input[@id="form-widgets-username"] not contains visible\n \n A user folder should be created when a user registers and logs in to the site\n \n- Disable autologin\n-\n- # I register to the site\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Registration form\n- Input Text for sure form.widgets.username joe\n- Input Text for sure form.widgets.email joe@test.com\n- Input Text for sure form.widgets.password supersecret\n- Input Text for sure form.widgets.password_ctl supersecret\n- Wait For Then Click Element css=#form-buttons-register\n-\n- # I login to the site\n- Go to ${PLONE_URL}/login\n- Wait until page contains Login Name\n- Input text for sure __ac_name joe\n- Input text for sure __ac_password supersecret\n- Click Button Log in\n- Wait until page contains You are now logged in\n-\n- # The user folder should be created\n- Go to ${PLONE_URL}/Members/joe\n- Wait until element contains css=h1 joe\n- Page should Not contain This page does not seem to exist\n+ Disable autologin\n+ I register to the site\n+ I login to the site\n+ # The user folder should be created\n+ Go to ${PLONE_URL}/Members/joe\n+ Get Element Count //h1[contains(text(),\'joe doe\')] should be 1\n+ Get Text //body not contains This page does not seem to exist\n \n Anonymous users can view \'about\' information\n- Disable autologin\n- Go to ${PLONE_URL}/@@search?SearchableText=test\n- Wait until page contains Search results\n- Element Should Be Visible xpath=//span[contains(@class, \'documentAuthor\')]\n+ Disable autologin\n+ Go to ${PLONE_URL}/@@search?SearchableText=test\n+ Get Text //body contains Search results\n+ Get Element States //span[contains(@class, \'documentAuthor\')] contains visible\n \n UUID should be used for the user id\n \n- Disable autologin\n-\n- # I register to the site\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Registration form\n- Input Text for sure form.widgets.username joe\n- Input Text for sure form.widgets.email joe@test.com\n- Input Text for sure form.widgets.password supersecret\n- Input Text for sure form.widgets.password_ctl supersecret\n- Wait For Then Click Element css=#form-buttons-register\n-\n- # I login to the site\n- Go to ${PLONE_URL}/login\n- Wait until page contains Login Name\n- Input text for sure __ac_name joe\n- Input text for sure __ac_password supersecret\n- Click Button Log in\n- Wait until page contains You are now logged in\n- # XXX: Here we can\'t really test that this is a uuid, since it\'s random, so\n- # we just check that user id is not equal to username or email\n- ${userid}= Get Text xpath=//a[@id=\'personaltools-menulink\']\n- Should Not Be Equal As Strings ${userid} joe\n- Should Not Be Equal As Strings ${userid} joe@test.com\n+ Disable autologin\n+ I register to the site\n+ I login to the site\n+ # XXX: Here we can\'t really test that this is a uuid, since it\'s random, so\n+ # we just check that user id is not equal to username or email\n+ ${userid}= Get Text //a[@id=\'personaltools-menulink\']\n+ Should Not Be Equal As Strings ${userid} joe\n+ Should Not Be Equal As Strings ${userid} joe@test.com\n+\n+\n+# DRY\n+\n+I register to the site\n+ Go to ${PLONE_URL}/@@register\n+ Get Text //body contains Registration form\n+ Type Text //input[@name="form.widgets.fullname"] joe doe\n+ Type Text //input[@name="form.widgets.username"] joe\n+ Type Text //input[@name="form.widgets.email"] joe@test.com\n+ Type Text //input[@name="form.widgets.password"] supersecret\n+ Type Text //input[@name="form.widgets.password_ctl"] supersecret\n+ Click //button[@name="form.buttons.register"]\n+\n+I login to the site\n+ Go to ${PLONE_URL}/login\n+ Get Text //body contains Login Name\n+ Type Text //input[@name="__ac_name"] joe\n+ Type Text //input[@name="__ac_password"] supersecret\n+ Click //button[@name="buttons.login"]\n+ Get Text //body contains You are now logged in\n\\ No newline at end of file\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/ff14636d7c8a33d8e41302259694ba012d2cb0da + +refactoring controlpanel_site robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_site.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_site.robot b/Products/CMFPlone/tests/robot/test_controlpanel_site.robot\nindex 1844ac2d65..1e02aa71e0 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_site.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_site.robot\n@@ -1,125 +1,115 @@\n-Documentation\n-... $ bin/robot-server Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-... $ bin/robot test_controlpanel_site.robot\n+*** Settings ***\n \n-*** Settings *****************************************************************\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n-Variables Products/CMFPlone/tests/robot/variables.py\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Resource keywords.robot\n+Variables variables.py\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Set Site Title in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I set the site title to \'My Site\'\n- Then the site title should be set to \'My Site\'\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I set the site title to \'My Site\'\n+ Then the site title should be set to \'My Site\'\n \n Scenario: Set Site Logo in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I set a custom logo\n- Then the site logo should be set to the custom logo\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I set a custom logo\n+ Then the site logo should be set to the custom logo\n \n Scenario: Enable Dublin Core Metadata in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I enable dublin core metadata\n- Then the dublin core metadata shows up on the site\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I enable dublin core metadata\n+ Then the dublin core metadata shows up on the site\n \n Scenario: Enable Sitemap in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I enable the sitemap\n- Then then I can see a sitemap\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I enable the sitemap\n+ Then then I can see a sitemap\n \n Scenario: Add Webstats Javascript in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I add a Javascript snippet to the webstats javascript\n- Then the Javascript snippet shows up on the site\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I add a Javascript snippet to the webstats javascript\n+ Then the Javascript snippet shows up on the site\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n the site control panel\n- Go to ${PLONE_URL}/@@site-controlpanel\n- Wait until page contains Site Settings\n+ Go to ${PLONE_URL}/@@site-controlpanel\n+ Get Text //body contains Site Settings\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I enable the sitemap\n- Given patterns are loaded\n- Wait For Element css=#formfield-form-widgets-enable_sitemap\n- Select Checkbox form.widgets.enable_sitemap:list\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_sitemap:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I set the site title to \'${site_title}\'\n- Given patterns are loaded\n- Input Text name=form.widgets.site_title ${site_title}\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Type Text //input[@name="form.widgets.site_title"] ${site_title}\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I set a custom logo\n- Given patterns are loaded\n- Choose File name=form.widgets.site_logo ${PATH_TO_TEST_FILES}/pixel.png\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Upload File By Selector //input[@name="form.widgets.site_logo"] ${PATH_TO_TEST_FILES}/pixel.png\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable dublin core metadata\n- Given patterns are loaded\n- Select Checkbox form.widgets.exposeDCMetaTags:list\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.exposeDCMetaTags:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I add a Javascript snippet to the webstats javascript\n- Given patterns are loaded\n- Input Text name=form.widgets.webstats_js \n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Type Text //textarea[@name="form.widgets.webstats_js"] \n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n the site title should be set to \'${expected_site_title}\'\n- Go To ${PLONE_URL}\n- ${actual_site_title}= Get title\n- Should be equal ${actual_site_title} ${expected_site_title}\n+ Go To ${PLONE_URL}\n+ Get Text //head/title should be ${expected_site_title}\n \n the site logo should be set to the custom logo\n- Go To ${PLONE_URL}\n- Wait Until Element Is Visible css=#portal-logo\n- Page should contain element //*[@id="portal-logo"]/img[contains(@src,\'@@site-logo/pixel.png\')]\n+ Go To ${PLONE_URL}\n+ Get Element Count //*[@id="portal-logo"]/img[contains(@src,\'@@site-logo/pixel.png\')] should be 1\n \n then I can see a sitemap\n- Go to ${PLONE_URL}/sitemap.xml.gz\n- # We need a \'Download file\' selenium2library keyword to test this:\n- # https://github.com/rtomac/robotframework-selenium2library/issues/24\n+\n+ Import library OperatingSystem\n+\n+ # this is for robotframework browser > 17\n+ Download ${PLONE_URL}/sitemap.xml.gz saveAs=/tmp/sitemap.xml.gz\n+ File Should Exist /tmp/sitemap.xml.gz\n+\n+ # this is for robotframework browser < 18.0\n+ # ${file_object}= Download ${PLONE_URL}/sitemap.xml.gz\n+ # File Should Exist ${file_object.saveAs}\n \n the dublin core metadata shows up on the site\n- Go to ${PLONE_URL}\n- Wait until page contains Powered by Plone\n- Page should contain element xpath=//html/head/meta[@name=\'DC.date.modified\']\n- Page should contain element xpath=//html/head/meta[@name=\'DC.format\']\n- Page should contain element xpath=//html/head/meta[@name=\'DC.type\']\n- Page should contain element xpath=//html/head/meta[@name=\'DC.date.created\']\n- Page should contain element xpath=//html/head/meta[@name=\'DC.language\']\n+ Go to ${PLONE_URL}\n+ Get Element Count //html/head/meta[@name="DC.date.modified"] should be 1\n+ Get Element Count //html/head/meta[@name="DC.format"] should be 1\n+ Get Element Count //html/head/meta[@name="DC.type"] should be 1\n+ Get Element Count //html/head/meta[@name="DC.date.created"] should be 1\n+ Get Element Count //html/head/meta[@name="DC.language"] should be 1\n \n the Javascript snippet shows up on the site\n- Go to ${PLONE_URL}\n- Wait until page contains Powered by Plone\n- Page should contain element id=webstats_snippet\n+ Go to ${PLONE_URL}\n+ Get Element Count //*[@id="webstats_snippet"] should be 1\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/22eb8e2012e451a5ac9fade6aba5312337cb68cf + +refactoring controlpanel_social robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_social.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_social.robot b/Products/CMFPlone/tests/robot/test_controlpanel_social.robot\nindex 2fae936771..01239426e3 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_social.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_social.robot\n@@ -1,78 +1,69 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Social settings are provided\n- Given a logged-in site administrator\n- and the social control panel\n- When I provide social settings\n- Then social tags should exist for anonymous\n+ Given a logged-in site administrator\n+ and the social control panel\n+ When I provide social settings\n+ Then social tags should exist for anonymous\n \n Scenario: Social tags are disabled\n- Given a logged-in site administrator\n- and the social control panel\n- When I provide social settings\n- When I disable social\n- Then social tags should not exist\n-\n+ Given a logged-in site administrator\n+ and the social control panel\n+ When I provide social settings\n+ When I disable social\n+ Then social tags should not exist\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the social control panel\n- Go to ${PLONE_URL}/@@social-controlpanel\n- Wait until page contains Social Media Settings\n+ Go to ${PLONE_URL}/@@social-controlpanel\n+ Get Text //body contains Social Media Settings\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I disable social\n- UnSelect Checkbox form.widgets.share_social_data:list\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@name="form.widgets.share_social_data:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I provide social settings\n- Input Text name=form.widgets.twitter_username plonecms\n- Input Text name=form.widgets.facebook_app_id 123456\n- Input Text name=form.widgets.facebook_username plonecms\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Type Text //input[@name="form.widgets.twitter_username"] plonecms\n+ Type Text //input[@name="form.widgets.facebook_app_id"] 123456\n+ Type Text //input[@name="form.widgets.facebook_username"] plonecms\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n social tags should exist for anonymous\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Page should not contain element css=meta[name="twitter:site"]\n- Page should not contain element css=meta[property="og:article:publisher"]\n- Page should not contain element css=meta[property="fb:app_id"]\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Page should contain element css=meta[name="twitter:site"]\n- Page should contain element css=meta[property="og:article:publisher"]\n- Page should contain element css=meta[property="fb:app_id"]\n+ Go to ${PLONE_URL}\n+ Get Element Count //meta[@name="twitter:site"] should be 0\n+ Get Element Count //meta[@property="og:article:publisher"] should be 0\n+ Get Element Count //meta[@property="fb:app_id"] should be 0\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Element Count //meta[@name="twitter:site"] should be 1\n+ Get Element Count //meta[@property="og:article:publisher"] should be 1\n+ Get Element Count //meta[@property="fb:app_id"] should be 1\n \n social tags should not exist\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Page should not contain element css=meta[name="twitter:site"]\n- Page should not contain element css=meta[property="og:article:publisher"]\n- Page should not contain element css=meta[property="fb:app_id"]\n+ Go to ${PLONE_URL}\n+ Get Element Count //meta[@name="twitter:site"] should be 0\n+ Get Element Count //meta[@property="og:article:publisher"] should be 0\n+ Get Element Count //meta[@property="fb:app_id"] should be 0\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/3ce8327ea4d1c14e36f9cc909f03195809a6b1c3 + +refactoring controlpanel_types robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_types.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_types.robot b/Products/CMFPlone/tests/robot/test_controlpanel_types.robot\nindex 56fed5385a..4413ba0437 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_types.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_types.robot\n@@ -1,86 +1,50 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n-\n-Scenario: Allow comments for Link Type\n- Given a logged-in manager\n- and Globally enabled comments\n- and the types control panel\n- When I select \'Link\' in types dropdown\n- and Allow discussion\n- Then Wait until page contains Content Settings\n- When I add new Link \'my_link\'\n- Then Link \'my_link\' should have comments enabled\n \n+*** Test Cases ***\n Scenario: Change default workflow\n- Given a logged-in site administrator\n- and the types control panel\n- When I select \'Single State Workflow\' workflow\n- Then Wait until page contains Content Settings\n- When I add new Link \'my_link\'\n- Then Link \'my_link\' should have Single State Workflow enabled\n+ Given a logged-in site administrator\n+ and the types control panel\n+ When I select \'Single State Workflow\' workflow\n+ and I add new Link \'my_link\'\n+ Then Link \'my_link\' should have Single State Workflow enabled\n \n \n-*** Keywords *****************************************************************\n-\n-# --- GIVEN ------------------------------------------------------------------\n-\n-a logged-in manager\n- Enable autologin as Manager\n+*** Keywords ***\n \n+# GIVEN\n the types control panel\n- Go to ${PLONE_URL}/@@content-controlpanel\n- Wait until page contains Content Settings\n-\n-Globally enabled comments\n- Go to ${PLONE_URL}/@@discussion-settings\n- Wait until page contains Discussion settings\n- Select checkbox name=form.widgets.globally_enabled:list\n- Click button Save\n+ Go to ${PLONE_URL}/@@content-controlpanel\n+ Get Text //body contains Content Settings\n \n \n-\n-# --- WHEN -------------------------------------------------------------------\n-\n-I select \'${content_type}\' in types dropdown\n- Select from list by label name=type_id ${content_type}\n- Wait until page contains Globally addable\n-\n-Allow discussion\n- Select checkbox name=allow_discussion:boolean\n- Click Button Save\n-\n+# WHEN\n I select \'${workflow}\' workflow\n- Select from list by label name=new_workflow ${workflow}\n- Click Button Save\n+ Select Options By //select[@name="new_workflow"] label ${workflow}\n+ Click //button[@name="form.button.Save"]\n+ Wait For Condition Text //body contains Content Settings\n \n-I add new Link \'${id}\'\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Create content type=Link id=${id} title=${id} remoteUrl=http://www.starzel.de\n \n+I add new Link \'${id}\'\n+ Go to ${PLONE_URL}\n+ Create content\n+ ... type=Link\n+ ... id=${id}\n+ ... title=${id}\n+ ... remoteUrl=https://www.plone.org\n \n-# --- THEN -------------------------------------------------------------------\n \n-Link \'${id}\' should have comments enabled\n- Go to ${PLONE_URL}/${id}\n- Wait until page contains ${id}\n- Page should contain element xpath=//div[@id="commenting"]\n+# THEN\n \n Link \'${id}\' should have Single State Workflow enabled\n- Go to ${PLONE_URL}/${id}\n- Wait until page contains ${id}\n- # We check that single state worklow is used, publish button is not present\n- Page should not contain element xpath=//a[@id="workflow-transition-publish"]\n+ Go to ${PLONE_URL}/${id}\n+ # We check that single state worklow is used, publish button is not present\n+ Get Element Count //a[@id="workflow-transition-publish"] should be 0\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/580f64ef956cb902bc14be0b803394e5dbd0edc5 + +refactoring controlpanel_usergroups robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot b/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot\nindex 0a4a2a9e1c..1b041b035e 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot\n@@ -1,123 +1,103 @@\n-# ============================================================================\n-# Tests for the Plone Usergroups Control Panel\n-# ============================================================================\n-#\n-# $ bin/robot-server --reload-path src/Products.CMFPlone/Products/CMFPlone/ Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-#\n-# $ bin/robot src/Products.CMFPlone/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot\n-#\n-# ============================================================================\n+*** Settings ***\n \n-*** Settings *****************************************************************\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Resource keywords.robot\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Show all users in users control panel\n- Given a logged-in site administrator\n- and the users control panel\n- When I click show all users\n- Then all users should be shown\n+ Given a logged-in site administrator\n+ and the users control panel\n+ When I click show all users\n+ Then all users should be shown\n \n Scenario: Show all groups in groups control panel\n- Given a logged-in site administrator\n- and the groups control panel\n- When I click show all groups\n- Then all groups should be shown\n+ Given a logged-in site administrator\n+ and the groups control panel\n+ When I click show all groups\n+ Then all groups should be shown\n \n Scenario: Create new group\n- Given a logged-in site administrator\n- and the groups control panel\n- When I create new group\n- Then new group should show under all groups\n+ Given a logged-in site administrator\n+ and the groups control panel\n+ When I create new group\n+ and I click show all groups\n+ Then new group should show under all groups\n \n Scenario: Enable many groups and many users settings in usergroups control panel\n- Given a logged-in site administrator\n- and the user group settings control panel\n- When I enable many groups and many users settings\n- Then showing all users is disabled\n- and showing all groups is disabled\n-\n+ Given a logged-in site administrator\n+ and the user group settings control panel\n+ When I enable many groups and many users settings\n+ Then showing all users is disabled\n+ and showing all groups is disabled\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the users control panel\n- Go to ${PLONE_URL}/@@usergroup-userprefs\n- Wait until page contains User Search\n+ Go to ${PLONE_URL}/@@usergroup-userprefs\n+ Get Text //body contains User Search\n \n the groups control panel\n- Go to ${PLONE_URL}/@@usergroup-groupprefs\n- Wait until page contains Group Search\n+ Go to ${PLONE_URL}/@@usergroup-groupprefs\n+ Get Text //body contains Group Search\n \n the user group settings control panel\n- Go to ${PLONE_URL}/@@usergroup-controlpanel\n- Wait until page contains User and Groups Settings\n+ Go to ${PLONE_URL}/@@usergroup-controlpanel\n+ Get Text //body contains User and Groups Settings\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I click show all users\n- Click button Show all\n- Wait until page contains User Search\n+ Click //button[@name="form.button.FindAll"]\n+ Get Text //body contains User Search\n \n I click show all groups\n- Click button Show all\n- Wait until page contains Group Search\n+ Click //button[@name="form.button.FindAll"]\n+ Get Text //body contains Group Search\n \n I create new group\n- Click link Add New Group\n- Wait until page contains element name=addname\n- patterns are loaded\n- Input Text name=addname my-new-group\n- Input Text name=title:string My New Group\n- Input Text name=description:text This is my new group\n- Input Text name=email:string my-group@plone.org\n- Submit Form id=createGroup\n-# "Click button Save" does not work for modals. See https://stackoverflow.com/questions/17602334/element-is-not-currently-visible-and-so-may-not-be-interacted-with-but-another for details.\n- I click show all groups\n- Page should contain my-new-group\n+ Click //a[@id="add-group"]\n+ Type Text //input[@name="addname"] my-new-group\n+ Type Text //input[@name="title:string"] My New Group\n+ Type Text //textarea[@name="description:text"] This is my new group\n+ Type Text //input[@name="email:string"] my-group@plone.org\n+ Click //form[@id="createGroup"]//button[@name="form.button.Save"]\n \n I enable many groups and many users settings\n- Select Checkbox name=form.widgets.many_groups:list\n- Select Checkbox name=form.widgets.many_users:list\n- Click button Save\n- Wait until page contains Data successfully updated.\n+ Check Checkbox //input[@name="form.widgets.many_groups:list"]\n+ Check Checkbox //input[@name="form.widgets.many_users:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Data successfully updated.\n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n all users should be shown\n- Page should contain test-user\n- Page should contain admin\n+ Get Text //body contains test-user\n+ Get Text //body contains admin\n \n all groups should be shown\n- Page should contain Administrators\n- Page should contain Authenticated Users (Virtual Group) (AuthenticatedUsers)\n- Page should contain Reviewers\n- Page should contain Site Administrators\n+ Get Text //body contains Administrators\n+ Get Text //body contains Authenticated Users (Virtual Group) (AuthenticatedUsers)\n+ Get Text //body contains Reviewers\n+ Get Text //body contains Site Administrators\n \n showing all users is disabled\n- the users control panel\n- Page should not contain Show all\n+ the users control panel\n+ Get Text //body not contains Show all\n \n showing all groups is disabled\n- the users control panel\n- Page should not contain Show all\n+ the groups control panel\n+ Get Text //body not contains Show all\n \n new group should show under all groups\n- Page should contain my-new-group\n+ Get Text //body contains my-new-group\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/fb830b0b55808c5fd8aad5acbfd1655b5696cc8b + +refactoring edit_user_schema robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_edit_user_schema.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_edit_user_schema.robot b/Products/CMFPlone/tests/robot/test_edit_user_schema.robot\nindex 439bb5b074..60e1a0a691 100644\n--- a/Products/CMFPlone/tests/robot/test_edit_user_schema.robot\n+++ b/Products/CMFPlone/tests/robot/test_edit_user_schema.robot\n@@ -1,36 +1,23 @@\n-# ============================================================================\n-# Tests Editing the User Schema\n-# ============================================================================\n-#\n-# $ bin/robot-server --reload-path src/Products.CMFPlone/Products/CMFPlone/ Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-#\n-# $ bin/robot src/Products.CMFPlone/Products/CMFPlone/tests/robot/test_edit_user_schema.robot\n-#\n-# ============================================================================\n-\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n-\n-Library Remote ${PLONE_URL}/RobotRemote\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource keywords.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n \n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: As a manager I can add a field to the registration form\n- Given a logged-in manager\n- and the mail setup configured\n- and site registration enabled\n- When I add a new text field to the member fields\n- and choose to show the field on registration\n- Then an anonymous user will see the field in the registration form\n+ Given a logged-in manager\n+ and the mail setup configured\n+ and site registration enabled\n+ When I add a new text field to the member fields\n+ and choose to show the field on registration\n+ Then an anonymous user will see the field in the registration form\n \n Scenario: As a manager I can add a field to the user form\n Given a logged-in manager\n@@ -41,12 +28,12 @@ Scenario: As a manager I can add a field to the user form\n Then a logged-in user will see the field in the user profile\n \n Scenario: As a manager I can add a required field to the user form\n- Given a logged-in manager\n- and the mail setup configured\n- and site registration enabled\n- When I add a new required text field to the member fields\n- and choose to show the field in the user profile\n- Then a logged-in user will see the required field in the user profile\n+ Given a logged-in manager\n+ and the mail setup configured\n+ and site registration enabled\n+ When I add a new required text field to the member fields\n+ and choose to show the field in the user profile\n+ Then a logged-in user will see the required field in the user profile\n \n Scenario: As a manager I can move user form fields\n Pass Execution Drag and drop in schemaeditor does not work\n@@ -69,111 +56,92 @@ Scenario: As a manager I can add a field with constraints to the registration fo\n \n \n \n-*** Keywords *****************************************************************\n-\n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n-\n-a logged-in manager\n- Enable autologin as Manager\n+# GIVEN\n \n site registration enabled\n- Go To ${PLONE_URL}/@@security-controlpanel\n- Wait until page contains Security Settings\n- Wait until page contains element form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_self_reg:list\n- Click Button Save\n- Wait until page contains Changes saved.\n-\n+ Go To ${PLONE_URL}/@@security-controlpanel\n+ Get Text //body contains Security Settings\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I add a new text field to the member fields\n- Go to ${PLONE_URL}/@@member-fields\n- Wait until page contains element css=#add-field\n- Click Link Add new field\xe2\x80\xa6\n- Wait Until Element Is visible css=#add-field-form #form-widgets-title\n- Input Text css=#add-field-form #form-widgets-title Test Field\n- Press Keys css=#add-field-form #form-widgets-title TAB\n- Select From List By Label css=#form-widgets-factory Text line (String)\n- Click button css=.pattern-modal-buttons button#form-buttons-add\n- Wait until page contains Field added successfully.\n+ Go to ${PLONE_URL}/@@member-fields\n+ Click //a[@id="add-field"]\n+ Type Text //form[@id="add-field-form"]//input[@name="form.widgets.title"] Test Field\n+ Press Keys //form[@id="add-field-form"]//input[@name="form.widgets.title"] Tab\n+ Select Options By //form[@id="add-field-form"]//select[@name="form.widgets.factory:list"] label Text line (String)\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.add"]\n+ Get Text //body contains Field added successfully.\n \n I Open the test_field Settings\n- Go to ${PLONE_URL}/@@member-fields\n- Wait For Element css=div[data-field_id=\'test_field\']\n- Wait For Then Click Element css=div[data-field_id=\'test_field\'] a.fieldSettings\n+ Go to ${PLONE_URL}/@@member-fields\n+ Click //div[@data-field_id="test_field"]//a[contains(@class,"fieldSettings")]\n \n I add a new required text field to the member fields\n- Go to ${PLONE_URL}/@@member-fields\n- Wait until page contains element css=#add-field\n- Click Link Add new field\xe2\x80\xa6\n- Wait Until Element Is visible css=#add-field-form #form-widgets-title\n- Input Text css=#add-field-form #form-widgets-title Test Field\n- Press Keys css=#add-field-form #form-widgets-title TAB\n- Select From List By Label css=#form-widgets-factory Text line (String)\n- Select Checkbox form.widgets.required:list\n- Click button css=.pattern-modal-buttons button#form-buttons-add\n- Wait until page contains Field added successfully.\n+ Go to ${PLONE_URL}/@@member-fields\n+ Click //a[@id="add-field"]\n+ Type Text //form[@id="add-field-form"]//input[@name="form.widgets.title"] Test Field\n+ Press Keys //form[@id="add-field-form"]//input[@name="form.widgets.title"] Tab\n+ Select Options By //form[@id="add-field-form"]//select[@name="form.widgets.factory:list"] label Text line (String)\n+ Check Checkbox //input[@name="form.widgets.required:list"]\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.add"]\n+ Get Text //body contains Field added successfully.\n \n choose to show the field on registration\n- I Open the test_field Settings\n- Wait Until Element Is visible form.widgets.IUserFormSelection.forms:list\n- Select Checkbox css=#form-widgets-IUserFormSelection-forms-0\n- Click button css=.pattern-modal-buttons button#form-buttons-save\n- Wait until page contains Data successfully updated.\n+ I Open the test_field Settings\n+ Check Checkbox //input[@name="form.widgets.IUserFormSelection.forms:list" and @value="On Registration"]\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.save"]\n+ Get Text //body contains Data successfully updated.\n \n choose to show the field in the user profile\n- I Open the test_field Settings\n- Wait Until Element Is visible form.widgets.IUserFormSelection.forms:list\n- Select Checkbox css=#form-widgets-IUserFormSelection-forms-1\n- Click button css=.pattern-modal-buttons button#form-buttons-save\n- Wait until page contains Data successfully updated.\n+ I Open the test_field Settings\n+ Check Checkbox //input[@name="form.widgets.IUserFormSelection.forms:list" and @value="In User Profile"]\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.save"]\n+ Get Text //body contains Data successfully updated.\n \n I move the new field to the top\n- # XXX: Drag and drop is not working!!!\n- Drag And Drop xpath=//div[@data-field_id="test_field"]//span[contains(@class, "draghandle")] xpath=//div[@data-field_id="home_page"]\n+ Drag And Drop //div[@data-field_id="test_field"]//span[contains(@class, "draghandle")] //div[@data-field_id="home_page"]\n+\n \n add a min/max constraint to the field\n- I Open the test_field Settings\n- Wait until page contains element form.widgets.min_length\n- Input Text form.widgets.min_length 4\n- Input Text form.widgets.max_length 6\n- Wait Until Element Is visible css=.pattern-modal-buttons button#form-buttons-save\n- Click Button css=.pattern-modal-buttons button#form-buttons-save\n- Sleep 1\n+ I Open the test_field Settings\n+ Type Text //input[@name="form.widgets.min_length"] 4\n+ Type Text //input[@name="form.widgets.max_length"] 6\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.save"]\n+ Get Text //body contains Data successfully updated.\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n an anonymous user will see the field in the registration form\n- Disable Autologin\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Register\n- Page should contain element form.widgets.test_field\n+ Disable Autologin\n+ Go to ${PLONE_URL}/@@register\n+ Get Text //body contains Register\n+ Get Element Count //input[@name="form.widgets.test_field"] should be 1\n \n a logged-in user will see the field in the user profile\n- Disable Autologin\n- Enable autologin as Member\n- Go to ${PLONE_URL}/@@personal-information\n- Wait until page contains Change your personal information\n- Page should contain element form.widgets.test_field\n+ Disable Autologin\n+ a logged-in member\n+ Go to ${PLONE_URL}/@@personal-information\n+ Get Element Count //input[@name="form.widgets.test_field"] should be 1\n \n a logged-in user will see the required field in the user profile\n- a logged-in user will see the field in the user profile\n- Page Should Contain Element //div[@id=\'formfield-form-widgets-test_field\']//span[contains(@class, \'required\')] limit=1 message=test_field should be required\n+ a logged-in user will see the field in the user profile\n+ Get Element Count //div[@id=\'formfield-form-widgets-test_field\']//span[contains(@class, \'required\')] should be 1 message=test_field should be required\n \n a logged-in user will see the field on top of the user profile\n- a logged-in user will see the field in the user profile\n- Page Should Contain Element //form[@id=\'form\']/div[1]//input[@id=\'form-widgets-test_field\'] limit=1 message=test_field should be on top\n+ a logged-in user will see the field in the user profile\n+ Get Element Count //form[@id=\'form\']/div[1]//input[@id=\'form-widgets-test_field\'] should be 1 message=test_field should be on top\n \n a logged-in user will see a field with min/max constraints\n- a logged-in user will see the field in the user profile\n- Input Text form.widgets.email test@plone.org\n- Wait For Element css=#form-widgets-test_field\n- Input Text form.widgets.test_field 1\n- Wait For Then Click Element css=.formControls button#form-buttons-save\n- Wait until page contains There were some errors.\n- Page should contain Value is too short\n+ a logged-in user will see the field in the user profile\n+ Type Text //input[@name="form.widgets.email"] test@plone.org\n+ Type Text //input[@name="form.widgets.test_field"] 1\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains There were some errors.\n+ Get Text //body contains Value is too short\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/19a467e345bbf6854fd27edd46a6d4d611cb754d + +refactoring edit robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_edit.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_edit.robot b/Products/CMFPlone/tests/robot/test_edit.robot\nindex 944595e38e..0da4bb7580 100644\n--- a/Products/CMFPlone/tests/robot/test_edit.robot\n+++ b/Products/CMFPlone/tests/robot/test_edit.robot\n@@ -1,24 +1,23 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Variables ****************************************************************\n+*** Variables ***\n \n ${TITLE} An edited page\n+${LINK_TITLE} An edited link item\n ${PAGE_ID} an-edited-page\n+${LINK_ID} an-edited-link-item\n \n \n-*** Test cases ***************************************************************\n+*** Test cases ***\n \n Scenario: A page is opened to edit\n Given a logged-in site administrator\n@@ -29,7 +28,7 @@ Scenario: A page is opened to edit\n Scenario: Switch tabs\n Given a logged-in site administrator\n and an edited page\n- When i click the Categorization tab\n+ When i click the \'Categorization\' tab\n Then the Categorization tab is shown\n and no other tab is shown\n \n@@ -37,9 +36,8 @@ Scenario: Adding a related item\n # Order of the next two lines is important\n # First we\'re creating a new item and then editing the original page\n Given a logged-in site administrator\n- and at least one other item\n and an edited page\n- When i click the Categorization tab\n+ When i click the \'Categorization\' tab\n and i select a related item\n and i save the page\n Then the related item is shown in the page\n@@ -62,51 +60,78 @@ Scenario: Form dropdowns follows DateTime widget values\n and i select a date using the widget\n Then form dropdowns should not have the default values anymore\n \n+Scenario: A link item is opened to edit\n+ Given a logged-in site administrator\n+ and an edited link item\n+ Then i have the title input field\n+ and i can only see the default tab\n+\n+Scenario: Add an internal link to linked item\n+ Given a logged-in site administrator\n+ and an edited link item\n+ and i select a linked item\n+ and i save the page\n+ Then the linked item is shown in the page\n+ and Capture page screenshot and log source\n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n an edited page\n- Create content type=Document title=${TITLE}\n- Go to ${PLONE_URL}/${PAGE_ID}/edit\n- Wait until page contains Edit Page\n+ Create content\n+ ... type=Document\n+ ... title=${TITLE}\n+ Go to ${PLONE_URL}/${PAGE_ID}/edit\n+ Get Text //body contains Edit Page\n+\n+an edited link item\n+ Create content\n+ ... type=Link\n+ ... title=${LINK_TITLE}\n+ Go to ${PLONE_URL}/${LINK_ID}/edit\n+ Get Text //body contains Edit Link\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I have the title input field\n- Element Should Be Visible xpath=//fieldset[@id=\'fieldset-default\']\n+ Get Element States //fieldset[@id=\'fieldset-default\'] contains visible\n \n I can only see the default tab\n- Wait For Condition return window.jQuery(\'.autotoc-nav .active:visible\').length > 0\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-settings\']\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-dates\']\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-categorization\']\n+ Get Element States //fieldset[@id=\'fieldset-default\'] contains visible\n+ Get Element States //fieldset[@id=\'fieldset-dates\'] not contains visible\n+ Get Element States //fieldset[@id=\'fieldset-categorization\'] not contains visible\n \n I click the ${tab} tab\n- Given patterns are loaded\n- Click link ${tab}\n+ Click //a[contains(text(),${tab})]\n \n I select a related item\n- Wait For Then Click Element jquery=.pat-relateditems-container ul.select2-choices:visible\n- Wait For Then Click Element jquery=a.pat-relateditems-result-select:first\n+ Click //div[@id="formfield-form-widgets-IRelatedItems-relatedItems"]//button[contains(text(), "Browse")]\n+ Wait For Condition Element States //div[@id="select2-drop"]//ul[@class="select2-results"] contains visible\n+ Click //a[@data-path="/test-folder" and contains(@class,"selectable")]\n+\n+I select a linked item\n+ Click //div[@id="formfield-form-widgets-remoteUrl"]//button[contains(text(), "Browse")]\n+ Wait For Condition Element States //div[@id="select2-drop"]//ul[@class="select2-results"] contains visible\n+ Click //a[@data-path="/test-folder" and contains(@class,"selectable")]\n+\n \n I save the page\n- Click Button Save\n+ Click //button[@name="form.buttons.save"]\n \n I click the calendar icon\n- Click Element xpath=//span[@id=\'edit_form_effectiveDate_0_popup\']\n- Element Should Be Visible xpath=//div[@class=\'calendar\']\n+ Click //span[@id=\'edit_form_effectiveDate_0_popup\']\n+ Get Element States //div[@class=\'calendar\'] contains visible\n \n I select a date using the widget\n- Click Element xpath=//div[@class=\'calendar\']/table/thead/tr[2]/td[4]/div\n+ Click //div[@class=\'calendar\']/table/thead/tr[2]/td[4]/div\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n popup calendar should have the same date\n- Element Text Should Be xpath=//div[@class=\'calendar\']//thead//td[@class=\'title\'] January, 2001\n+ Get Text //div[@class=\'calendar\']//thead//td[@class=\'title\'] should be January, 2001\n \n form dropdowns should not have the default values anymore\n ${yearLabel} = Get Selected List Label xpath=//select[@id=\'edit_form_effectiveDate_0_year\']\n@@ -117,21 +142,20 @@ form dropdowns should not have the default values anymore\n Should Not Be Equal ${dayLabel} --\n \n the related item is shown in the page\n- Page should contain element css=#section-related\n+ Get Element Count //*[@id="section-related"] should be 1\n+\n+the linked item is shown in the page\n+ # check if the selected testfolder is linked\n+ Get Element Count //a[@href=\'${PLONE_URL}/test-folder\'] greater than 0\n+\n \n an overlay pops up\n- Wait Until Page Contains Element xpath=//div[contains(@class, \'overlay\')]//input[@class=\'insertreference\']\n+ Get Element Count //div[contains(@class, \'overlay\')]//input[@class=\'insertreference\'] should be 1\n \n the categorization tab is shown\n- Element Should Be Visible xpath=//fieldset[@id=\'fieldset-categorization\']\n+ Get Element States //fieldset[@id=\'fieldset-categorization\'] contains visible\n \n no other tab is shown\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-dates\']\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-default\']\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-settings\']\n-\n-at least one other item\n- Go to ${PLONE_URL}/++add++Document\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${TITLE}\'); return 0;\n- Click Button Save\n+ Get Element States //fieldset[@id=\'fieldset-dates\'] not contains visible\n+ Get Element States //fieldset[@id=\'fieldset-default\'] not contains visible\n+ Get Element States //fieldset[@id=\'fieldset-settings\'] not contains visible\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/5e2e585c6798cbb1719b3da6d48edcaa55a720fd + +refactoring folder_contents robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_folder_contents.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_folder_contents.robot b/Products/CMFPlone/tests/robot/test_folder_contents.robot\nindex 1406b233e7..dcf33269b6 100644\n--- a/Products/CMFPlone/tests/robot/test_folder_contents.robot\n+++ b/Products/CMFPlone/tests/robot/test_folder_contents.robot\n@@ -1,18 +1,15 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test cases ***************************************************************\n+*** Test cases ***\n \n \n Scenario: Select All items\n@@ -21,14 +18,8 @@ Scenario: Select All items\n and the folder contents view\n When I select all the elements\n Then the selection count appears\n- and the four elements got selected\n and the clear selection link appears\n \n-Scenario: Clear selection\n- Given a logged-in site administrator\n- and a folder with four pages\n- and the folder contents view\n- And I select all the elements\n When I clear the selection\n Then no elements should be selected\n \n@@ -36,77 +27,88 @@ Scenario: Reorder Folder Contents\n Given a logged-in site administrator\n and a folder with four pages\n and the folder contents view\n- Then The Order Should Be 1 2 3 4\n+ Then The Order Should Be 1 2 3 4\n When I reorder the elements\n- Then The Order Should Be 4 3 2 1\n+ Then The Order Should Be 4 3 2 1\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n \n a folder with four pages\n- ${folder_uid}= Create content type=Folder title=My Folder\n- Create content type=Document title=Doc1 container=${folder_uid}\n- Create content type=Document title=Doc2 container=${folder_uid}\n- Create content type=Document title=Doc3 container=${folder_uid}\n- Create content type=Document title=Doc4 container=${folder_uid}\n+ ${folder_uid}= Create content\n+ ... type=Folder\n+ ... title=My Folder\n+ Create content\n+ ... type=Document\n+ ... title=Doc1\n+ ... container=${folder_uid}\n+ Create content\n+ ... type=Document\n+ ... title=Doc2\n+ ... container=${folder_uid}\n+ Create content\n+ ... type=Document\n+ ... title=Doc3\n+ ... container=${folder_uid}\n+ Create content\n+ ... type=Document\n+ ... title=Doc4\n+ ... container=${folder_uid}\n \n the folder contents view\n- Go to ${PLONE_URL}/my-folder/folder_contents\n- Given folder contents pattern loaded\n+ Go to ${PLONE_URL}/my-folder/folder_contents\n \n I click the \'${link_name}\' link\n- Click Link ${link_name}\n+ Click //a[contains(text(),${link_name})]\n \n I select all the elements\n- Wait until page contains element css=.pat-structure .select-all\n- Sleep 1s\n- ${select_all_selector} Set Variable .pat-structure .select-all\n- Wait Until Element Is Visible css=${select_all_selector}\n- Click Element css=${select_all_selector}\n-\n-the four elements got selected\n- Checkbox Should Be Selected css=tr[data-id="doc1"] input\n- Checkbox Should Be Selected css=tr[data-id="doc2"] input\n- Checkbox Should Be Selected css=tr[data-id="doc3"] input\n- Checkbox Should Be Selected css=tr[data-id="doc4"] input\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Check Checkbox //tr[@data-id="doc1"]//input[@type="checkbox"]\n+ Wait For Elements State //tr[@data-id="doc1"]//input[@type="checkbox"] checked timeout=10s\n+ Check Checkbox //tr[@data-id="doc2"]//input[@type="checkbox"]\n+ Wait For Elements State //tr[@data-id="doc2"]//input[@type="checkbox"] checked timeout=10s\n+ Check Checkbox //tr[@data-id="doc3"]//input[@type="checkbox"]\n+ Wait For Elements State //tr[@data-id="doc3"]//input[@type="checkbox"] checked timeout=10s\n+ Check Checkbox //tr[@data-id="doc4"]//input[@type="checkbox"]\n+ Wait For Elements State //tr[@data-id="doc4"]//input[@type="checkbox"] checked timeout=10s\n \n the selection count appears\n- Wait until page contains element css=#btn-selected-items .label-success\n- Element Should Contain css=#btn-selected-items .label-success 4\n+ Get Text //*[@id="btn-selected-items"]//*[contains(@class,"label-success")] should be 4\n \n the clear selection link appears\n- Page Should Contain Element css=a.remove-all\n+ Get Element Count //a[contains(@class,"remove-all")] greater than 0\n \n I clear the selection\n- Click link id=btn-selected-items\n- Click link css=a.remove-all\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Sleep 2s\n+ Check Checkbox //*[contains(@class,"pat-structure")]//input[contains(@class,"select-all")]\n+ Click //a[@id="btn-selected-items"]\n+ Click //a[contains(@class,"remove-all")]\n+\n \n no elements should be selected\n- Checkbox Should Not Be Selected css=tr[data-id="doc1"] input\n- Checkbox Should Not Be Selected css=tr[data-id="doc2"] input\n- Checkbox Should Not Be Selected css=tr[data-id="doc3"] input\n- Checkbox Should Not Be Selected css=tr[data-id="doc4"] input\n+ Get Checkbox State //tr[@data-id="doc1"]//input == unchecked\n+ Get Checkbox State //tr[@data-id="doc2"]//input == unchecked\n+ Get Checkbox State //tr[@data-id="doc3"]//input == unchecked\n+ Get Checkbox State //tr[@data-id="doc4"]//input == unchecked\n \n I reorder the elements\n- Click link css=#btn-structure-rearrange\n- Click element name=reversed\n- Click button css=#popover-structure-rearrange .btn-primary\n- Wait until page contains Successfully rearranged folder\n+ Click //a[@id="btn-structure-rearrange"]\n+ Check Checkbox //*[@id="popover-structure-rearrange"]//input[@name="reversed"]\n+ Click //*[@id="popover-structure-rearrange"]//button[contains(text(),"Rearrange")]\n+ Wait For Condition Text //body contains Successfully rearranged folder\n \n The Order Should Be\n- [Arguments] ${first} ${second} ${third} ${fourth}\n- Wait Until Element Is Visible css=#doc${first}\n- Wait Until Element Is Visible css=#doc${second}\n- Wait Until Element Is Visible css=#doc${third}\n- Wait Until Element Is Visible css=#doc${fourth}\n- Should be above css=tr[data-id="doc${first}"] css=tr[data-id="doc${second}"]\n- Should be above css=tr[data-id="doc${second}"] css=tr[data-id="doc${third}"]\n- Should be above css=tr[data-id="doc${third}"] css=tr[data-id="doc${fourth}"]\n+ [Arguments] ${first} ${second} ${third} ${fourth}\n+ Should be above //tr[@data-id="doc${first}"] //tr[@data-id="doc${second}"]\n+ Should be above //tr[@data-id="doc${second}"] //tr[@data-id="doc${third}"]\n+ Should be above //tr[@data-id="doc${third}"] //tr[@data-id="doc${fourth}"]\n \n Should be above\n- [Arguments] ${locator1} ${locator2}\n+ [Arguments] ${locator1} ${locator2}\n+\n+ ${locator1-position}= Get BoundingBox ${locator1} y\n+ ${locator2-position}= Get BoundingBox ${locator2} y\n \n- ${locator1-position} = Get vertical position ${locator1}\n- ${locator2-position} = Get vertical position ${locator2}\n- Should be true ${locator1-position} < ${locator2-position}\n+ Should be true ${locator1-position} < ${locator2-position}\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/5e939df0053842de2db86ba4ce6df60ab31cf053 + +refactoring linkintegrity robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_linkintegrity.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_linkintegrity.robot b/Products/CMFPlone/tests/robot/test_linkintegrity.robot\nindex b0c6fa4dbb..a0e61e0265 100644\n--- a/Products/CMFPlone/tests/robot/test_linkintegrity.robot\n+++ b/Products/CMFPlone/tests/robot/test_linkintegrity.robot\n@@ -1,144 +1,133 @@\n-# ============================================================================\n-# Tests for the Plone Link Integrity Support\n-# ============================================================================\n-#\n-# $ bin/robot-server --reload-path src/Products.CMFPlone/Products/CMFPlone/ Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-#\n-# $ bin/robot src/Products.CMFPlone/Products/CMFPlone/tests/robot/test_linkintegrity.robot\n-#\n-# ============================================================================\n+*** Settings ***\n \n-*** Settings *****************************************************************\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Resource keywords.robot\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: When page is linked show warning\n Given a logged-in site administrator\n and a page to link to\n and a page to edit\n- and a link in rich text\n- should show warning when deleting page\n-\n+ When I add a link in rich text\n+ Then I should see a warning when deleting page\n \n Scenario: After you fix linked page no longer show warning\n Given a logged-in site administrator\n- a page to link to\n+ and a page to link to\n and a page to edit\n- and a link in rich text\n- should show warning when deleting page\n- remove link to page\n- should not show warning when deleting page\n+ When I add a link in rich text\n+ Then I should see a warning when deleting page\n \n+ When I remove link to page\n+ Then I should not see a warning when deleting page\n \n Scenario: Show warning when deleting linked item from folder_contents\n- Given a logged-in site administrator\n- a page to link to\n- and a page to edit\n- and a link in rich text\n- should show warning when deleting page from folder_contents\n- remove link to page\n- should not show warning when deleting page from folder_contents\n-\n-\n-*** Keywords *****************************************************************\n+ Given a logged-in site administrator\n+ and a page to link to\n+ and a page to edit\n+ When I add a link in rich text\n+ Then I should see a warning when deleting page from folder_contents\n \n-# --- GIVEN ------------------------------------------------------------------\n+ When I remove link to page\n+ Then I should not see a warning when deleting page from folder_contents\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+*** Keywords ***\n \n+# GIVEN\n \n a page to link to\n- Create content type=Document id=foo title=Foo\n+ Create content\n+ ... type=Document\n+ ... id=foo\n+ ... title=Foo\n \n a page to edit\n- Create content type=Document id=bar title=Bar\n-\n-\n-a link in rich text\n- Go To ${PLONE_URL}/bar/edit\n- Wait until element is visible css=.tox-edit-area iframe\n- Select Frame css=.tox-edit-area iframe\n- Input text css=.mce-content-body foo\n- Execute Javascript function selectElementContents(el) {var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range);} var el = document.getElementById("tinymce"); selectElementContents(el);\n- UnSelect Frame\n- Click Button css=button[aria-label="Insert/edit link"]\n-\n- Given patterns are loaded\n- Wait until element is visible css=.pat-relateditems .select2-input.select2-default\n- Click Element css=.pat-relateditems .select2-input.select2-default\n- Wait until element is visible css=.pat-relateditems-result.one-level-up a.pat-relateditems-result-browse\n- Click Element css=.pat-relateditems-result.one-level-up a.pat-relateditems-result-browse\n- Wait until element is visible xpath=(//span[contains(., \'Foo\')])\n- Sleep 2s\n- Click Element xpath=(//span[contains(., \'Foo\')])\n- Wait until element is visible css=.pat-relateditems-item-title\n- Wait For Then Click Element css=.modal-footer .btn-primary\n- Wait For Then Click Element css=#form-buttons-save\n-\n-\n-should show warning when deleting page\n-\n- Go To ${PLONE_URL}/foo\n- Wait For Then Click Element css=#plone-contentmenu-actions > a\n- Wait For Then Click Element css=#plone-contentmenu-actions-delete\n- Wait until page contains element css=.breach-container .breach-item\n-\n-\n-should show warning when deleting page from folder_contents\n- Go To ${PLONE_URL}/folder_contents\n- Given folder contents pattern loaded\n- Wait For Then Click Element css=tr[data-id="foo"] input\n- Checkbox Should Be Selected css=tr[data-id="foo"] input\n- Wait until keyword succeeds 30 1 Page should not contain element css=#btn-delete.disabled\n-\n- Wait For Then Click Element css=#btngroup-mainbuttons #btn-delete\n- Wait until page contains element css=.popover-content .btn-danger\n- Page should contain element css=.breach-container .breach-item\n- Wait For Then Click Element css=#popover-delete .closeBtn\n- Checkbox Should Be Selected css=tr[data-id="foo"] input\n-\n-\n-should not show warning when deleting page from folder_contents\n- Go To ${PLONE_URL}/folder_contents\n- Given folder contents pattern loaded\n- Wait For Then Click Element css=tr[data-id="foo"] input\n- Checkbox Should Be Selected css=tr[data-id="foo"] input\n- Wait until keyword succeeds 30 1 Page should not contain element css=#btn-delete.disabled\n- Wait For Then Click Element css=#btngroup-mainbuttons #btn-delete\n- Wait until page contains element css=.popover-content .btn-danger\n- Page should not contain element css=.breach-container .breach-item\n- Wait For Then Click Element css=#popover-delete .applyBtn\n- Wait until page contains Successfully delete items\n- Wait until keyword succeeds 30 1 Page should not contain Element css=tr[data-id="foo"] input\n-\n-\n-should not show warning when deleting page\n- Go To ${PLONE_URL}/foo\n- Wait For Then Click Element css=#plone-contentmenu-actions > a\n- Wait For Then Click Element css=#plone-contentmenu-actions-delete\n- Page should not contain element css=.breach-container .breach-item\n-\n-\n-remove link to page\n- Go To ${PLONE_URL}/bar\n- Wait For Then Click Element css=#contentview-edit a\n- Wait For Element css=.tox-edit-area iframe\n- Select Frame css=.tox-edit-area iframe\n- Input text css=.mce-content-body foo\n- Execute Javascript function selectElementContents(el) {var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range);} var el = document.getElementById("tinymce"); selectElementContents(el);\n- UnSelect Frame\n- Click Button css=button[aria-label="Remove link"]\n- Wait For Then Click Element css=#form-buttons-save\n+ Create content\n+ ... type=Document\n+ ... id=bar\n+ ... title=Bar\n+\n+# When\n+I add a link in rich text\n+ Go To ${PLONE_URL}/bar/edit\n+ Fill text to tinymce editor foo\n+ Mark text foo in tinymce editor\n+ Click //button[@aria-label="Insert/edit link"]\n+ Wait For Condition Element States //div[@class="modal-content"] contains visible\n+ Click //div[@class="modal-body"]//fieldset[@data-linktype="internal"]//button[contains(@class,"mode") and contains(@class,"browse")]\n+ Click //a[@title="Go one level up"]\n+ Click //a[contains(@class,"selectable") and @data-path="/foo"]\n+ Click //div[contains(@class,"modal-footer")]//input[@name="insert"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n+I remove link to page\n+ Go To ${PLONE_URL}/bar\n+ Click //*[@id="contentview-edit"]//a\n+ Fill text to tinymce editor foo\n+ Mark text foo in tinymce editor\n+ Click //button[@aria-label="Remove link"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n+# Then\n+\n+I should see a warning when deleting page\n+ Go To ${PLONE_URL}/foo\n+ Click //*[@id="plone-contentmenu-actions"]/a\n+ Click //*[@id="plone-contentmenu-actions-delete"]\n+ Get Element Count //*[contains(@class,"breach-container")]//*[contains(@class,"breach-item")] greater than 0\n+\n+I should not see a warning when deleting page\n+ Go To ${PLONE_URL}/foo\n+ Click //*[@id="plone-contentmenu-actions"]/a\n+ Click //*[@id="plone-contentmenu-actions-delete"]\n+ Get Element Count //*[contains(@class,"breach-container")]//*[contains(@class,"breach-item")] should be 0\n+\n+\n+I should see a warning when deleting page from folder_contents\n+ Go To ${PLONE_URL}/folder_contents\n+ Check Checkbox //tr[@data-id="foo"]//input\n+ Get Checkbox State //tr[@data-id="foo"]//input == checked\n+ Get Element Count //*[@id="btngroup-mainbuttons"]//a[@id="btn-delete" and contains(@class,"disabled")] should be 0\n+ Click //*[@id="btngroup-mainbuttons"]//a[@id="btn-delete"]\n+ Get Element Count //*[contains(@class,"breach-container")]//*[contains(@class,"breach-item")] greater than 0\n+ Get Checkbox State //tr[@data-id="foo"]//input == checked\n+\n+\n+I should not see a warning when deleting page from folder_contents\n+ Go To ${PLONE_URL}/folder_contents\n+ Check Checkbox //tr[@data-id="foo"]//input\n+ Get Checkbox State //tr[@data-id="foo"]//input == checked\n+ Get Element Count //*[@id="btngroup-mainbuttons"]//a[@id="btn-delete" and contains(@class,"disabled")] should be 0\n+ Click //*[@id="btngroup-mainbuttons"]//a[@id="btn-delete"]\n+ Get Element States //*[@id="popover-delete"]//*[contains(@class,"popover-content")] contains visible\n+ Get Element Count //*[contains(@class,"breach-container")]//*[contains(@class,"breach-item")] should be 0\n+ Click //*[contains(@class,"popover-content")]//button[contains(@class,"applyBtn")]\n+ Get Text //body contains Successfully delete items\n+ Get Element Count //tr[@data-id="foo"]//input should be 0\n+\n+# DRY\n+\n+Mark text foo in tinymce editor\n+\n+ # select the text `heading` via javascript\n+ Evaluate JavaScript ${None}\n+ ... () => {\n+ ... let iframe_document = document.querySelector(".tox-edit-area iframe").contentDocument;\n+ ... let body = iframe_document.body;\n+ ... let p = body.firstChild;\n+ ... let range = new Range();\n+ ... range.setStart(p.firstChild, 0);\n+ ... range.setEnd(p.firstChild, 3);\n+ ... iframe_document.getSelection().removeAllRanges();\n+ ... iframe_document.getSelection().addRange(range);\n+ ... }\n+ ... all_elements=False\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/fa15014e24fa0a3b78ae5674d69ff7e5b500b3f1 + +refactoring livesearch robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_livesearch.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_livesearch.robot b/Products/CMFPlone/tests/robot/test_livesearch.robot\nindex 8bed725311..a8a2c33ee5 100644\n--- a/Products/CMFPlone/tests/robot/test_livesearch.robot\n+++ b/Products/CMFPlone/tests/robot/test_livesearch.robot\n@@ -1,84 +1,82 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Variables Products/CMFPlone/tests/robot/variables.py\n+Variables variables.py\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test cases ***************************************************************\n+*** Test cases ***\n \n \n Scenario: Simple Livesearch\n Given a logged-in site administrator\n- and a document Welcome to Plone\n- When I search for Welcome\n- Then the livesearch results should contain Welcome to Plone\n- and expected livesearch results 1\n+ and a document Welcome to Plone\n+ When I search for Welcome\n+ Then the livesearch results should contain Welcome to Plone\n+ and expected livesearch results 1\n \n Scenario: Livesearch with image results\n Given a logged-in site administrator\n- and a news item My News with Image\n- When I search for My News\n- Then the livesearch results should contain My News with Image\n- and expected livesearch results 1\n- and Page should contain image css=.livesearch-results li.search-result .col.img img\n+ and a news item My News with Image\n+ When I search for My News\n+ Then the livesearch results should contain My News with Image\n+ and expected livesearch results 1\n+ and Get Element Count //*[contains(@class,"livesearch-results")]//li[contains(@class,"search-result")]//*[contains(@class,"col") and contains(@class,"img")]//img greater than 0\n \n When I disable images in results in search controlpanel\n and I search for My News\n- Then Page should not contain image css=.livesearch-results li.search-result .col.img img\n+ and Get Element Count //*[contains(@class,"livesearch-results")]//li[contains(@class,"search-result")]//*[contains(@class,"col") and contains(@class,"img")]//img should be 0\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n a document\n- [Arguments] ${title}\n- Create content type=Document id=doc title=${title}\n+ [Arguments] ${title}\n+ Create content\n+ ... type=Document\n+ ... id=doc\n+ ... title=${title}\n \n a news item\n- [Arguments] ${title}\n- Go to ${PLONE_URL}/++add++News Item\n- Wait until page contains Add News Item\n- Input text name=form.widgets.IDublinCore.title ${title}\n- Choose File name=form.widgets.ILeadImageBehavior.image ${PATH_TO_TEST_FILES}/plone-logo.png\n- Click Button Save\n- Wait until page contains Item created error=Image could not be created.\n+ [Arguments] ${title}\n+ Go to ${PLONE_URL}/++add++News Item\n+ Type text //input[@name="form.widgets.IDublinCore.title"] ${title}\n+ Upload File By Selector //input[@name="form.widgets.ILeadImageBehavior.image"] ${PATH_TO_TEST_FILES}/pixel.png\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Item created message=Image could not be created.\n \n I search for\n- [Arguments] ${searchtext}\n- Input text css=input#searchGadget ${searchtext}\n- Wait For Element css=input#searchGadget\n+ [Arguments] ${searchtext}\n+ Type Text //input[@id="searchGadget"] ${searchtext}\n \n I search the currentfolder only for\n- [Arguments] ${searchtext}\n- Select checkbox id=searchbox_currentfolder_only\n- Input text css=input#searchGadget ${searchtext}\n- Wait For Element css=input#searchGadget\n+ [Arguments] ${searchtext}\n+ Check Checkbox //*[@id="searchbox_currentfolder_only"]\n+ Type Text //input[@id="searchGadget"] ${searchtext}\n \n the livesearch results should contain\n- [Arguments] ${text}\n- Wait until keyword succeeds 5s 1s Element should contain css=.livesearch-results li a .heading ${text}\n+ [Arguments] ${text}\n+ Get Element States //ul[contains(@class,"livesearch-results")] contains visible\n+ Get Text //ul[contains(@class,"livesearch-results")] contains ${text}\n \n the livesearch results should not contain\n- [Arguments] ${text}\n- Wait until keyword succeeds 5s 1s Page should not contain css=.livesearch-results li a .heading ${text}\n+ [Arguments] ${text}\n+ Get Element States //ul[contains(@class,"livesearch-results")] contains visible\n+ Get Text //ul[contains(@class,"livesearch-results")] not contains ${text}\n \n expected livesearch results\n- [Arguments] ${num}\n- ${count} = Get Element Count css=.livesearch-results li.search-result\n- Should Be Equal as Numbers ${count} ${num}\n+ [Arguments] ${num}\n+ Get Element Count //*[contains(@class,"livesearch-results")]//li[contains(@class,"search-result")] should be ${num}\n+\n \n I disable images in results in search controlpanel\n- Go to ${PLONE_URL}/@@search-controlpanel\n- Wait until page contains Search Settings\n- Unselect Checkbox form.widgets.search_show_images:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Go to ${PLONE_URL}/@@search-controlpanel\n+ Uncheck Checkbox //input[@name="form.widgets.search_show_images:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/802b570057c8bb4f49dd1d0766b510fbc185f02a + +refactoring overlays robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_overlays.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_overlays.robot b/Products/CMFPlone/tests/robot/test_overlays.robot\nindex b8fca6d3d9..d35f27ea41 100644\n--- a/Products/CMFPlone/tests/robot/test_overlays.robot\n+++ b/Products/CMFPlone/tests/robot/test_overlays.robot\n@@ -1,22 +1,18 @@\n *** Settings ***\n \n-Documentation These tests are just testing the overlay behavior not the\n-... functionality of each form. This is supposed to be tested in\n-... functional tests somewhere. At some point in the future the\n-... functional tests can be transferred to robot tests into each\n-... scenario test case.\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Variables variables.py\n \n-Resource common.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n+*** Variables ***\n \n+${TEST_FOLDER} test-folder\n \n *** Test cases ***\n \n@@ -25,78 +21,65 @@ Scenario: Contact form overlay opens\n When I click the \'Contact\' link\n Then overlay should open\n \n+\n Scenario: Contact form overlay closes\n- Go to ${PLONE_URL}/logout\n- Given the \'Contact\' overlay\n+ Given the site root logged out\n+ and the \'Contact\' overlay\n When I close the overlay\n Then overlay should close\n \n Scenario: Log in form overlay opens\n- Go to ${PLONE_URL}/logout\n- Given the site root\n+ Given the site root logged out\n+ and the site root\n When I click the \'Log in\' link\n Then overlay should open\n \n Scenario: Log in form overlay closes\n- Go to ${PLONE_URL}/logout\n- Given the site root\n- Given the \'Log in\' overlay\n+ Given the site root logged out\n+ and the site root\n+ and the \'Log in\' overlay\n When I close the overlay\n Then overlay should close\n \n Scenario: Log in form overlay remains on wrong credentials\n- Go to ${PLONE_URL}/logout\n- Given the site root\n- Given the \'Log in\' overlay\n+ Given the site root logged out\n+ and the site root\n+ and the \'Log in\' overlay\n When I enter wrong credentials\n Then overlay should remain open\n- And login overlay shows an error\n+ and login overlay shows an error\n \n Scenario: Log in form overlay closes on valid credentials\n- Go to ${PLONE_URL}/logout\n- Given the site root\n- Given the \'Log in\' overlay\n+ Given the site root logged out\n+ and the site root\n+ and the \'Log in\' overlay\n When I enter valid credentials\n Then overlay should close\n \n Scenario: Set default content item of a folder overlay opens\n Given a logged-in site administrator\n- And a document \'doc\' in the test folder\n+ and a document \'doc\' in the test folder\n When I set the default content view of the test folder\n Then overlay should open\n \n-# XXX Next 2 tests are commented out. After hours of messing around,\n-# I still can not pinpoint why this is happening.\n-# The error originates from this change https://github.com/plone/mockup/commit/ccec87028bc22e082d6d9a95874d8a961f91b707\n-# which provides at least some error reporting(window.alert) to users when modals\n-# experience issues. We need this change in modals...\n-#\n-# However, in these 2 cases, it is triggering the window.alert\n-# and causing the tests to fail in certain cases.\n-# It ONLY happens when running automatically by the robot framework\n-# runner. If you try to use Import library DebugLibrary and\n-# run the commands manually, of course it works fine. So yes,\n-# there is no way to really figure out this AFAIK.\n-# Also, of course, this doesn\'t happen in real user testing.\n-#\n-#Scenario: Change default content item of a folder overlay opens\n-# Given a logged-in site administrator\n-# And a document as the default view of the test folder\n-# When I change the default content view of the test folder\n-# Then overlay should open\n-\n-#Scenario: Change default content item of a folder overlay closes\n-# Given a logged-in site administrator\n-# And a document as the default view of the test folder\n-# When I change the default content view of the test folder\n-# And I \'Cancel\' the form\n-# Then overlay should close\n-# When I change the default content view of the test folder\n-# And I \'Save\' the form\n-# Then overlay should close\n-# When I change the default content view of the test folder\n-# And I close the overlay\n-# Then overlay should close\n+Scenario: Change default content item of a folder overlay opens\n+ Given a logged-in site administrator\n+ and a document as the default view of the test folder\n+ When I change the default content view of the test folder\n+ Then overlay should open\n+\n+Scenario: Change default content item of a folder overlay closes\n+ Given a logged-in site administrator\n+ And a document as the default view of the test folder\n+ When I change the default content view of the test folder\n+ And I \'Cancel\' the form\n+ Then overlay should close\n+ When I change the default content view of the test folder\n+ And I \'Save\' the form\n+ Then overlay should close\n+ When I change the default content view of the test folder\n+ And I close the overlay\n+ Then overlay should close\n \n Scenario: Delete content action overlay opens\n Given a logged-in site administrator\n@@ -132,7 +115,7 @@ Scenario: Rename content action overlay closes\n Scenario: Register user overlay opens\n Given the mail setup configured\n And the self registration enabled\n- Go to ${PLONE_URL}/logout\n+ and the site root logged out\n And the site root\n When I click the \'Register\' link\n Then overlay should open\n@@ -140,7 +123,7 @@ Scenario: Register user overlay opens\n Scenario: Register user overlay closes\n Given the mail setup configured\n And the self registration enabled\n- Go to ${PLONE_URL}/logout\n+ and the site root logged out\n And the site root\n And the \'Register\' overlay\n When I close the overlay\n@@ -149,24 +132,22 @@ Scenario: Register user overlay closes\n Scenario: Register user overlay remains on wrong data\n Given the mail setup configured\n And the self registration enabled\n- Go to ${PLONE_URL}/logout\n+ and the site root logged out\n And the site root\n And the \'Register\' overlay\n When I send the register form\n Then overlay should remain open\n And overlay shows an error\n \n-# Note: For this one we need to fake the mail server, as it tries to send the\n-# mail right away. Or change the somehow confusing message that shows when this\n-# happens.\n-#Scenario: Register user overlay closes on valid data\n-# Given the mail setup configured\n-# And the self registration enabled\n-# And the site root\n-# And the \'Register\' overlay\n-# When I enter valid register user data\n-# And I send the register form\n-# Then overlay should close\n+# Tests based on MockupMailServer, this should be a valid tests\n+Scenario: Register user overlay closes on valid data\n+ Given the mail setup configured\n+ And the self registration enabled\n+ And the site root\n+ And the \'Register\' overlay\n+ When I enter valid register user data\n+ And I send the register form\n+ Then overlay should close\n \n Scenario: New user overlay opens\n Given a logged-in site administrator\n@@ -190,144 +171,137 @@ Scenario: New user overlay closes on valid data\n And I send the register form\n Then overlay should close\n \n-# There is no more history overlay\n-# Scenario: History overlay opens\n-# Given a logged-in site administrator\n-# And the test folder\n-# When I click the \'Content Info\' link\n-# And I click the \'History\' link\n-# Then overlay should open\n-#\n-# Scenario: History overlay closes\n-# Given a logged-in site administrator\n-# And the test folder\n-# When I click the \'Content Info\' link\n-# And I click the \'History\' link\n-# When I close the overlay\n-# Then overlay should close\n-#\n+\n *** Keywords ***\n \n-Background\n- Given a logged-in site administrator\n- and a test folder\n- Disable autologin\n- Go to homepage\n+# GIVEN\n+the site root logged out\n+ Go to ${PLONE_URL}/logout\n+\n+the site root\n+ Go to ${PLONE_URL}\n+\n+\n+the \'${link_name}\' overlay\n+ Click //a[descendant-or-self::*[contains(text(), "${link_name}")]]\n+ Get Element Count //div[contains(@class,"modal-dialog")] greater than 0\n+\n+\n+a document \'${title}\' in the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Document\n+ Type Text //input[@id="form-widgets-IDublinCore-title"] ${title}\n+ Click //button[@name="form.buttons.save"]\n+\n+\n+a document as the default view of the test folder\n+ a document \'doc\' in the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}\n+ Click //li[@id=\'plone-contentmenu-display\']/a\n+ Click //a[@id="contextSetDefaultPage"]\n+ Click //input[@id="doc"]\n+ Click //div[contains(@class,"modal-footer")]//button[@name="form.buttons.Save"]\n+ Wait For Condition Text //body//h1 contains doc\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n \n the users and groups configlet\n- Go to ${PLONE_URL}/@@usergroup-userprefs\n- Wait until page contains User Search\n+ Go to ${PLONE_URL}/@@usergroup-userprefs\n+ Get Text //body contains User Search\n+\n+# WHEN\n \n I click the \'${link_name}\' link\n- Wait until page contains ${link_name}\n- Element should be visible xpath=//a[descendant-or-self::*[contains(text(), \'${link_name}\')]]\n- Click Link xpath=//a[descendant-or-self::*[contains(text(), \'${link_name}\')]]\n+ Get Element Count //a[descendant-or-self::*[contains(text(), "${link_name}")]] greater than 0\n+ Click //a[descendant-or-self::*[contains(text(), "${link_name}")]]\n \n-the \'${link_name}\' overlay\n- Wait until page contains ${link_name}\n- Click Link xpath=//a[descendant-or-self::*[contains(text(), \'${link_name}\')]]\n- Wait until keyword succeeds 30 1 Page should contain element css=div.modal-dialog\n \n-overlay should open\n- Wait until keyword succeeds 30 1 Element Should Be Visible css=div.modal-dialog\n+I close the overlay\n+ Click //div[contains(@class,"modal-header")]//button[contains(@class,"modal-close")]\n \n-overlay should remain open\n- Wait until page contains element css=div.modal-wrapper\n- Wait until element is visible css=div.modal-wrapper\n \n-I close the overlay\n- Click Element css=div.modal-header button.modal-close\n+I enter wrong credentials\n+ I enter credentials wrong user\n \n-overlay should close\n- Wait until keyword succeeds 40 1 Page should not contain element css=div.modal-dialog\n \n-login overlay shows an error\n- Wait Until Page Contains Error\n+I enter valid credentials\n+ I enter credentials ${SITE_OWNER_NAME} ${SITE_OWNER_PASSWORD}\n \n-overlay shows an error\n- Wait Until Page Contains There were errors\n \n-overlay requires to compile a field\n- Wait Until Page Contains Required input is missing\n+I set the default content view of the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}\n+ Click //li[@id=\'plone-contentmenu-display\']/a\n+ Click //a[@id="contextSetDefaultPage"]\n+\n+\n+I change the default content view of the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}\n+ Click //li[@id=\'plone-contentmenu-display\']/a\n+ Click //a[@id="folderChangeDefaultPage"]\n+\n \n I \'${action}\' the form\n- Wait until keyword succeeds 30 1 Element Should Be Visible css=div.modal-footer button[name="form.buttons.${action}"]\n- Click Element css=div.modal-footer button[name="form.buttons.${action}"]\n+ Click //div[contains(@class,"modal-footer")]//button[@name="form.buttons.${action}"]\n \n-I enter wrong credentials\n- Input text __ac_name wrong\n- Input text __ac_password user\n- Wait For Then Click Element css=div.modal-footer button\n \n-I enter valid credentials\n- Wait until page contains element name=__ac_name\n- Input text for sure __ac_name ${SITE_OWNER_NAME}\n- Input text for sure __ac_password ${SITE_OWNER_PASSWORD}\n- Wait For Then Click Element css=div.modal-footer button\n+I trigger the \'${action}\' action menu item of the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}\n+ Click //li[@id="plone-contentmenu-actions"]/a\n+ Click //a[@id="plone-contentmenu-actions-${action}"]\n \n-I enter valid user data\n- Wait until page contains element name=form.widgets.password_ctl\n- Input text for sure form.widgets.username myuser\n- Input text for sure form.widgets.email my@email.eu\n- Input text for sure form.widgets.password newpassword\n- Input text for sure form.widgets.password_ctl newpassword\n \n-I enter valid register user data\n- Wait until page contains element name=form.widgets.username\n- Input text form.widgets.username myuser\n- Input text form.widgets.email my@email.eu\n+I confirm deletion of the content\n+ Click //div[contains(@class,"modal-footer")]//button[@name="form.buttons.Delete"]\n+\n \n I send the register form\n- Wait until page contains element css=div.modal-footer #form-buttons-register\n- Click Element css=div.modal-footer #form-buttons-register\n+ Click //div[contains(@class,"modal-footer")]//button[@name="form.buttons.register"]\n+\n+\n+I enter valid register user data\n+ Type Text //input[@name="form.widgets.username"] myuser\n+ Type Text //input[@name="form.widgets.email"] myuser@plone.org\n+\n \n I trigger the add a new user action\n- Click Element id=add-user\n+ Click //a[@id="add-user"]\n \n-a document \'${title}\' in the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Document\n- Wait For Condition return window.jQuery(\'.autotoc-nav .active:visible\').length > 0\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${title}\'); return 0;\n- Click Button Save\n \n-I set the default content view of the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-display\']/a\n- Click link id=contextSetDefaultPage\n+I enter valid user data\n+ Type Text //input[@name="form.widgets.username"] myuser\n+ Type Text //input[@name="form.widgets.email"] myuser@plone.org\n+ Type Text //input[@name="form.widgets.password"] newpassword\n+ Type Text //input[@name="form.widgets.password_ctl"] newpassword\n \n-a document as the default view of the test folder\n- a document \'doc\' in the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-display\']/a\n- Wait until element is visible id=contextSetDefaultPage\n- Click link id=contextSetDefaultPage\n- Click element id=doc\n- Click element css=div.modal-footer button[name="form.buttons.Save"]\n \n-I change the default content view of the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-display\']/a\n- Wait until element is visible id=folderChangeDefaultPage\n- Click link id=folderChangeDefaultPage\n \n-I trigger the \'${action}\' action menu item of the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n- Given patterns are loaded\n- Element should be visible xpath=//li[@id=\'plone-contentmenu-actions\']/a\n- Click link xpath=//li[@id=\'plone-contentmenu-actions\']/a\n- Wait until element is visible id=plone-contentmenu-actions-${action}\n- Click link id=plone-contentmenu-actions-${action}\n- Wait until page contains Element css=div.modal-dialog\n+# THEN\n+\n+overlay should open\n+ Wait For Condition Element States //div[contains(@class,"modal-dialog")] contains visible\n+\n+\n+overlay should close\n+ Wait For Condition Element Count //div[contains(@class,"modal-dialog")] should be 0\n+\n+\n+overlay should remain open\n+ Wait For Condition Element States //div[contains(@class,"modal-wrapper")] contains visible\n+\n+\n+login overlay shows an error\n+ Wait For Condition Text //div[contains(@class,"modal-wrapper")] contains Error\n+\n+\n+overlay shows an error\n+ Wait For Condition Text //div[contains(@class,"modal-wrapper")] contains There were errors\n+\n+\n+overlay requires to compile a field\n+ Wait For Condition Text //div[contains(@class,"modal-wrapper")] contains Required input is missing\n \n-I confirm deletion of the content\n- # Note: The \'delete\' button has no standard z3c.form name attribute\n- Wait until keyword succeeds 2 2 Click Element css=div.modal-footer button#form-buttons-Delete\n \n-modals loaded\n- Wait For Condition return window.jQuery(\'.modal-wrapper\').size() > 0\n+# DRY\n+I enter credentials\n+ [Arguments] ${username} ${password}\n+ Type Text //input[@name="__ac_name"] ${username}\n+ Type Text //input[@name="__ac_password"] ${password}\n+ Click //div[contains(@class,"modal-footer")]//button\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/a855f5408b50c496e11f7a416c679ffb422dbfd7 + +refactoring portlets robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_portlets.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_portlets.robot b/Products/CMFPlone/tests/robot/test_portlets.robot\nindex 6167adc91b..5641220fab 100644\n--- a/Products/CMFPlone/tests/robot/test_portlets.robot\n+++ b/Products/CMFPlone/tests/robot/test_portlets.robot\n@@ -1,56 +1,89 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Variables variables.py\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n \n-*** Test cases ***************************************************************\n+*** Test cases ***\n \n-Scenario: Add Login Portlet\n+Scenario: Add Login Portlet to left column\n Given a logged-in site administrator\n and a manage portlets view\n When I add a \'Login\' portlet to the left column\n+ and I go to portal root\n Then I should see a \'Login\' portlet in the left column\n \n+Scenario: Add Login Portlet to right column\n+ Given a logged-in site administrator\n+ and a manage portlets view\n+ When I add a \'Login\' portlet to the right column\n+ and I go to portal root\n+ Then I should see a \'Login\' portlet in the right column\n \n-*** Keywords *****************************************************************\n+Scenario: Delete Login Portlet from left column\n+ Given a logged-in site administrator\n+ and a manage portlets view\n+ When I add a \'Login\' portlet to the left column\n+ and I delete a \'Login\' portlet from the left column\n+ and I go to portal root\n+ Then I should not see a \'Login\' portlet in the left column\n+\n+Scenario: Delete Login Portlet from right column\n+ Given a logged-in site administrator\n+ and a manage portlets view\n+ When I add a \'Login\' portlet to the right column\n+ and I delete a \'Login\' portlet from the right column\n+ and I go to portal root\n+ Then I should not see a \'Login\' portlet in the right column\n+\n+# TODO: Move Portlets Up and Down\n+*** Keywords ***\n+\n+# Given\n \n a manage portlets view\n- Go to ${PLONE_URL}/@@manage-portlets\n- Wait until page contains Manage portlets\n+ Go to ${PLONE_URL}/@@manage-portlets\n+ Get Text //body contains Manage portlets\n+\n+# When\n \n I add a \'${portletname}\' portlet to the left column\n- Select from list by label xpath=//div[@id="portletmanager-plone-leftcolumn"]//select ${portletname}\n+ Select Options By //div[@id="portletmanager-plone-leftcolumn"]//select[contains(@class,"add-portlet")] label ${portletname}\n+ Get Text //body contains Portlet added\n \n I add a \'${portletname}\' portlet to the right column\n- Select from list by label xpath=//div[@id="portletmanager-plone-rightcolumn"]//select ${portletname}\n+ Select Options By //div[@id="portletmanager-plone-rightcolumn"]//select[contains(@class,"add-portlet")] label ${portletname}\n+ Get Text //body contains Portlet added\n+\n+I go to portal root\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+\n+I delete a \'${portlet}\' portlet from the left column\n+ Click //*[@id="portletmanager-plone-leftcolumn"]/div[2]/div[2]/div[2]/form[3]/button\n+ Get Element Count //*[@id="portletmanager-plone-leftcolumn"]//div[@class="portletAssignment"] <= 1\n \n-I delete a \'${portlet}\'\' portlet from the left column\n- Click Link xpath=//div[@id="portal-column-one"]//div[@class="portletHeader" and contains(.,"${portlet}")]//a[@class="delete"] don\'t wait\n- Wait until keyword succeeds 1s 10s Flex Element Should not exist xpath=//div[@id="portal-column-one"]//div[@class="portletHeader" and contains(.,"${portlet}")]\n+I delete a \'${portlet}\' portlet from the right column\n+ Click //*[@id="portletmanager-plone-rightcolumn"]/div[2]/div[2]/div[2]/form[3]/button\n+ Get Element Count //*[@id="portletmanager-plone-rightcolumn"]//div[@class="portletAssignment"] <= 1\n \n-when I delete the \'${portlet}\' portlet from the right column\n- Click Link xpath=//div[@id="portal-column-two"]//div[@class="portletHeader" and contains(.,"${portlet}")]//a[@class="delete"] don\'t wait\n- Wait until keyword succeeds 1s 10s Flex Element Should not exist xpath=//div[@id="portal-column-two"]//div[@class="portletHeader" and contains(.,"${portlet}")]\n \n+# Then\n I should see a \'${portletname}\' portlet in the left column\n- Wait until page contains ${portletname}\n- Element should contain portal-column-one ${portletname}\n+ Get Element Count //*[@id="portal-column-one"]//div[contains(@class,"portlet${portletname}")] should be 1\n \n I should see a \'${portletname}\' portlet in the right column\n- Wait until page contains ${portletname}\n- Element should contain portal-column-two ${portletname}\n+ Get Element Count //*[@id="portal-column-two"]//div[contains(@class,"portlet${portletname}")] should be 1\n \n-I should not see \'${text}\' in the left column\n- Flex Element should not exist xpath=//div[@id="portal-column-one" and contains(.,"${text}")]\n+I should not see a \'${text}\' portlet in the left column\n+ Get Element Count //*[@id="portal-column-one"]//div[contains(@class,"portlet${text}")] should be 0\n \n-I should not see \'${text}\' in the right column\n- Flex Element should not exist xpath=//div[@id="portal-column-two" and contains(.,"${text}")]\n+I should not see a \'${text}\' portlet in the right column\n+ Get Element Count //*[@id="portal-column-two"]//div[contains(@class,"portlet${text}")] should be 0\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/7de02bd2b4478934608ae8aed12a8abf6527c2a1 + +refactoring querystring robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_querystring.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_querystring.robot b/Products/CMFPlone/tests/robot/test_querystring.robot\nindex 5a5e66fbf7..d25c417718 100644\n--- a/Products/CMFPlone/tests/robot/test_querystring.robot\n+++ b/Products/CMFPlone/tests/robot/test_querystring.robot\n@@ -1,246 +1,347 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Variables variables.py\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-*** Test Cases **************************************************************\n+\n+*** Test Cases ***\n \n Scenario: Location query Current\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Current in the criteria Location\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Current in the criteria Location\n+ Then we expect 1 hits\n \n Scenario: Location query Parent\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Parent in the criteria Location\n- Then we expect 3 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Parent in the criteria Location\n+ Then we expect 3 hits\n \n Scenario: Location query Custom\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Custom in the criteria Location\n- and I search in B subfolder in the related items widget\n- Then we expect 5 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Custom in the criteria Location\n+ and I search in B subfolder in the related item widget\n+ Then we expect 5 hits\n \n Scenario: Location query Advanced\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Advanced in the criteria Location\n- Then I expect to be in Advanced mode\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Advanced in the criteria Location\n+ Then I expect to be in Advanced mode\n \n Scenario: Location query Simple\n+ # this fails simple is not available, first select \'Advanced Mode\' then you can select \'Simple Mode\'\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Simple in the criteria Location\n- Then I expect to be in Simple mode\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Advanced in the criteria Location\n+ and I open the select box titled operator\n+ and I select index Simple\n+ Then I expect to be in Simple mode\n \n Scenario: Title query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Title\n- and I search for A\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Title\n+ and I search for A\n+ Then we expect 1 hits\n \n Scenario: Description query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Description\n- and I search for a\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Description\n+ and I search for a\n+ Then we expect 1 hits\n \n Scenario: Searchable text query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Searchable text\n- and I search for a\n- and Sleep 0.2\n- and Wait For Then Click Element css=div.querystring-preview\n- Then we expect 2 hits\n- When I open the criteria Searchable text\n- and I search for d\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Searchable text\n+ and I search for a\n+ and Sleep 0.2\n+ Then we expect 2 hits\n+\n+ When I open the criteria Searchable text\n+ and I search for d\n+ Then we expect 1 hits\n \n Scenario: Tag query one\n+\n+ ${base_option_selector}= Set Variable select2-results-dept-0 select2-result select2-result-selectable select2-option\n+ ${base_option_selector_o}= Set Variable ${base_option_selector}-o\n+ ${base_option_selector_n}= Set Variable ${base_option_selector}-n\n+ ${base_option_selector_p}= Set Variable ${base_option_selector}-p\n+ ${base_option_selector_e}= Set Variable ${base_option_selector}-e\n # tests the "Matches any of" option\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the default operator in the criteria Tag\n- and I open the Selection Widget\n- ${base_option_selector} Set Variable li.select2-results-dept-0.select2-result.select2-result-selectable.select2-option\n- and Wait For Then Click Element css=${base_option_selector}-o\n- Then we expect 4 hits\n- When I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-n\n- Then we expect 4 hits\n- When I delete my selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-p\n- Then we expect 1 hits\n- When I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-e\n- Then we expect 2 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the default operator in the criteria Tag\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_o}")]\n+ Then we expect 4 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_n}")]\n+ Then we expect 4 hits\n+\n+ When I delete my selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_p}")]\n+ Then we expect 1 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_e}")]\n+ Then we expect 2 hits\n \n Scenario Tag query two\n+ ${base_option_selector}= Set Variable select2-results-dept-0 select2-result select2-result-selectable select2-option\n+ ${base_option_selector_o}= Set Variable ${base_option_selector}-o\n+ ${base_option_selector_n}= Set Variable ${base_option_selector}-n\n+ ${base_option_selector_p}= Set Variable ${base_option_selector}-p\n+ ${base_option_selector_e}= Set Variable ${base_option_selector}-e\n # tests the "Matches all of" option\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I expect an empty result after open the operator Matches all of in the criteria Tag\n- and I open the Selection Widget\n- ${base_option_selector} Set Variable li.select2-results-dept-0.select2-result.select2-result-selectable.select2-option\n- and Wait For Then Click Element css=${base_option_selector}-o\n- Then we expect 4 hits\n- When and I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-n\n- Then we expect 3 hits\n- When I delete my selection\n- and and I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-p\n- Then we expect 1 hits\n- When and I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-e\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I expect an empty result after open the operator Matches all of in the criteria Tag\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_o}")]\n+ Then we expect 4 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_n}")]\n+ Then we expect 3 hits\n+\n+ When I delete my selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_p}")]\n+ Then we expect 1 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_e}")]\n+ Then we expect 1 hits\n \n \n Scenario Event end date query\n Given a logged-in manager\n- and a bunch of events\n- and the querystring pattern\n+ and a bunch of events\n+ and the querystring pattern\n # Before date\n- When I activate the default operator in the criteria Event end date\n- and Execute Javascript $(\'.querystring-criteria-value input[type="date"]\').val(\'2018-07-01\')\n- Then we do not expect any hits\n+ When I activate the default operator in the criteria Event end date\n+ and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date"]\n+ ... (element) => {\n+ ... # fire the event for the browser build-in date input field\n+ ... element.value="2018-07-01";\n+ ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ ... }\n+ ... all_elements=False\n+\n+ Then we do not expect any hits\n \n # When Execute Javascript $(\'.querystring-criteria-value input[type="date"]\').val(\'2018-07-06\')\n \n- # !!! BUG in plone.app.robotframework?\n+ # !!! BUG in plone.app.robotframework ?\n # File "~/.buildout/shared-eggs/plone.app.event-3.2.1-py3.6.egg/plone/app/event/recurrence.py", line 77, in occurrences\n # duration = event_end - event_start\n # TypeError: can\'t subtract offset-naive and offset-aware datetimes\n \n- # for some reason the timezone is not applied correctly here. this is\n- # probably a problem with plone.app.robotframework.content creation mechanism.\n- # actually we got 3 hits, but right would be:\n- # Then we expect 2 hits\n- # Between dates\n- # When I activate the operator Between dates in the criteria Event end date\n- # and Execute Javascript $($(\'.querystring-criteria-value .pattern-pickadate-date-wrapper > input[type="text"]\')[0]).pickadate(\'picker\').set(\'select\', new Date(2018, 7, 1))\n- # and Execute Javascript $($(\'.querystring-criteria-value .pattern-pickadate-date-wrapper > input[type="text"]\')[1]).pickadate(\'picker\').set(\'select\', new Date(2018, 7, 7))\n- # Then we expect 3 hits\n- # When Execute Javascript $($(\'.querystring-criteria-value .pattern-pickadate-date-wrapper > input[type="text"]\')[0]).pickadate(\'picker\').set(\'select\', new Date(2018, 7, 6))\n- # and Execute Javascript $($(\'.querystring-criteria-value .pattern-pickadate-date-wrapper > input[type="text"]\')[1]).pickadate(\'picker\').set(\'select\', new Date(2018, 7, 8))\n- # Then we expect 2 hits\n+ # When Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date"]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-06";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # Then we expect 2 hits\n+\n+ # # Between dates\n+ # When I activate the operator Between dates in the criteria Event end date\n+ # and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date" and contains(@class,"querystring-criteria-value-DateRangeWidget-start")]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-01";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date" and contains(@class,"querystring-criteria-value-DateRangeWidget-end")]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-07";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # Then we expect 3 hits\n+\n+ # # Between dates\n+ # When I activate the operator Between dates in the criteria Event end date\n+ # and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date" and contains(@class,"querystring-criteria-value-DateRangeWidget-start")]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-06";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date" and contains(@class,"querystring-criteria-value-DateRangeWidget-end")]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-06";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # Then we expect 2 hits\n+\n+\n \n Scenario Short name (id) query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Short name (id)\n- And I search for a\n- Then Page Should Contain A\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Short name (id)\n+ and I search for a\n+ Then I see A in Preview\n \n Scenario Review state query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Review State\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-private\n- Then we expect 7 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Review State\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-private")]\n+ Then we expect 7 hits\n \n Scenario Type query\n Given a logged-in site administrator\n- and a bunch of events\n- and the querystring pattern\n- When I open the criteria Type\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-event\n- Then we expect 4 hits\n- When I delete one selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-file\n- Then we do not expect any hits\n- When I delete one selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-folder\n- Then we expect 5 hits\n- When I delete one selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-link\n- Then we expect 1 hits\n- When I delete one selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-document\n- Then we expect 2 hits\n- When I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-link\n- Then we expect 3 hits\n+ and a bunch of events\n+ and the querystring pattern\n+ When I open the criteria Type\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-event")]\n+ Then we expect 4 hits\n+\n+ When I delete one selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-file")]\n+ Then we do not expect any hits\n+\n+ When I delete one selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-folder")]\n+ Then we expect 5 hits\n+\n+ When I delete one selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-link")]\n+ Then we expect 1 hits\n+\n+ When I delete one selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-document")]\n+ Then we expect 2 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-link")]\n+ Then we expect 3 hits\n \n Scenario Creator query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the default operator in the criteria Creator\n- Then we expect 6 hits\n-\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the default operator in the criteria Creator\n+ Then we expect 6 hits\n \n-*** Keywords ****************************************************************\n \n-save\n- Click Link css=input#form-buttons-save\n+*** Keywords ***\n \n-the querystring pattern\n- #We go the /a to give more useful query results\n- Go to ${PLONE_URL}/a/++add++Collection\n- Wait until page contains element css=.pat-querystring\n- Given querystring pattern loaded\n- # Set a title, otherwise you see \'Please fill out this field\'\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'A Collection\'); return 0;\n- # for some unknown reason unload protection pops up, but only in robot tests\n- Execute Javascript $(window).unbind(\'beforeunload\')\n-\n-querystring pattern loaded\n- Wait For Condition return !!document.querySelector(\'.querystring-criteria-remove\')\n+# GIVEN\n \n a bunch of folders\n #We create enough items to give meaningful test results\n- ${F1}= Create content type=Folder title=A description=a subject=onep\n- ${F2}= Create content type=Folder title=B description=b subject=one container=${F1}\n- ${F3}= Create content type=Folder title=C description=and subject=on container=${F2}\n- Create content type=Document title=D subject=o container=${F3}\n- Create content type=Document title=E container=${F3}\n- Create content type=Link title=Link remoteUrl=/front-page container=${F3}\n+ ${F1}= Create content\n+ ... type=Folder\n+ ... title=A\n+ ... description=a\n+ ... subject=onep\n+ ${F2}= Create content\n+ ... type=Folder\n+ ... title=B\n+ ... description=b\n+ ... subject=one\n+ ... container=${F1}\n+ ${F3}= Create content\n+ ... type=Folder\n+ ... title=C\n+ ... description=and\n+ ... subject=on\n+ ... container=${F2}\n+ Create content\n+ ... type=Document\n+ ... title=D\n+ ... subject=o\n+ ... container=${F3}\n+ Create content\n+ ... type=Document\n+ ... title=E\n+ ... container=${F3}\n+ Create content\n+ ... type=Link\n+ ... title=Link\n+ ... remoteUrl=/front-page\n+ ... container=${F3}\n [Return] ${F1}\n \n+\n a bunch of events\n ${F1}= a bunch of folders\n- Create content type=Event title=Event1 start=2018-08-01T15:00 end=2018-08-01T17:00 container=${F1}\n- Create content type=Event title=Event2 start=2018-08-05T16:00 end=2018-08-07T11:00 container=${F1}\n- Create content type=Event title=Event3 start=2018-08-05T16:30 open_end-empty-marker=1 container=${F1}\n- Create content type=Event title=Event4 start=2018-08-06 end=2018-08-06 whole_day-empty-marker=1 container=${F1}\n+ Create content\n+ ... type=Event\n+ ... title=Event1\n+ ... start=2018-08-01T15:00\n+ ... end=2018-08-01T17:00\n+ ... container=${F1}\n+ Create content\n+ ... type=Event\n+ ... title=Event2\n+ ... start=2018-08-05T16:00\n+ ... end=2018-08-07T11:00\n+ ... container=${F1}\n+ Create content\n+ ... type=Event\n+ ... title=Event3\n+ ... start=2018-08-05T16:30\n+ ... open_end-empty-marker=1\n+ ... container=${F1}\n+ Create content\n+ ... type=Event\n+ ... title=Event4\n+ ... start=2018-08-06\n+ ... end=2018-08-06\n+ ... whole_day-empty-marker=1\n+ ... container=${F1}\n \n-I activate the default operator in the criteria ${CRITERIA}\n- open the select box titled index\n- select index type ${CRITERIA}\n+the querystring pattern\n+ # We go the /a to give more useful query results\n+ Go to ${PLONE_URL}/a/++add++Collection\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Type Text //input[@id="form-widgets-IDublinCore-title"] A Collection\n+\n+# WHEN\n \n I activate the operator ${OPERATOR} in the criteria ${CRITERIA}\n open the select box titled index\n@@ -249,98 +350,128 @@ I activate the operator ${OPERATOR} in the criteria ${CRITERIA}\n open the select box titled operator\n select index type ${OPERATOR}\n \n-I expect an empty result after open the operator ${OPERATOR} in the criteria ${CRITERIA}\n- open the select box titled index\n- select index type ${CRITERIA}\n- Wait for condition return $("dl.searchResults").length == 0\n+\n+I search in ${NAME} subfolder in the related item widget\n+ mark results\n+ Click //div[@id="formfield-form-widgets-ICollection-query"]//div[@class="pat-relateditems-container"]//button[contains(@class,"mode") and contains(@class,"search")]\n+ Type Text //div[contains(@class,"querystring-criteria-value-ReferenceWidget")]//li[@class="select2-search-field"]//input[contains(@class,"select2-input")] ${NAME}\n+ Click //ul[@class="select2-results"]//a[contains(@class,"pat-relateditems-result-select") and contains(@class,"selectable")]\n+\n+\n+I open the select box titled operator\n open the select box titled operator\n- select index type ${OPERATOR}\n+\n+\n+I select index Simple\n+ select index type Simple\n+\n \n I open the criteria ${CRITERIA}\n open the select box titled index\n select index type ${CRITERIA}\n \n+\n I search for ${KEYWORD}\n- ${keyword_selector} Set Variable input.querystring-criteria-value-StringWidget\n- Wait For Then Click Element css=${keyword_selector}\n- Input Text css=${keyword_selector} ${KEYWORD}\n- Click Element css=div#content-core\n+ ${element} Get Element //input[contains(@class,"querystring-criteria-value-StringWidget")]\n+ Click ${element}\n+ Type Text ${element} ${KEYWORD}\n+ Click //div[@id="content-core"]\n+\n+\n+I activate the default operator in the criteria ${CRITERIA}\n+ open the select box titled index\n+ select index type ${CRITERIA}\n+\n \n I open the Selection Widget\n- Wait For Then Click Element css=div.select2-container-multi.querystring-criteria-value-MultipleSelectionWidget\n+ Click //div[contains(@class,"select2-container-multi") and contains(@class,"querystring-criteria-value-MultipleSelectionWidget")]\n \n-I delete one selection\n- #deletes one element\n- Wait For Then Click Element jquery=a.select2-search-choice-close:visible\n \n I delete my selection\n #deletes two elements\n- Wait For Then Click Element jquery=a.select2-search-choice-close:visible:first\n+ Click (//div[contains(@class,"querystring-criteria-value-MultipleSelectionWidget")]//a[contains(@class,"select2-search-choice-close")])[1]\n Sleep 0.1\n- Wait For Then Click Element jquery=a.select2-search-choice-close:visible\n+ Click //div[contains(@class,"querystring-criteria-value-MultipleSelectionWidget")]//a[contains(@class,"select2-search-choice-close")]\n \n-I search in ${NAME} subfolder in the related items widget\n- mark results\n- Wait For Then Click Element jquery=.pat-relateditems-container ul.select2-choices:visible\n- Wait Until Page Contains ${NAME}\n- # I have seen this fail sometimes, where the screen shot showed the NAME just fine.\n- Sleep 0.1\n- Click Element //a[contains(concat(\' \', normalize-space(@class), \' \'), \' pat-relateditems-result-select \')]//span[contains(text(),\'${NAME}\')]\n \n-I expect to be in Advanced mode\n- open the select box titled operator\n- ${selector} Set Variable .select2-drop-active[style*="display: block;"]\n- Element Should Contain jquery=${selector} Navigation Path\n- Element Should Contain jquery=${selector} Absolute Path\n- Element Should Contain jquery=${selector} Relative Path\n- Element Should Contain jquery=${selector} Simple Mode\n- ${selector} Set Variable div#select2-drop-mask\n- Wait For Then Click Invisible Element css=${selector}\n- Wait Until Element Is Not Visible css=${selector}\n+I delete one selection\n+ # :visible - should this be checked?\n+ Click //div[contains(@class,"querystring-criteria-value-MultipleSelectionWidget")]//a[contains(@class,"select2-search-choice-close")]\n \n-I expect to be in Simple mode\n+\n+I expect an empty result after open the operator ${OPERATOR} in the criteria ${CRITERIA}\n+ open the select box titled index\n+ select index type ${CRITERIA}\n+ Wait For Condition Element Count //dl[@class="searchResults"] should be 0\n open the select box titled operator\n- ${selector} Set Variable .select2-drop-active[style*="display: block;"]\n- Element Should Contain jquery=${selector} Custom\n- Element Should Contain jquery=${selector} Parent (../)\n- Element Should Contain jquery=${selector} Current (./)\n- Element Should Contain jquery=${selector} Advanced Mode\n- ${selector} Set Variable div#select2-drop-mask\n- Wait For Then Click Invisible Element css=${selector}\n- Wait Until Element Is Not Visible css=${selector}\n+ select index type ${OPERATOR}\n \n-open the select box titled ${NAME}\n- Click Element css=body\n- Wait For Then Click Element jquery=.querystring-criteria-${NAME} .select2-container:first\n \n-select index type ${INDEX}\n- ${input_selector} Set Variable .select2-drop-active[style*="display: block;"] input\n- Wait For Element css=${input_selector}\n- Input Text css=${input_selector} text=${INDEX}\n- Press Keys jquery=:focus RETURN\n+# THEN\n \n we expect ${NUM} hits\n #This assumes we have the 2 "Test document" and "Test folder" items from the\n #robot setup, as well as the 4 additional items from the "a bunch of folders" macro\n #works only for ${NUM} > 0\n- Sleep 0.5s\n+ # we need as `Sleep`, the select2 js is very slow\n+ Sleep 0.5s\n Wait until result is no longer marked\n- ${hits}= Execute Javascript return $(\'.searchResults > dd\').length\n- Should Be Equal As Integers ${hits} ${NUM}\n+ ${hits}= Evaluate Javascript //dl[@class="searchResults"]\n+ ... (element) => {\n+ ... return document.querySelectorAll(".searchResults > dd").length\n+ ... }\n+ ... all_elements=False\n+ Should Be Equal As Integers ${hits} ${NUM}\n mark results\n \n we do not expect any hits\n [Documentation] The search results may be the previous results that are still visible for a short time, so sleep a bit. Alternatively look at http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html\n- Sleep 0.2\n- Wait Until Element Is Visible css=div#search-results\n- Wait Until Element Contains css=div#search-results No results were found.\n+ Sleep 0.2\n+ Get Text //div[@id="search-results"] contains No results were found.\n+\n+I expect to be in Advanced mode\n+ open the select box titled operator\n+ ${element}= Get Element //div[contains(@class,"select2-drop-active") and contains(@style,"display: block;")]\n+ Get Text ${element} contains Navigation Path\n+ Get Text ${element} contains Absolute Path\n+ Get Text ${element} contains Relative Path\n+ Get Text ${element} contains Simple Mode\n+ Click //div[@id="select2-drop-mask"]\n+ Get Element States //div[@id="select2-drop-mask"] contains hidden\n+\n+I expect to be in Simple mode\n+ open the select box titled operator\n+ ${element}= Get Element //div[contains(@class,"select2-drop-active") and contains(@style,"display: block;")]\n+ Get Text ${element} contains Custom\n+ Get Text ${element} contains Parent (../)\n+ Get Text ${element} contains Current (./)\n+ Get Text ${element} contains Advanced Mode\n+ Click //div[@id="select2-drop-mask"]\n+ Get Element States //div[@id="select2-drop-mask"] contains hidden\n+\n+I see ${TEXT} in Preview\n+ Sleep 0.2\n+ Get Text //div[@id="search-results"] contains ${TEXT}\n+# Helper\n \n-a logged-in manager\n- Enable autologin as Manager Site Administrator Contributor Reviewer\n+open the select box titled ${NAME}\n+ Click //body\n+ Click (//div[@class="querystring-criteria-${NAME}"])[1]//div[contains(@class,"select2-container")]\n+\n+select index type ${INDEX}\n+ Type Text //div[contains(@class,"select2-drop-active") and contains(@style, "display: block;")]//input ${INDEX}\n+ Click //*[contains(@class,"select2-match")]\n \n mark results\n- Wait for condition return $("dl.searchResults").length > 0\n- Execute Javascript $("dl.searchResults").attr("marker", "marked")\n+ Evaluate Javascript //dl[@class="searchResults"]\n+ ... (element) => {\n+ ... element.setAttribute("marker", "marked")\n+ ... }\n+ ... all_elements=False\n \n wait until result is no longer marked\n- Wait for condition return $("dl.searchResults").length > 0 && $("dl.searchResults").attr("marker") != "marked"\n+ Evaluate Javascript //dl[@class="searchResults"]\n+ ... (element) => {\n+ ... return element && element.getAttribute("marker") != "marked"\n+ ... }\n+ ... all_elements=False\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/b3ae61814ec340f5a443900720d811546209499e + +refactoring tinymce robot test + +Files changed: +M Products/CMFPlone/tests/robot/test_tinymce.robot + +b'diff --git a/Products/CMFPlone/tests/robot/test_tinymce.robot b/Products/CMFPlone/tests/robot/test_tinymce.robot\nindex 75eb8d00c7..fe7138ddbb 100644\n--- a/Products/CMFPlone/tests/robot/test_tinymce.robot\n+++ b/Products/CMFPlone/tests/robot/test_tinymce.robot\n@@ -1,8 +1,6 @@\n *** Settings *****************************************************************\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n \n Library Remote ${PLONE_URL}/RobotRemote\n \n@@ -28,8 +26,8 @@ Scenario: A page is opened to edit in TinyMCE\n and insert link\n and insert image\n \n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Click //*[@id="form-buttons-save"]\n+ Get Text //body contains Changes saved\n \n \n *** Keywords *****************************************************************\n@@ -39,39 +37,41 @@ Scenario: A page is opened to edit in TinyMCE\n an edited page\n Create content type=Document title=${TITLE}\n Go to ${PLONE_URL}/${PAGE_ID}/edit\n- Wait until page contains Edit Page\n+ Get Text //body contains Edit Page\n \n an uploaded image\n Create content type=Image title=an-image\n \n text inserted into wysiwyg\n- Wait Until Element Is Visible css=.tox-edit-area iframe\n- Select Frame css=.tox-edit-area iframe\n- Input text css=.mce-content-body foobar\n- UnSelect Frame\n+ Fill text to tinymce editor Susi Sorglos and John Doe\n \n insert link\n- Select Frame css=.tox-edit-area iframe\n- Execute Javascript function selectElementContents(el) {var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range);} var el = document.getElementById("tinymce"); selectElementContents(el);\n- UnSelect Frame\n- Click Button css=button[aria-label="Insert/edit link"]\n- Click Button css=.pat-relateditems-container button.favorites\n- Click Link css=.pat-relateditems-container .favorites a.fav[href=\'/\']\n- Wait Until Element Is Visible css=.pat-relateditems-result-select.selectable\n- Click Link css=.pat-relateditems-result-select.selectable\n- Click Button css=.modal-footer input[name="insert"]\n- Select Frame css=.tox-edit-area iframe\n- Execute Javascript window.getSelection().removeAllRanges()\n- UnSelect Frame\n- Wait Until Element Is Not Visible css=.modal-footer input[name="insert"]\n+ Evaluate JavaScript //div[contains(@class, \'tox-edit-area\')]//iframe\n+ ... (elem, args) => {\n+ ... const iframe_document = elem.contentDocument;\n+ ... const body = iframe_document.body;\n+ ... const p = body.firstChild;\n+ ... const range = new Range();\n+ ... range.setStart(p.firstChild, 5);\n+ ... range.setEnd(p.firstChild, 12);\n+ ... iframe_document.getSelection().removeAllRanges();\n+ ... iframe_document.getSelection().addRange(range);\n+ ... }\n+ ... all_elements=False\n+ Click //button[@aria-label=\'Insert/edit link\']\n+ Wait For Condition Element States //div[@class="modal-content"] contains visible\n+ Click //div[@class="modal-body"]//fieldset[@data-linktype="internal"]//button[contains(@class,"mode") and contains(@class,"browse")]\n+ Click //a[@title="Go one level up"]\n+ Click //a[contains(@class,"selectable") and @data-path="/test-folder"]\n+ Click //div[contains(@class,"modal-footer")]//input[@name="insert"]\n \n insert image\n- Click Button css=button[aria-label="Insert/edit image"]\n- Click Button css=.pat-relateditems-container button.favorites\n- Click Link css=.pat-relateditems-container .favorites a.fav[href=\'/\']\n- Wait Until Element Is Visible css=.pat-relateditems-result-select.selectable\n- Click Link css=.pat-relateditems-result-select.selectable\n- Input Text css=.modal-body [name="title"] SomeTitle\n- Input Text css=.modal-body [name="alt"] SomeAlt\n- Click Button css=.modal-footer input[name="insert"]\n- Wait Until Element Is Not Visible css=.modal-footer input[name="insert"]\n+ Click //button[@aria-label="Insert/edit image"]\n+ Wait For Condition Element States //div[@class="modal-content"] contains visible\n+ Click //div[@class="modal-body"]//fieldset[@data-linktype="image"]//button[contains(@class,"mode") and contains(@class,"browse")]\n+ Click //a[@title="Go one level up"]\n+ Wait For Condition Element States //div[@id="select2-drop"]//ul[@class="select2-results"] contains visible\n+ Click //div[@id="select2-drop"]//ul[@class="select2-results"]//li/div/div/a[contains(@class,"selectable") and @data-path="/image"]\n+ Type Text //div[contains(@class, \'modal-body\')]//input[@name="title"] SomeTitle\n+ Type Text //div[contains(@class, \'modal-body\')]//input[@name="alt"] SomeAlt\n+ Click //div[contains(@class, \'modal-footer\')]//input[contains(@name, \'insert\')]\n' + +Repository: Products.CMFPlone + + +Branch: refs/heads/6.0.x +Date: 2024-11-12T07:54:12+01:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/Products.CMFPlone/commit/ae7d51e94c42cb2df767c6d310372bb7e50fb7d8 add news Files changed: -A news/475.tests +A news/4056.tests -b'diff --git a/news/475.tests b/news/475.tests\nnew file mode 100644\nindex 000000000..05c754bc0\n--- /dev/null\n+++ b/news/475.tests\n@@ -0,0 +1 @@\n+Port robot tests to playwright based test, us browser library [@1letter]\n' +b'diff --git a/news/4056.tests b/news/4056.tests\nnew file mode 100644\nindex 0000000000..f368aafe22\n--- /dev/null\n+++ b/news/4056.tests\n@@ -0,0 +1,2 @@\n+refactoring all robot tests to playwright based browser library tests\n+[1letter]\n' -Repository: plone.app.multilingual +Repository: Products.CMFPlone -Branch: refs/heads/7.x -Date: 2024-11-12T08:55:29+01:00 +Branch: refs/heads/6.0.x +Date: 2024-11-12T08:56:46+01:00 Author: Peter Mathis (petschki) -Commit: https://github.com/plone/plone.app.multilingual/commit/068f6c280863d8e1de6da2d53c4c93b81b684ca6 +Commit: https://github.com/plone/Products.CMFPlone/commit/553817e74b8cce0fdf38f949f4b850602b7267ce -Merge pull request #476 from plone/port-robot-tests-plone-6.0.x +Merge pull request #4058 from plone/port-robot-tests-6.0.x -Port robot tests plone 6.0.x +Port robot tests 6.0.x Files changed: -A news/475.tests -M src/plone/app/multilingual/testing.py -M src/plone/app/multilingual/tests/robot/test_add_translation.robot -M src/plone/app/multilingual/tests/robot/test_schemaeditor.robot -M src/plone/app/multilingual/tests/robot/test_translate_content.robot - -b'diff --git a/news/475.tests b/news/475.tests\nnew file mode 100644\nindex 000000000..05c754bc0\n--- /dev/null\n+++ b/news/475.tests\n@@ -0,0 +1 @@\n+Port robot tests to playwright based test, us browser library [@1letter]\ndiff --git a/src/plone/app/multilingual/testing.py b/src/plone/app/multilingual/testing.py\nindex 9e587dae3..aa64c8413 100644\n--- a/src/plone/app/multilingual/testing.py\n+++ b/src/plone/app/multilingual/testing.py\n@@ -18,7 +18,8 @@\n from plone.dexterity.utils import iterSchemataForType\n from plone.rfc822 import constructMessageFromSchemata\n from plone.rfc822 import initializeObjectFromSchemata\n-from plone.testing import z2\n+from plone.testing.layer import Layer\n+from plone.testing.zope import WSGI_SERVER_FIXTURE\n from plone.uuid.interfaces import IUUID\n from Products.CMFCore.utils import getToolByName\n from zope.configuration import xmlconfig\n@@ -156,7 +157,7 @@ def setUpPloneSite(self, portal):\n )\n \n \n-class MultipleLanguagesLayer(z2.Layer):\n+class MultipleLanguagesLayer(Layer):\n defaultBases = (PLONE_APP_MULTILINGUAL_PRESET_FIXTURE,)\n \n \n@@ -257,7 +258,11 @@ def create_translation(self, *args, **kwargs):\n )\n \n PLONE_APP_MULTILINGUAL_ROBOT_TESTING = FunctionalTesting(\n- bases=(MULTIPLE_LANGUAGES_LAYER, REMOTE_LIBRARY_BUNDLE_FIXTURE, z2.ZSERVER_FIXTURE),\n+ bases=(\n+ MULTIPLE_LANGUAGES_LAYER,\n+ REMOTE_LIBRARY_BUNDLE_FIXTURE,\n+ WSGI_SERVER_FIXTURE,\n+ ),\n name="plone.app.multilingual:Robot",\n )\n \ndiff --git a/src/plone/app/multilingual/tests/robot/test_add_translation.robot b/src/plone/app/multilingual/tests/robot/test_add_translation.robot\nindex 46a5b9ac6..6a990b852 100644\n--- a/src/plone/app/multilingual/tests/robot/test_add_translation.robot\n+++ b/src/plone/app/multilingual/tests/robot/test_add_translation.robot\n@@ -1,14 +1,11 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n-Resource Products/CMFPlone/tests/robot/keywords.robot\n+Resource plone/app/robotframework/browser.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n *** Test Cases ***\n \n@@ -24,74 +21,57 @@ Scenario: As an editor I can add new translation\n \n *** Keywords ***\n \n-Setup test browser\n- Set Selenium speed 0.5s\n- Open test browser\n- Set window size 1200 900\n-\n # Given\n \n a site owner\n- Enable autologin as Manager\n+ Enable autologin as Manager\n \n a document in English\n- Create content type=Document\n- ... container=/${PLONE_SITE_ID}/en/\n- ... id=an-english-document\n- ... title=An English Document\n+ Create content type=Document container=/${PLONE_SITE_ID}/en/ id=an-english-document title=An English Document\n \n a document in Catalan\n- Create content type=Document\n- ... container=/${PLONE_SITE_ID}/ca/\n- ... id=a-catalan-document\n- ... title=A Catalan Document\n+ Create content type=Document container=/${PLONE_SITE_ID}/ca/ id=a-catalan-document title=A Catalan Document\n \n # When\n \n I view the Catalan document\n- Go to ${PLONE_URL}/ca/a-catalan-document\n- Wait until page contains A Catalan Document\n+ Go to ${PLONE_URL}/ca/a-catalan-document\n+ Get Element //h1[1][text()=\'A Catalan Document\']\n \n I link the document in English as a translation\n- Page should contain element css=#plone-contentmenu-multilingual a\n- Capture page screenshot\n- Element should be visible css=#plone-contentmenu-multilingual a\n- Click Element css=#plone-contentmenu-multilingual a\n- Wait until page contains element css=#_modify_translations\n- Wait until element is visible css=#_modify_translations\n-\n- Click Element css=#_modify_translations\n- Given patterns are loaded\n- Wait until page contains element css=#translations-overview .connectTranslationAction\n-\n- Click Element css=#translations-overview .connectTranslationAction\n- Wait until page contains element css=.select2-choices\n- Wait until element is visible css=.select2-choices\n- Click Element css=#formfield-form-widgets-content .pat-relateditems-container button.mode.search\n- Input Text css=#formfield-form-widgets-content .select2-input en\n- Wait until page contains element xpath=(//span[contains(., \'An English Document\')])\n- Wait until element is visible xpath=(//span[contains(., \'An English Document\')])\n- Click Element xpath=(//span[contains(., \'An English Document\')])\n- Wait until page contains An English Document\n-\n- # We need a complicated xpath, because for some reason a button with this id is there twice.\n- # The first one is hidden.\n- Click Element xpath=(//*[contains(@class, \'modal-footer\')]//button[@id=\'form-buttons-connect_translation\'])\n- Wait until page contains element xpath=(//h3[@class="translationTitle"])\n- Sleep 5\n- Wait until element is visible xpath=(//h3[@class="translationTitle"])\n- Set Focus To Element xpath=(//*[@id="translations-overview"]//a[contains(@href,"a-catalan-document")])\n- Click Element xpath=(//*[@id="translations-overview"]//a[contains(text(),\'/plone/ca/a-catalan-document\')])\n- Wait until page contains A Catalan Document\n+ Get Element //li[@id="plone-contentmenu-multilingual"]/a\n+ Take Screenshot\n+ Get Element States //li[@id="plone-contentmenu-multilingual"]/a contains visible\n+ Click //li[@id="plone-contentmenu-multilingual"]/a\n+ Get Element States //a[@id="_modify_translations"] contains visible\n+ Click //a[@id="_modify_translations"]\n+ Click //table[@id="translations-overview"]/tbody/tr[1]/td[3]/a[contains(@class,"connectTranslationAction")]\n+ Click //form[@id="form"]//div[@id="formfield-form-widgets-content"]//button[contains(@class,"mode") and contains(@class,"browse")]\n+ Wait For Condition Element States //ul[@class="select2-results"] contains visible\n+ Click //ul[@class="select2-results"]/li/div/div/div/a[@data-path="/en" and contains(@class,"pat-relateditems-result-browse")]\n+ Click //a[@data-path="/en/an-english-document"]\n+ Click //*[contains(@class, \'modal-footer\')]//button[@name=\'form.buttons.connect_translation\']\n+ Get Text //table[@id="translations-overview"]/tbody/tr[1]/td[2]/h3[@class="translationTitle"] should be An English Document\n+ Click //table[@id="translations-overview"]//a[contains(text(),\'/plone/ca/a-catalan-document\')]\n+ Get Text //*[@id="content"]/header/h1 should be A Catalan Document\n \n I switch to English\n- Click Link xpath=//a[@title=\'English\']\n- Wait until page contains An English Document\n+ Click //a[@title=\'English\']\n+ Get Element //h1[1][contains(text(),\'An English Document\')]\n \n # Then\n \n I can view the document in English\n- Wait until page contains element\n- ... xpath=//h1[1][contains(text(),\'English Document\')]\n- Wait until page contains element\n- ... xpath=//ul[@id=\'portal-languageselector\']/li[contains(@class, \'currentLanguage\')]/a[@title=\'English\']\n+ Get Element //h1[1][contains(text(),\'English Document\')]\n+ Get Element //ul[@id=\'portal-languageselector\']/li[contains(@class, \'currentLanguage\')]/a[@title=\'English\']\n+\n+\n+# DRY\n+\n+Click item in column\n+ [arguments] ${colnumber} ${itemposition}\n+ Click //div[contains(@class, "content-browser-wrapper")]//div[contains(@class, "levelColumns")]/div[${colnumber}]/div[contains(@class, "levelItems")]/div[${itemposition}]\n+\n+Pause\n+ Import library Dialogs\n+ Pause execution\ndiff --git a/src/plone/app/multilingual/tests/robot/test_schemaeditor.robot b/src/plone/app/multilingual/tests/robot/test_schemaeditor.robot\nindex 0ce75781c..bda8cfc3c 100644\n--- a/src/plone/app/multilingual/tests/robot/test_schemaeditor.robot\n+++ b/src/plone/app/multilingual/tests/robot/test_schemaeditor.robot\n@@ -1,16 +1,13 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-\n-*** Test Cases ***\n+*** Test cases ***\n \n Scenario: As a site owner I can see language independent field setting\n Given a site owner\n@@ -42,54 +39,54 @@ Scenario: As a site owner I can unset field from being language independent\n # Given\n \n a site owner\n- Enable autologin as Manager\n+ Enable autologin as Manager\n \n a dexterity content type with a TTW field\n- Create content type Custom\n- Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n- Wait until page contains element css=body.template-fields\n+ Create content type Custom\n+ Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n+ Get Element //body[contains(@class, "template-fields")]\n \n a dexterity content type field settings form\n- Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n- Go to ${PLONE_URL}/dexterity-types/Custom/custom\n- Wait until page contains Language independent field\n+ Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n+ Go to ${PLONE_URL}/dexterity-types/Custom/custom\n+ Get Text //div[@id="form-widgets-IFieldLanguageIndependent-languageindependent"] contains Language independent field\n \n a dexterity content type with a language independent TTW field\n- Create content type Custom\n- Set field language independent Custom custom on\n- Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n- Wait until page contains element css=body.template-fields\n+ Create content type Custom\n+ Set field language independent Custom custom on\n+ Go to ${PLONE_URL}/dexterity-types/Custom/@@fields\n+ Get Element //body[contains(@class, "template-fields")]\n \n # When\n \n I open the field settings\n- Go to ${PLONE_URL}/dexterity-types/Custom/custom\n- Page should contain Language independent field\n+ Go to ${PLONE_URL}/dexterity-types/Custom/custom\n+ Get Text //div[@id="form-widgets-IFieldLanguageIndependent-languageindependent"] contains Language independent field\n \n I select the language independent field setting\n- Select checkbox form-widgets-IFieldLanguageIndependent-languageindependent-0\n- Checkbox should be selected form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Check Checkbox //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"]\n+ Get Checkbox State //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"] == checked\n \n I save the form\n- Wait until page contains element css=#form-buttons-save\n- Click button css=#form-buttons-save\n- Wait until keyword succeeds 1 10 Element should not be visible .plone-modal-wrapper\n+ Get Element //*[@id="form-buttons-save"]\n+ Click //*[@id="form-buttons-save"]\n+ Get Element Count //div[contains(@class,"plone-modal-wrapper")] should be 0\n \n I open the form again\n- Go to ${PLONE_URL}/dexterity-types/Custom/custom\n- Wait until page contains Language independent field\n+ Go to ${PLONE_URL}/dexterity-types/Custom/custom\n+ Get Text //div[@id="form-widgets-IFieldLanguageIndependent-languageindependent"] contains Language independent field\n \n I unselect the language independent field setting\n- Unselect checkbox form-widgets-IFieldLanguageIndependent-languageindependent-0\n- Checkbox should not be selected form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Uncheck Checkbox //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"]\n+ Get Checkbox State //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"] == unchecked\n \n # Then\n \n I can see the language independent field setting\n- Wait until page contains element id=form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Get Element //*[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"]\n \n the language independent field setting is selected\n- Checkbox should be selected form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Get Checkbox State //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"] == checked\n \n the language independent field setting is not selected\n- Checkbox should not be selected form-widgets-IFieldLanguageIndependent-languageindependent-0\n+ Get Checkbox State //input[@id="form-widgets-IFieldLanguageIndependent-languageindependent-0"] == unchecked\ndiff --git a/src/plone/app/multilingual/tests/robot/test_translate_content.robot b/src/plone/app/multilingual/tests/robot/test_translate_content.robot\nindex 6c3a9d205..355f1e246 100644\n--- a/src/plone/app/multilingual/tests/robot/test_translate_content.robot\n+++ b/src/plone/app/multilingual/tests/robot/test_translate_content.robot\n@@ -1,16 +1,13 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n+Test Setup Run Keywords Plone Test Setup\n+Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***\n+*** Test cases ***\n \n Scenario: As an editor I can translate a document\n Given a site owner\n@@ -24,7 +21,6 @@ Scenario: As a visitor I can view the translation\n When I switch to Catalan\n Then I can view the document in Catalan\n \n-\n *** Keywords ***\n \n # Given\n@@ -32,48 +28,30 @@ Scenario: As a visitor I can view the translation\n a site owner\n Enable autologin as Manager\n \n-a visitor\n- Disable autologin\n-\n a document in English\n- Create content type=Document\n- ... container=/${PLONE_SITE_ID}/en/\n- ... id=an-english-document\n- ... title=An English Document\n+ Create content type=Document container=/${PLONE_SITE_ID}/en/ id=an-english-document title=An English Document\n \n a document in English with Catalan translation\n- ${uid} = Create content type=Document\n- ... container=/${PLONE_SITE_ID}/en/\n- ... id=an-english-document\n- ... title=An English Document\n- Create translation ${uid} ca\n- ... title=A Catalan Document\n- Go to ${PLONE_URL}/resolveuid/${uid}\n- Wait until page contains An English Document\n+ ${uid}= Create content type=Document container=/${PLONE_SITE_ID}/en/ id=an-english-document title=An English Document\n+ Create translation ${uid} ca title=A Catalan Document\n+ Go to ${PLONE_URL}/resolveuid/${uid}\n+ Get Element //h1[1][text()=\'An English Document\']\n \n # When\n \n I translate the document into Catalan\n- Go to ${PLONE_URL}/en/an-english-document/@@create_translation?language=ca\n- Capture page screenshot\n- Input Text form.widgets.IDublinCore.title A Catalan Document\n- Click Link Dates # workaround for of TinyMCE editor field problem\n- Capture page screenshot\n- Click button css=#form-buttons-save\n-\n- # Wait until page contains Element creat\n- # (Catalan translations not currently available)\n-\n- Wait until page contains A Catalan Document\n+ Go to ${PLONE_URL}/en/an-english-document/@@create_translation?language=ca\n+ Take screenshot\n+ Type Text //input[@name="form.widgets.IDublinCore.title"] A Catalan Document\n+ Take screenshot\n+ Click //button[@id="form-buttons-save"]\n \n I switch to Catalan\n- Click Link xpath=//a[@title=\'Catal\xc3\xa0\']\n- Wait until page contains A Catalan Document\n+ Click //a[@title=\'Catal\xc3\xa0\']\n+ Get Element //h1[1][text()=\'A Catalan Document\']\n \n # Then\n \n I can view the document in Catalan\n- Page Should Contain Element\n- ... xpath=//h1[1][text()=\'A Catalan Document\']\n- Page Should Contain Element\n- ... xpath=//ul[@id=\'portal-languageselector\']/li[contains(@class, \'currentLanguage\')]/a[@title=\'Catal\xc3\xa0\']\n+ Get Element //h1[1][text()=\'A Catalan Document\']\n+ Get Element //ul[@id=\'portal-languageselector\']/li[contains(@class, \'currentLanguage\')]/a[@title=\'Catal\xc3\xa0\']\n' +A news/4056.tests +M Products/CMFPlone/tests/robot/keywords.robot +M Products/CMFPlone/tests/robot/test_actionmenu.robot +M Products/CMFPlone/tests/robot/test_controlpanel_actions.robot +M Products/CMFPlone/tests/robot/test_controlpanel_editing.robot +M Products/CMFPlone/tests/robot/test_controlpanel_filter.robot +M Products/CMFPlone/tests/robot/test_controlpanel_language.robot +M Products/CMFPlone/tests/robot/test_controlpanel_markup.robot +M Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot +M Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot +M Products/CMFPlone/tests/robot/test_controlpanel_search.robot +M Products/CMFPlone/tests/robot/test_controlpanel_security.robot +M Products/CMFPlone/tests/robot/test_controlpanel_site.robot +M Products/CMFPlone/tests/robot/test_controlpanel_social.robot +M Products/CMFPlone/tests/robot/test_controlpanel_types.robot +M Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot +M Products/CMFPlone/tests/robot/test_edit.robot +M Products/CMFPlone/tests/robot/test_edit_user_schema.robot +M Products/CMFPlone/tests/robot/test_folder_contents.robot +M Products/CMFPlone/tests/robot/test_linkintegrity.robot +M Products/CMFPlone/tests/robot/test_livesearch.robot +M Products/CMFPlone/tests/robot/test_overlays.robot +M Products/CMFPlone/tests/robot/test_portlets.robot +M Products/CMFPlone/tests/robot/test_querystring.robot +M Products/CMFPlone/tests/robot/test_tinymce.robot +D Products/CMFPlone/tests/robot/common.robot +D Products/CMFPlone/tests/robot/robodoc/README.rst +D Products/CMFPlone/tests/robot/robodoc/TODO.rst +D Products/CMFPlone/tests/robot/robodoc/anonymous.robot +D Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot +D Products/CMFPlone/tests/robot/robodoc/collaboration.robot +D Products/CMFPlone/tests/robot/robodoc/common.robot +D Products/CMFPlone/tests/robot/robodoc/config-screens.robot +D Products/CMFPlone/tests/robot/robodoc/content.robot +D Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot +D Products/CMFPlone/tests/robot/robodoc/managing_content.robot +D Products/CMFPlone/tests/robot/robodoc/personalsettings.robot +D Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot + +b'diff --git a/Products/CMFPlone/tests/robot/common.robot b/Products/CMFPlone/tests/robot/common.robot\ndeleted file mode 100644\nindex 33791aa6dc..0000000000\n--- a/Products/CMFPlone/tests/robot/common.robot\n+++ /dev/null\n@@ -1,69 +0,0 @@\n-*** Settings ***\n-\n-Resource plone/app/robotframework/variables.robot\n-\n-Library Remote ${PLONE_URL}/RobotRemote\n-\n-*** Variables ***\n-\n-${TEST_FOLDER} test-folder\n-\n-*** Keywords ***\n-\n-a document\n- [Arguments] ${title}\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Document\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${title}\'); return 0;\n- Click Button Save\n-\n-a folder\n- [Arguments] ${title}\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Folder\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${title}\'); return 0;\n- Click Button Save\n-\n-a folder \'${foldername}\' with a document \'${documentname}\'\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Folder\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${foldername}\'); return 0;\n- Click Button Save\n- Go to ${PLONE_URL}/${TEST_FOLDER}/folder/edit\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${documentname}\'); return 0;\n- Click Button Save\n-\n-a collection\n- [Arguments] ${title}\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Collection\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${title}\'); return 0;\n- Click Button Save\n-\n-a site owner\n- Log in as site owner\n-\n-the site root\n- Go to ${PLONE_URL}\n-\n-a test folder\n- Go to ${PLONE_URL}/++add++Folder\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'Test Folder\'); return 0;\n- Click Button Save\n-\n-the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n-\n-there should be \'${count}\' livesearch results\n- Wait until keyword succeeds 5s 1s Element Should Be Visible css=div#LSResult\n- Wait until keyword succeeds 5s 1s Xpath Should Match X Times //div[@id = \'LSResult\']/descendant::li ${count}\n-\n-patterns are loaded\n- Wait For Condition return !!document.querySelector(\'body.patterns-loaded\')\n-\n-Refresh JS/CSS resources\n- # Not needed anymore, and it is breaking the Plone Zope 4 tests.\n- # Keep the keyword for backwards compatibility purposes.\n- Sleep 0.0000001\ndiff --git a/Products/CMFPlone/tests/robot/keywords.robot b/Products/CMFPlone/tests/robot/keywords.robot\nindex ca0c598c4b..7e7254ee5d 100644\n--- a/Products/CMFPlone/tests/robot/keywords.robot\n+++ b/Products/CMFPlone/tests/robot/keywords.robot\n@@ -1,39 +1,115 @@\n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- SETUP ------------------------------------------------------------------\n+# SETUP\n \n Refresh JS/CSS resources\n # Not needed anymore, and it is breaking the Plone Zope 4 tests.\n # Keep the keyword for backwards compatibility purposes.\n Sleep 0.0000001\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n+\n+a logged-in manager\n+ Enable autologin as\n+ ... Manager\n+\n+a logged-in member\n+ Enable autologin as\n+ ... Member\n \n a logged-in site administrator\n- Enable autologin as Site Administrator Contributor Reviewer\n+ Enable autologin as\n+ ... Site Administrator\n+ ... Contributor\n+ ... Reviewer\n+\n \n a document \'${title}\'\n- Create content type=Document id=doc title=${title}\n+ Create content\n+ ... type=Document\n+ ... id=doc\n+ ... title=${title}\n \n a file \'${title}\'\n- Create content type=File id=file title=${title}\n+ Create content\n+ ... type=File\n+ ... id=file\n+ ... title=${title}\n \n a news item \'${title}\'\n- Create content type=News Item id=doc title=${title}\n+ Create content\n+ ... type=News Item\n+ ... id=doc\n+ ... title=${title}\n \n an image \'${title}\'\n- Create content type=Image id=doc title=${title}\n+ Create content\n+ ... type=Image\n+ ... id=doc\n+ ... title=${title}\n \n a folder \'${title}\'\n- Create content type=Folder title=${title}\n-\n-patterns are loaded\n- Wait For Condition return !!document.querySelector(\'body.patterns-loaded\')\n+ Create content\n+ ... type=Folder\n+ ... title=${title}\n \n a folder with a document \'${title}\'\n- ${folder_uid}= Create content type=Folder title=folder\n- Create content type=Document container=${folder_uid} title=${title}\n+ ${folder_uid}= Create content type=Folder title=folder\n+ Create content\n+ ... type=Document\n+ ... container=${folder_uid}\n+ ... title=${title}\n+\n+Remove line from textarea\n+ [Arguments] ${fieldName} ${value}\n+\n+ Import library String\n+ ${lines}= Get Text //textarea[@name="${fieldName}"]\n+ ${lines}= Remove String ${lines} ${value}\\n\n+ Type Text //textarea[@name="${fieldName}"] ${lines}\n+\n+\n+Click item in contenbrowser column\n+ [arguments] ${colnumber} ${itemposition}\n+ Wait For Condition Element States //div[contains(@class, "content-browser-wrapper")]//div[contains(@class, "levelColumns")]/div[${colnumber}]/div[contains(@class, "levelItems")]/div[${itemposition}] contains visible\n+ Click //div[contains(@class, "content-browser-wrapper")]//div[contains(@class, "levelColumns")]/div[${colnumber}]/div[contains(@class, "levelItems")]/div[${itemposition}]\n+\n+\n+Fill text to tinymce editor\n+ [Arguments] ${text}\n+\n+ Wait For Condition Classes //body contains patterns-loaded\n+\n+ ${old} = Set Selector Prefix //div[contains(@class, "tox-edit-area")]//iframe >>>\n+ Wait for Condition Element States //body contains visible\n+ Type Text //body ${text}\n+ Wait for Condition Text //body != ""\n+ Set Selector Prefix ${old}\n+\n+Fill source code to tinymce editor\n+ [Arguments] ${source_code}\n+\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Wait For Condition Element States //div[contains(@class,"tox-tinymce") and @role="application"] contains visible\n+ Wait for Condition Element States //div[contains(@class, "tox-edit-area")]//iframe >>> body contains visible\n+\n+ # Click the View menu button\n+ Click //span[contains(@class,"tox-mbtn__select-label") and contains(text(),"View")]/parent::button\n+ Wait for Condition Element States //div[@class="tox-collection__group"] contains visible\n+\n+ # Click the Source code menu button\n+ Click //div[@class="tox-collection__item-label" and contains(text(),"Source code")]/parent::div\n+\n+ # Open dialog for source code insert\n+ ${textarea}= Get Element //textarea[@class="tox-textarea"]\n+ Wait for Condition Element States ${textarea} contains visible\n+ Type Text ${textarea} ${source_code}\n+ # Save\n+ Click //button[@class="tox-button" and contains(text(),"Save")]\n+\n+ Wait for Condition Text //div[contains(@class, "tox-edit-area")]//iframe >>> body != ""\n+\n \n-folder contents pattern loaded\n- Page should contain element css=.pat-structure\n- Wait For Condition return !!document.querySelector(\'.pat-structure div.navbar\')\n+Pause\n+ Import library Dialogs\n+ Pause execution\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/README.rst b/Products/CMFPlone/tests/robot/robodoc/README.rst\ndeleted file mode 100644\nindex d25585bf30..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/README.rst\n+++ /dev/null\n@@ -1,85 +0,0 @@\n-==============\n-ROBODOC README\n-==============\n-\n-The ``robodoc`` folder contains Robot Framework tests moved from the Plone documentation project.\n-Because they are designed to be run as test suite level stories (sandbox is cleared only when changing a robot file),\n-they are not integrated with zope.testrunner (``./bin/test``), but are designed to be run with Robot Framework test runner (``pybot``).\n-\n-\n-Installing Robot Framework\n-==========================\n-\n-Most tools needed to run the tests and generate the screenshots are available from within a standard Plone buildout.coredev environment.\n-The only extra piece of software needed is `webdriver` for your operating system and browser of choice, and that browser.\n-\n-Minimal buildout to generate a good enough Robot Framework test runner would look like the following:\n-\n-.. code:: ini\n-\n- [buildout]\n- extends = https://dist.plone.org/release/5-latest/versions.cfg\n- parts = robot\n-\n- [robot]\n- recipe = zc.recipe.egg\n- eggs =\n- Plone\n- Pillow\n- robotframework-selenium2screenshots\n- plone.app.robotframework [debug]\n-\n-\n-Running the tests\n-=================\n-\n-There are two possible ways to run the tests.\n-\n-The first option is to run them with a single command:\n-\n-.. code:: bash\n-\n- $ bin/pybot -v BROWSER:phantomjs src/Products.CMFPlone/Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot\n-\n-This command will 1) start up a Plone site, 2) run the defined test suite and 3) shut down the Plone site. It will take some time.\n-``-v BROWSER:phantomjs`` is optional, and will define a Robot Framework variable named ``BROWSER`` with value ``phantomjs``, effectively running the test suite using headless PhantomJS browser.\n-\n-You can run multiple test suites in the same directory,\n-\n-.. code:: bash\n-\n- $ bin/pybot -v BROWSER:phantomjs src/Products.CMFPlone/Products/CMFPlone/tests/robot/robodoc\n-\n-will run all tests and generate all screenshots.\n-\n-The second option is to first start a robot server and only then, in parallel, to execute the desired test suite:\n-\n-.. code:: bash\n-\n- $\xc2\xa0APPLY_PROFILES=plone.app.contenttypes:plone-content bin/robot-server plone.app.robotframework.PLONE_ROBOT_TESTING\n-\n-or\n-\n-.. code:: bash\n-\n- $\xc2\xa0CONFIGURE_PACKAGES=plone.app.iterate APPLY_PROFILES=plone.app.contenttypes:plone-content,plone.app.iterate:default bin/robot-server plone.app.robotframework.PLONE_ROBOT_TESTING\n-\n-and\n-\n- $ bin/pybot -v ROBOT_SERVER:True -v BROWSER:phantomjs src/Products.CMFPlone/Products/CMFPlone/tests/robot/robodoc/screenshot-tall/collaboration-advanced_control.robot\n-\n-This option will be faster for subsequent runs.\n-\n-Environment variable ``APPLY_PROFILES`` can be set to a comma separated list of Generic Setup profiles and is used by the very special test fixture ``PLONE_ROBOT_TESTING`` to prepare a Plone site with those profiles installed. There\'s also an another special variable ``CONFIGURE_PACKAGES`` that can be set to a comma separated list of package names (e.g. to ``plone.app.iterate``) to configure more profiles to be available for ``APPLY_PROFILES``.\n-\n-A special variable ``ROBOT_SERVER:True`` must be set for Robot Framework test runner to fix the test suite to be aware of being executed against long-running robot server.\n-\n-Screenshots for documentation\n-=============================\n-\n-The screenshots are meant for the Plone documentation.\n-\n-As there are still browser bugs, it is good to visually inspect them before they are uploaded in the repository\n-https://github.com/plone/documentation-roboshots\n-\n-In there, the tagged releases should contain known-good-sets of screenshots for a particular Plone version.\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/TODO.rst b/Products/CMFPlone/tests/robot/robodoc/TODO.rst\ndeleted file mode 100644\nindex f6136f2724..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/TODO.rst\n+++ /dev/null\n@@ -1,10 +0,0 @@\n-Browser and webdriver support\n------------------------------\n-\n-2017-07-20:\n-\n-Ubuntu 16.04:\n-\n-- Phantomjs works well, but has issues with iframes. The `working_with_tinymce.robot` tests have visual errors in the screenshots.\n-- Chrome 59 with chromedriver has issues, reportedly Chrome 60 should be better, and be able to do headless screenshots.\n-- Firefox 54 does not work with the current geckodriver software for Linux.\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/anonymous.robot b/Products/CMFPlone/tests/robot/robodoc/anonymous.robot\ndeleted file mode 100644\nindex 89cb4c1c16..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/anonymous.robot\n+++ /dev/null\n@@ -1,96 +0,0 @@\n-*** Settings ***\n-\n-Resource plone/app/robotframework/keywords.robot\n-Resource Selenium2Screenshots/keywords.robot\n-\n-Library plone.app.robotframework.Zope2Server\n-Library OperatingSystem\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-${FIXTURE} plone.app.robotframework.PLONE_ROBOT_TESTING\n-@{CONFIGURE_PACKAGES}\n-@{APPLY_PROFILES} plone.app.contenttypes:plone-content\n-@{DIMENSIONS} 1024 768\n-${ROBOT_SERVER} False\n-\n-*** Keywords ***\n-\n-Common Suite Setup\n- Run keyword if ${ROBOT_SERVER} Setup Plone keywords\n- Run keyword if ${ROBOT_SERVER} Remote ZODB setup ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} Setup Plone site ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} ZODB setup ${FIXTURE}\n-\n- ${language} = Get environment variable LANGUAGE \'en\'\n- Set default language ${language}\n-\n- Open test browser\n- Run keyword and ignore error Set window size @{DIMENSIONS}\n-\n-Common Suite Teardown\n- Close all browsers\n- Run keyword if ${ROBOT_SERVER} Remote ZODB TearDown ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} ZODB TearDown ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} Teardown Plone site\n-\n-Setup Plone site\n- [Arguments] ${zope_layer_dotted_name}\n- Start Zope server ${zope_layer_dotted_name}\n- Wait until keyword succeeds 2min 0s Setup Plone keywords\n-\n-Setup Plone keywords\n- Import library Remote ${PLONE_URL}/RobotRemote\n-\n-Teardown Plone site\n- Close all browsers\n- Stop Zope server\n-\n-Highlight link\n- [Arguments] ${locator}\n- Update element style ${locator} padding 0.5em\n- Highlight ${locator}\n-\n-\n-*** Test Cases ***\n-\n-Take login link screenshot\n- Go to ${PLONE_URL}\n- Highlight link css=#personaltools-login\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/login-link.png\n- ... css=#content-header\n- ... css=#above-content-wrapper\n-\n-\n-Take login screenshot\n- Go to ${PLONE_URL}/login\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/login-popup.png\n- ... css=#content-core\n-\n-Take annotated screenshot\n- Go to ${PLONE_URL}\n- Highlight link css=#personaltools-login\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/anonymous-surfing.png\n- ... css=#content-header\n- ... css=#above-content-wrapper\n-\n- Enable autologin as Manager\n- ${user_id} = Translate user_id\n- ... default=jane-doe\n- ${user_fullname} = Translate user_fullname\n- ... default=Jane Doe\n- Create user ${user_id} Member fullname=${user_fullname}\n- Set autologin username ${user_id}\n-\n-Take logged in screenshot\n- Go to ${PLONE_URL}\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/loggedin-surfing.png\n- ... css=#above-content-wrapper\n- ... css=div.plone-toolbar-container\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot b/Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot\ndeleted file mode 100644\nindex a81141374d..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot\n+++ /dev/null\n@@ -1,44 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-@{DIMENSIONS} 1024 1200\n-\n-*** Test Cases ***\n-\n-Create sample content\n- Go to ${PLONE_URL}\n- Capture page screenshot\n-\n- ${item} = Create content type=Folder\n- ... id=documentation title=Documentation\n- ... description=Here you can find the documentation on our new product\n-\n-Show state menu\n- Go to ${PLONE_URL}/documentation\n-\n- Click link css=#plone-contentmenu-workflow a\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-workflow li.plone-toolbar-submenu-header\n-\n- Mouse over workflow-transition-advanced\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/workflow-advanced-menu.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n- Click link workflow-transition-advanced\n- Wait until element is visible\n- ... css=div.modal-content\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/workflow-advanced.png\n- ... css=div.modal-wrapper\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/collaboration.robot b/Products/CMFPlone/tests/robot/robodoc/collaboration.robot\ndeleted file mode 100644\nindex 32508a142a..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/collaboration.robot\n+++ /dev/null\n@@ -1,92 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-@{DIMENSIONS} 1280 1600\n-\n-*** Test Cases ***\n-\n-Create sample content\n- Go to ${PLONE_URL}\n-\n- ${item} = Create content type=Document\n- ... id=samplepage title=Sample Page\n- ... description=The long wait is now over\n- ... text=

Our new site is built with Plone.

\n-\n-\n-Show state menu\n- Go to ${PLONE_URL}/samplepage\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-workflow\n- Click element css=span.icon-plone-contentmenu-workflow\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-workflow li.plone-toolbar-submenu-header\n-\n- Mouse over workflow-transition-publish\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/workflow-basic.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show sendback\n- Go to ${PLONE_URL}/samplepage\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-workflow\n- Click element css=span.icon-plone-contentmenu-workflow\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-workflow li.plone-toolbar-submenu-header\n-\n- click link workflow-transition-submit\n-\n- Go to ${PLONE_URL}/samplepage\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-workflow\n- Click element css=span.icon-plone-contentmenu-workflow\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-workflow li.plone-toolbar-submenu-header\n-\n- Mouse over workflow-transition-reject\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/workflow-reject.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Create sample folder\n- Go to ${PLONE_URL}\n-\n- ${item} = Create content type=Folder\n- ... id=documentation title=Documentation\n- ... description=Here you can find the documentation on our new product\n-\n-Show sharing menu\n-\n- Go to ${PLONE_URL}/documentation\n-\n- Click link css=#contentview-local_roles a\n-\n- Wait until element is visible\n- ... css=#user-group-sharing-container\n-\n- Update element style portal-footer display none\n-\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/sharing-menu.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/common.robot b/Products/CMFPlone/tests/robot/robodoc/common.robot\ndeleted file mode 100644\nindex 7c2a33733b..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/common.robot\n+++ /dev/null\n@@ -1,55 +0,0 @@\n-*** Settings ***\n-\n-Resource plone/app/robotframework/keywords.robot\n-Resource Selenium2Screenshots/keywords.robot\n-\n-Library plone.app.robotframework.Zope2Server\n-Library OperatingSystem\n-\n-*** Variables ***\n-\n-${FIXTURE} plone.app.robotframework.PLONE_ROBOT_TESTING\n-@{CONFIGURE_PACKAGES}\n-@{APPLY_PROFILES} plone.app.contenttypes:plone-content\n-@{DIMENSIONS} 1024 768\n-${ROBOT_SERVER} False\n-\n-*** Keywords ***\n-\n-Common Suite Setup\n- Run keyword if ${ROBOT_SERVER} Setup Plone keywords\n- Run keyword if ${ROBOT_SERVER} Remote ZODB setup ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} Setup Plone site ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} ZODB setup ${FIXTURE}\n-\n- ${language} = Get environment variable LANGUAGE \'en\'\n- Set default language ${language}\n-\n- Enable autologin as Manager\n- ${user_id} = Translate user_id\n- ... default=jane-doe\n- ${user_fullname} = Translate user_fullname\n- ... default=Jane Doe\n- Create user ${user_id} Member fullname=${user_fullname}\n- Set autologin username ${user_id}\n-\n- Open test browser\n- Run keyword and ignore error Set window size @{DIMENSIONS}\n-\n-Common Suite Teardown\n- Close all browsers\n- Run keyword if ${ROBOT_SERVER} Remote ZODB TearDown ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} ZODB TearDown ${FIXTURE}\n- Run keyword if not ${ROBOT_SERVER} Teardown Plone site\n-\n-Setup Plone site\n- [Arguments] ${zope_layer_dotted_name}\n- Start Zope server ${zope_layer_dotted_name}\n- Wait until keyword succeeds 2min 0s Setup Plone keywords\n-\n-Setup Plone keywords\n- Import library Remote ${PLONE_URL}/RobotRemote\n-\n-Teardown Plone site\n- Close all browsers\n- Stop Zope server\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/config-screens.robot b/Products/CMFPlone/tests/robot/robodoc/config-screens.robot\ndeleted file mode 100644\nindex 8422f57999..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/config-screens.robot\n+++ /dev/null\n@@ -1,212 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-@{DIMENSIONS} 1280 1600\n-@{CONFIGURE_PACKAGES} plone.app.caching\n-@{APPLY_PROFILES} plone.app.contenttypes:plone-content plone.app.caching:default\n-\n-\n-*** Keywords ***\n-\n-Highlight field\n- [Arguments] ${locator}\n- Update element style ${locator} padding 0.5em\n- Highlight ${locator}\n-\n-*** Test Cases ***\n-\n-Show Add-ons setup screen\n- Go to ${PLONE_URL}/prefs_install_products_form\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/addon-setup.png\n- ... css=#content\n-\n-Show caching setup screen\n- Go to ${PLONE_URL}/@@caching-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/caching-setup.png\n- ... css=#content\n-\n-Show Configuration Registry screen\n- Go to ${PLONE_URL}/portal_registry\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/configuration-registry.png\n- ... css=#content\n-\n-Show Content setup screen\n- Go to ${PLONE_URL}/@@content-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/content-setup.png\n- ... css=#content\n-\n- Click element type_id\n-\n- Select From List By Label name=type_id Document\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/content-document.png\n- ... css=#content\n-\n-Show Date setup screen\n- Go to ${PLONE_URL}/@@dateandtime-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/date-setup.png\n- ... css=#content\n-\n-Show Dexterity setup screen\n- Go to ${PLONE_URL}/@@dexterity-types\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/dexterity-setup.png\n- ... css=#content\n-\n-Show Discussion setup screen\n- Go to ${PLONE_URL}/@@discussion-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/discussion-setup.png\n- ... css=#content\n-\n-Show Editing setup screen\n- Go to ${PLONE_URL}/@@editing-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/editing-setup.png\n- ... css=#content\n-\n-Show Error log setup screen\n- Go to ${PLONE_URL}/@@error-log-form\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/errorlog-setup.png\n- ... css=#content\n-\n-Show HTML filter setup screen\n- Go to ${PLONE_URL}/@@filter-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/filter-setup.png\n- ... css=#content\n-\n-Show Image handling setup screen\n- Go to ${PLONE_URL}/@@imaging-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/imaging-setup.png\n- ... css=#content\n-\n-Show Site setup overview screen\n- Go to ${PLONE_URL}/@@overview-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/site-overview.png\n- ... css=#content\n-\n-Show Language setup screen\n- Go to ${PLONE_URL}/@@language-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/language-setup.png\n- ... css=#content\n-\n- Click link autotoc-item-autotoc-1\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/language-negotiation.png\n- ... css=#content\n-\n-Show Mail setup screen\n- Go to ${PLONE_URL}/@@mail-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/mail-setup.png\n- ... css=#content\n-\n-Show ZODB maintenance setup screen\n- Go to ${PLONE_URL}/@@maintenance-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/zodb-setup.png\n- ... css=#content\n-\n-Show Markup setup screen\n- Go to ${PLONE_URL}/@@markup-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/markup-setup.png\n- ... css=#content\n-\n-Show Navigation setup screen\n- Go to ${PLONE_URL}/@@navigation-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/navigation-setup.png\n- ... css=#content\n-\n-Show Resource Registry screen\n- Go to ${PLONE_URL}/@@resourceregistry-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/resource-registry.png\n- ... css=#content\n-\n-Show Search setup screen\n- Go to ${PLONE_URL}/@@search-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/search-setup.png\n- ... css=#content\n-\n-Show Security setup screen\n- Go to ${PLONE_URL}/@@security-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/security-setup.png\n- ... css=#content\n-\n-Show Site setup screen\n- Go to ${PLONE_URL}/@@site-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/site-setup.png\n- ... css=#content\n-\n-Show socialmedia setup screen\n- Go to ${PLONE_URL}/@@social-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/social-setup.png\n- ... css=#content\n-\n-Show Syndication setup screen\n- Go to ${PLONE_URL}/@@syndication-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/syndication-setup.png\n- ... css=#content\n-\n-Show Theming setup screen\n- Go to ${PLONE_URL}/@@theming-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/theme-setup.png\n- ... css=#content\n-\n-Show Tinymce setup screen\n- Go to ${PLONE_URL}/@@tinymce-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-setup.png\n- ... css=#content\n-\n-Show Users setup screen\n- Go to ${PLONE_URL}/@@usergroup-userprefs\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/users-setup.png\n- ... css=#content\n-\n- Go to ${PLONE_URL}/@@usergroup-groupprefs\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/groups-setup.png\n- ... css=#content\n- Go to ${PLONE_URL}/@@usergroup-controlpanel\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/users-settings.png\n- ... css=#content\n- Go to ${PLONE_URL}/@@member-fields\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/users-fields.png\n- ... css=#content\n-\n-Changing the logo\n- Go to ${PLONE_URL}/@@site-controlpanel\n- Highlight field css=#formfield-form-widgets-site_logo\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/change-logo-in-site-control-panel.png\n- ... css=#content\n- ... css=#formfield-form-widgets-site_logo\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/content.robot b/Products/CMFPlone/tests/robot/robodoc/content.robot\ndeleted file mode 100644\nindex 891622ab6a..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/content.robot\n+++ /dev/null\n@@ -1,334 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-\n-\n-*** Test Cases ***\n-\n-Show add collection menu\n- Go to ${PLONE_URL}\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over collection\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-collections_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-\n-Select collection criteria\n- Go to ${PLONE_URL}/++add++Collection\n- Click element css=div.querystring-criteria-index a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/collection-criteria.png\n- ... css=div.select2-drop-active\n-\n-Show add new event menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over event\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-events_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new event add form\n- Page should contain element event\n- Click link event\n-\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Wait until element is visible\n- ... id=portal-footer\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-events_add-form.png\n- ... id=content\n-\n-Show add files menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over file\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-files_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new file add form\n- Page should contain element file\n- Click link file\n-\n- Wait until element is visible\n- ... css=#form-widgets-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-files_add-form.png\n- ... css=#content\n-\n-Show add new folder menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over folder\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-folders_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new folder add form\n- Page should contain element folder\n- Click link folder\n-\n- Wait until element is visible\n- ... css=#form-widgets-IDublinCore-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-folders_add-form.png\n- ... css=#content\n-\n-Show add new image menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over image\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-images_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new image edit form\n- Page should contain element image\n- Click link image\n-\n- Wait until element is visible\n- ... css=#form-widgets-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-images_add-form.png\n- ... css=#content\n-\n-*** Test Cases ***\n-\n-Show add new link menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over link\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-links_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-*** Test Cases ***\n-\n-Show new link add form\n- Page should contain element link\n- Click link link\n-\n- Wait until element is visible\n- ... css=#form-widgets-IDublinCore-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-links_add-form.png\n- ... css=#content\n-\n-Show add new content menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over document\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-content_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show add new news-item menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over news-item\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-news-items_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new news-item edit form\n- Page should contain element news-item\n- Click link news-item\n-\n- Wait until element is visible\n- ... css=#mceu_16-body\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-news-items_add-form.png\n- ... css=#content\n-\n-Show add new page menu\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over document\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-pages_add-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Show new page edit form\n- Page should contain element document\n- Click link document\n-\n- Wait until element is visible\n- ... css=#mceu_16-body\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/adding-pages_add-form.png\n- ... css=#content\n-\n-Show Content restrictions\n- Go to ${PLONE_URL}/news\n-\n- Click link css=#plone-contentmenu-factories a\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Mouse over plone-contentmenu-settings\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/show-restrictions.png\n- ... css=div.plone-toolbar-container\n- ... css=#plone-contentmenu-factories ul\n-\n-Menu restrictions\n- Go to ${PLONE_URL}/news/folder_constraintypes_form\n-\n- Click element form-widgets-constrain_types_mode\n-\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/menu-restrictions.png\n- ... css=#main-container\n-\n-Show basic content properties tab\n- Go to ${PLONE_URL}\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-factories\n- Click element css=span.icon-plone-contentmenu-factories\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-factories li.plone-toolbar-submenu-header\n-\n- Page should contain element document\n- Click link document\n- Update element style portal-footer display none\n-\n- Wait until element is visible\n- ... css=#form-widgets-IDublinCore-title\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/basicpropertiestabs.png\n- ... css=nav.autotoc-nav\n-\n-Show edit page categorization\n- Click link Categorization\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/editpagecategorization.png\n- ... css=#content-core\n-\n-Show content dates settings\n- Click link Dates\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/datessettings.png\n- ... css=#content-core\n-\n-Show content ownershippanel\n- Click link Ownership\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/ownershippanel.png\n- ... css=#content-core\n-\n-Show content settingspanel\n- Click link Settings\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/settingspanel.png\n- ... css=#content-core\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot b/Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot\ndeleted file mode 100644\nindex 6677e9cb83..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot\n+++ /dev/null\n@@ -1,114 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Variables ***\n-\n-@{CONFIGURE_PACKAGES} plone.app.iterate\n-@{APPLY_PROFILES} plone.app.contenttypes:plone-content plone.app.iterate:default\n-# ${REGISTER_TRANSLATIONS} ${CURDIR}/../../_locales\n-\n-*** Test Cases ***\n-\n-Show how to checkout\n- Go to ${PLONE_URL}/front-page\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-actions\n- Click element css=span.icon-plone-contentmenu-actions\n- Wait until element is visible\n- ... css=#plone-contentmenu-actions li.plone-toolbar-submenu-header\n-\n- Mouse over css=#plone-contentmenu-actions-iterate_checkout\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_checkout.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show checkout notification\n- Go to ${PLONE_URL}/front-page\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-actions\n- Click element css=span.icon-plone-contentmenu-actions\n- Wait until element is visible\n- ... css=#plone-contentmenu-actions li.plone-toolbar-submenu-header\n- Click link css=#plone-contentmenu-actions-iterate_checkout\n- Wait until element is visible\n- ... name=form.button.Checkout\n- Click button name=form.button.Checkout\n- Element should be visible css=.portalMessage\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_checkout-notification.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show locked original\n- Go to ${PLONE_URL}/front-page\n-\n- Element should be visible css=#plone-lock-status\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_locked.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show check-in option\n- Go to ${PLONE_URL}/copy_of_front-page\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-actions\n- Click element css=span.icon-plone-contentmenu-actions\n- Wait until element is visible\n- ... css=#plone-contentmenu-actions li.plone-toolbar-submenu-header\n-\n- Mouse over css=#plone-contentmenu-actions-iterate_checkin\n- Update element style portal-footer display none\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_checkin.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n- Click link css=#plone-contentmenu-actions-iterate_checkin\n-\n- Element should be visible css=#checkin_message\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_checkin-form.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show cancel checkout\n- Go to ${PLONE_URL}/copy_of_front-page\n-\n- Wait until element is visible\n- ... css=span.icon-plone-contentmenu-actions\n- Click element css=span.icon-plone-contentmenu-actions\n- Wait until element is visible\n- ... css=#plone-contentmenu-actions li.plone-toolbar-submenu-header\n-\n- Mouse over css=#plone-contentmenu-actions-iterate_checkout_cancel\n- Update element style portal-footer display none\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_cancel-checkout.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n- Click link css=#plone-contentmenu-actions-iterate_checkout_cancel\n-\n- Element should be visible css=.destructive\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/working-copy_cancel-checkout-form.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/managing_content.robot b/Products/CMFPlone/tests/robot/robodoc/managing_content.robot\ndeleted file mode 100644\nindex 1d5de8ccb7..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/managing_content.robot\n+++ /dev/null\n@@ -1,198 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-\n-\n-*** Test Cases ***\n-\n-Show contentrules\n- Go to ${PLONE_URL}/@@rules-controlpanel\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/contentrules-start.png\n- ... css=#content\n- ... css=div.plone-toolbar-container\n-\n-add rule\n- Go to ${PLONE_URL}/+rule/plone.ContentRule\n- Wait until element is visible\n- ... css=#formfield-form-widgets-title\n- Click element css=#form-widgets-title\n- Input text css=#form-widgets-title Send Email when any Page is Modified\n-\n- Click element css=#form-widgets-description\n- Input text css=#form-widgets-description this rule is meant for folders where new staff is having a go\n- Click element css=#formfield-form-widgets-event\n- Select From List By Label id=form-widgets-event Object modified\n-\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/contentrules-add.png\n- ... css=#content\n- Click button css=#form-buttons-save\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/contentrules-conditions.png\n- ... css=#content\n- Wait until element is visible\n- ... name=form.button.Save\n- Click button name=form.button.Save\n-\n-\n-assign rule\n- Go to ${PLONE_URL}/news\n- Click link css=#contentview-contentrules a\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/contentrules-assign.png\n- ... css=#content\n- ... css=div.plone-toolbar-container\n-\n-Edit folder\n- Go to ${PLONE_URL}\n- Click element css=#contentview-folderContents a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-cutpaste.png\n- ... css=#content\n-\n-Deleting content\n- Go to ${PLONE_URL}\n- Click element css=#contentview-folderContents a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-delete.png\n- ... css=#content\n-\n-Edit Page\n- Go to ${PLONE_URL}\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/edit-page.png\n- ... css=#content\n-\n-Foldercontents\n- Go to ${PLONE_URL}\n- Click element css=#contentview-folderContents a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents.png\n- ... css=#content\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-columns.png\n- ... css=#btn-attribute-columns\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-selected.png\n- ... css=#btn-selected-items\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-rearrange.png\n- ... css=#btn-rearrange\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-rearrange.png\n- ... css=#btn-rearrange\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-upload.png\n- ... css=#btn-upload\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-cut.png\n- ... css=#btn-cut\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-copy.png\n- ... css=#btn-copy\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-paste.png\n- ... css=#btn-paste\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-delete.png\n- ... css=#btn-delete\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-rename.png\n- ... css=#btn-rename\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-tags.png\n- ... css=#btn-tags\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-state.png\n- ... css=#btn-workflow\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-properties.png\n- ... css=#btn-properties\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-searchbox.png\n- ... css=#filter\n-\n-Show display menu\n- Go to ${PLONE_URL}\n-\n- Click link css=#plone-contentmenu-display a\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-display li.plone-toolbar-submenu-header\n-\n-\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/display-menu.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Reordering\n- Go to ${PLONE_URL}\n- Click element css=#contentview-folderContents a\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/foldercontents-reorder.png\n- ... css=#content\n-\n-Create sample content for history\n- Go to ${PLONE_URL}\n-\n- ${item} = Create content type=Document\n- ... id=samplepage title=Sample Page\n- ... description=The long wait is now over\n- ... text=

Our new site is built with Plone.

\n- Fire transition ${item} publish\n-\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Click element css=#form-widgets-IDublinCore-title\n- Input text css=#form-widgets-IDublinCore-title Hurray\n- Click element css=#form-widgets-IVersionable-changeNote\n- Input text css=#form-widgets-IVersionable-changeNote Title should be Hurray, not Sample Page.\n- Click button css=#form-buttons-save\n-\n-Show history\n- Go to ${PLONE_URL}/samplepage\n- Click link css=#contentview-history a\n- Wait until element is visible\n- ... css=#history-list\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/content-history.png\n- ... css=#content-header\n- ... css=div.plone-toolbar-container\n-\n-Show portlet management\n- Go to ${PLONE_URL}\n- Click link css=#plone-contentmenu-portletmanager a\n-\n- Wait until element is visible\n- ... css=#plone-contentmenu-portletmanager li.plone-toolbar-submenu-header\n-\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/portlet-menu.png\n- ... css=div.plone-toolbar-container\n- ... css=#content-header\n-\n-Show right portlets\n- Go to ${PLONE_URL}/@@topbar-manage-portlets/plone.footerportlets\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/portlet-footer.png\n- ... css=#content\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/personalsettings.robot b/Products/CMFPlone/tests/robot/robodoc/personalsettings.robot\ndeleted file mode 100644\nindex 7c1edf71a8..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/personalsettings.robot\n+++ /dev/null\n@@ -1,45 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-*** Test Cases ***\n-\n-Show menubar\n- Go to ${PLONE_URL}\n-\n- Click link css=#portal-personaltools a\n-\n- Wait until element is visible\n- ... css=#portal-personaltools li.plone-toolbar-submenu-header\n-\n- Mouse over personaltools-preferences\n- Update element style portal-footer display none\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/show-preferences.png\n- ... css=div.plone-toolbar-container\n- ... css=li.plone-toolbar-submenu-header\n-\n-Show personal preferences\n- Go to ${PLONE_URL}/@@personal-preferences\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/personal-preferences.png\n- ... css=#main-container\n-\n-Show personal information\n- Go to ${PLONE_URL}/@@personal-information\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/personal-information.png\n- ... css=#main-container\n-\n-Show changing password\n- Go to ${PLONE_URL}/@@change-password\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/change-password.png\n- ... css=#main-container\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot b/Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot\ndeleted file mode 100644\nindex 296ba742c0..0000000000\n--- a/Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot\n+++ /dev/null\n@@ -1,79 +0,0 @@\n-*** Settings ***\n-\n-Resource common.robot\n-\n-Suite Setup Common Suite Setup\n-Suite Teardown Common Suite Teardown\n-\n-\n-*** Test Cases ***\n-\n-Create sample content\n- Go to ${PLONE_URL}\n-\n- ${item} = Create content type=Document\n- ... id=samplepage title=Sample Page\n- ... description=The long wait is now over\n- ... text=

Our new site is built with Plone.

\n-\n-\n-Show TinyMCE\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Click element css=#mceu_2-open\n- Click element css=#mceu_2-open\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce.png\n- ... css=#mceu_16\n-\n-Show TinyMCE image\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-imgbutton.png\n- ... css=#mceu_15\n-\n- Click element css=#mceu_15 button\n- Wait until element is visible\n- ... css=h2.modal-title\n- Wait until element is visible\n- ... css=div.common-controls\n-\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-imgdialog.png\n- ... css=div.outer-wrapper\n- ... css=div.modal-content\n-\n-Show TinyMCE insert links\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-linkbutton.png\n- ... css=#mceu_14\n-\n- Click element css=#mceu_14 button\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-linkdialog.png\n- ... css=div.outer-wrapper\n- ... css=div.modal-content\n-\n-Show TinyMCE insert tables\n- Go to ${PLONE_URL}/samplepage\n- Click element css=#contentview-edit a\n- Wait until element is visible\n- ... css=#mceu_16-body\n-\n- Click element css=#mceu_22-open\n- Click element css=#mceu_42-text\n- Wait until element is visible\n- ... css=#mceu_42-text\n- Mouse over css=#mceu_42-text\n- Capture and crop page screenshot\n- ... ${CURDIR}/_robot/tinymce-table.png\n- ... css=div.outer-wrappper\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/test_actionmenu.robot b/Products/CMFPlone/tests/robot/test_actionmenu.robot\nindex 58539cb3ec..27a4bd10c2 100644\n--- a/Products/CMFPlone/tests/robot/test_actionmenu.robot\n+++ b/Products/CMFPlone/tests/robot/test_actionmenu.robot\n@@ -1,24 +1,21 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n+*** Variables ***\n \n-*** Variables ****************************************************************\n+${TITLE} An actionsmenu page\n+${PAGE_ID} an-actionsmenu-page\n \n-${TITLE} An actionsmenu page\n-${PAGE_ID} an-actionsmenu-page\n \n-\n-*** Test cases ***************************************************************\n+*** Test Cases ***\n \n # ---\n # Basic Contentactions menu\n@@ -41,13 +38,13 @@ Scenario: Clicking again collapses action menu\n and an actionsmenu page\n When menu link is clicked\n and menu link is clicked\n+ Then actions menu should not be visible\n \n # ---\n # Switching Contentactions menu by MouseOver\n # ---\n \n-Scenario: Hovering mouse from expanded menu on other menu shows that menu\n- Pass Execution This functionality needs to be fixed for Plone 5, but let\'s not make it break the build for now.\n+Scenario: Click from expanded menu on other menu shows that menu\n Given a logged-in site administrator\n and an actionsmenu page\n When first menu link is clicked\n@@ -88,95 +85,78 @@ Scenario:\n Then I should see \'Item(s) pasted.\' in the page\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n an actionsmenu page\n- Create content type=Document title=${TITLE}\n- Go to ${PLONE_URL}/${PAGE_ID}\n- Wait until page contains An actionsmenu page\n+ Create content type=Document title=${TITLE}\n+ Go To ${PLONE_URL}/${PAGE_ID}\n+ Get Text //body contains An actionsmenu page\n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n+\n+first menu link is clicked\n+ Click xpath=//li[@id=\'plone-contentmenu-workflow\']/a\n \n mouse moves to second menu\n- Click Link xpath=(//div[@class="contentActions"]//a[contains(@class, \'actionMenuHeader\')])[2]\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']/a\n \n I click outside of menu\n- Click Element xpath=//h1\n+ Click xpath=//h1\n \n workflow link is clicked\n # store current state\n- ${OLD_STATE} = Get Text xpath=(//span[contains(@class,\'state-\')])\n- Set Suite Variable ${OLD_STATE} ${OLD_STATE}\n- Given patterns are loaded\n- Click Link xpath=//li[@id=\'plone-contentmenu-workflow\']/a\n- Click Link xpath=(//li[@id=\'plone-contentmenu-workflow\']/ul/li/a)[1]\n- Page Should Contain Item state changed.\n-\n-Open Menu\n- [Arguments] ${elementId}\n- Element Should Not Be Visible css=#${elementId} ul.actionMenuContent\n- Click link css=#${elementId} a.actionMenuHeader\n- Wait until keyword succeeds 5 1 Element Should Be Visible css=#${elementId} .actionMenuContent\n-\n-Open Action Menu\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-actions\']/a\n- Wait until keyword succeeds 5 1 Element Should Be Visible css=#plone-contentmenu-actions .dropdown-menu\n+ ${OLD_STATE}= Get Text xpath=(//span[contains(@class,\'state-\')])\n+ Set Suite Variable ${OLD_STATE} ${OLD_STATE}\n+ Click xpath=//li[@id=\'plone-contentmenu-workflow\']/a\n+ Click xpath=(//li[@id=\'plone-contentmenu-workflow\']/ul/li/a)[1]\n+ Get Text //body contains Item state changed.\n \n I copy the page\n Open Action Menu\n- Click Link css=#plone-contentmenu-actions .actionicon-object_buttons-copy\n- Page should contain copied\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']//a[contains(@class,\'actionicon-object_buttons-copy\')]\n+ Get Text //body contains copied\n \n I paste\n Go to ${PLONE_URL}\n Open Action Menu\n- Click Link css=#plone-contentmenu-actions .actionicon-object_buttons-paste\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']//a[contains(@class,\'actionicon-object_buttons-paste\')]\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n delete link exists\n- Page Should Contain Element xpath=//a[@id=\'plone-contentmenu-actions-delete\']\n+ Get Element Count xpath=//a[@id=\'plone-contentmenu-actions-delete\'] should be 1\n \n delete link should not be visible\n- Element Should Not Be Visible xpath=//div[@class=\'contentActions\']//a[@id=\'plone-contentmenu-actions-delete\']\n+ Wait For Elements State xpath=//li[@id=\'plone-contentmenu-actions\']/a[@id=\'plone-contentmenu-actions-delete\'] hidden\n \n menu link is clicked\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-actions\']/a\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']/a\n \n-delete link should be visible\n- Given patterns are loaded\n- Element Should Be Visible xpath=//div[@class=\'contentActions\']//a[@id=\'plone-contentmenu-actions-delete\']\n+second menu should be visible\n+ Get Element States xpath=//li[@id=\'plone-contentmenu-actions\']/ul[contains(@class,\'dropdown-menu\')] contains visible\n \n-actions menu should be visible\n- Given patterns are loaded\n- Element Should Be Visible xpath=//li[@id=\'plone-contentmenu-actions\']\n+first menu should not be visible\n+ Get Element States xpath=//li[@id=\'plone-contentmenu-workflow\']/ul[contains(@class,\'dropdown-menu\')] contains hidden\n \n-first menu link is clicked\n- Given patterns are loaded\n- Click Link xpath=(//div[@class="contentActions"]//a[contains(@class, \'actionMenuHeader\')])[1]\n+actions menu should not be visible\n+ Get Element States xpath=//li[@id=\'plone-contentmenu-actions\']/ul[contains(@class,\'dropdown-menu\')] contains hidden\n \n-I should see \'${message}\' in the page\n- Wait until page contains ${message}\n- Page should contain ${message}\n+actions menu should be visible\n+ Get Element States xpath=//li[@id=\'plone-contentmenu-actions\']/ul[contains(@class,\'dropdown-menu\')] contains visible\n \n state should have changed\n- Wait until page contains Item state changed\n- ${NEW_STATE} = Get Text xpath=(//span[contains(@class,\'state-\')])\n- # Should Not Be Equal ${NEW_STATE} ${OLD_STATE}\n+ ${NEW_STATE}= Get Text xpath=(//span[contains(@class,\'state-\')])\n+ Should Not Be Equal As Strings ${NEW_STATE} ${OLD_STATE}\n \n-second menu should be visible\n- Element Should Be Visible xpath=(//li[contains(@class, \'actionMenu\')])[2]\n+I should see \'${message}\' in the page\n+ Get Text //body contains ${message}\n \n-first menu should not be visible\n- Given patterns are loaded\n- Wait until keyword succeeds 10s 1s Element Should Not Be Visible xpath=(//li[contains(@class, \'actionMenu\')])[1]//li\n \n-actions menu should not be visible\n- Given patterns are loaded\n- Wait until keyword succeeds 10s 1s Element Should Not Be Visible xpath=//li[@id=\'plone-contentmenu-actions-delete\']\n+# DRY\n \n+Open Action Menu\n+ Click xpath=//li[@id=\'plone-contentmenu-actions\']/a\n+ actions menu should be visible\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_actions.robot b/Products/CMFPlone/tests/robot/test_controlpanel_actions.robot\nindex 8bb0a2513c..a297bb9521 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_actions.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_actions.robot\n@@ -1,137 +1,139 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n \n+*** Test Cases ***\n \n-*** Test Cases ***************************************************************\n+# hint: the `Sleep` Statement is needed for the `Disable autologin` and the commit in the DB, it takes a while\n \n Scenario: Modify an existing action in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I modify an action title\n- Sleep 1\n- Then anonymous users can see the new action title\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I modify an action title\n+ and Sleep 1\n+ Then anonymous users can see the new action title\n \n Scenario: Reorder in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I change the actions order\n- Sleep 1\n- Then anonymous users can see the actions new ordering\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I change the actions order\n+ and Sleep 1\n+ Then anonymous users can see the actions new ordering\n \n Scenario: Create a new action in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I add a new action\n- Sleep 1\n- Then logged-in users can see the new action\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I add a new action\n+ and Sleep 1\n+ Then logged-in users can see the new action\n \n Scenario: Hide/show an action in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I hide an action\n- Sleep 1\n- Then anonymous users cannot see the action anymore\n- Given a logged-in administrator\n- and the actions control panel\n- When I unhide the action\n- Sleep 1\n- Then anonymous users can see the action again\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I hide an action\n+ and Sleep 1\n+ Then anonymous users cannot see the action anymore\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I unhide the action\n+ and Sleep 1\n+ Then anonymous users can see the action again\n \n Scenario: Delete an action in Actions Control Panel\n- Given a logged-in administrator\n- and the actions control panel\n- When I delete an action\n- Sleep 1\n- Then anonymous users cannot see the action anymore\n+ Given a logged-in manager\n+ and the actions control panel\n+ When I delete an action\n+ and Sleep 1\n+ Then anonymous users cannot see the action anymore\n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n-\n-a logged-in administrator\n- Enable autologin as Manager\n+# GIVEN\n \n the actions control panel\n- Go to ${PLONE_URL}/@@actions-controlpanel\n- Wait until page contains Portal actions\n+ Go to ${PLONE_URL}/@@actions-controlpanel\n+ Get Text //body contains Portal actions\n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I modify an action title\n- Click Link css=section:nth-child(3) li:first-child a\n- Wait until page contains Action Settings\n- Input Text for sure form.widgets.title A new site map\n- Wait For Then Click Element css=.pattern-modal-buttons > button\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/a\n+ Wait For Condition Text //body contains Action Settings\n+ Type Text //input[@name="form.widgets.title"] A new site map\n+ Click //div[contains(@class,\'pattern-modal-buttons\')]/button\n+\n \n I change the actions order\n- Click Link css=section:nth-child(3) li:first-child a\n- Wait until page contains Action Settings\n- Input Text for sure form.widgets.position 3\n- Wait For Then Click Element css=.pattern-modal-buttons > button\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/a\n+ Wait For Condition Text //body contains Action Settings\n+ Type Text //input[@name="form.widgets.position"] 3\n+ Click //div[contains(@class,\'pattern-modal-buttons\')]/button\n+\n \n I add a new action\n- Click Link Add new action\n- Wait until page contains New action\n- Select From List By Label form.widgets.category:list User actions\n- Input Text for sure form.widgets.id favorites\n- Wait For Then Click Element css=.pattern-modal-buttons > button\n- Wait until page contains favorites\n- Wait For Then Click Element css=section.category:last-child li:last-child a\n- Wait until page contains Action Settings\n- Input Text for sure form.widgets.title My favorites\n- Input Text for sure form.widgets.url_expr string:\\${globals_view/navigationRootUrl}/favorites\n- Wait For Then Click Element css=.pattern-modal-buttons > button\n+ Click //*[@id="content-core"]/p[@class="addAction"]/a\n+ Wait For Condition Text //body contains New action\n+ Select Options By //select[@name="form.widgets.category:list"] label User actions\n+ Type Text //input[@name="form.widgets.id"] favorites\n+ Click //div[contains(@class,\'pattern-modal-buttons\')]/button\n+ Wait For Condition Text //body contains favorites\n+ Click //*[@id="content-core"]/section[6]/section/ol/li[9]/form/a\n+ Wait For Condition Text //body contains Action Settings\n+ Type Text //input[@name="form.widgets.title"] My favorites\n+ Type Text //input[@name="form.widgets.url_expr"] string:\\${globals_view/navigationRootUrl}/favorites\n+ Click //div[contains(@class,\'pattern-modal-buttons\')]/button\n \n-I delete an action\n- Click Button css=section:nth-child(3) li:first-child button[name=delete]\n- Handle alert\n \n I hide an action\n- Click Button css=section:nth-child(3) li:first-child button[name=hide]\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/button[@name="hide"]\n+\n \n I unhide the action\n- Click Button css=section:nth-child(3) li:first-child button[name=show]\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/button[@name="show"]\n+\n \n-# --- THEN -------------------------------------------------------------------\n+I delete an action\n+ Handle Future Dialogs action=accept\n+ Click //*[@id="content-core"]/section[2]/section/ol/li[1]/form/button[@name="delete"]\n+\n+\n+# THEN\n \n anonymous users can see the new action title\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Contain A new site map\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Text //body contains A new site map\n+\n \n anonymous users can see the actions new ordering\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Contain Element xpath=//div[@id=\'portal-footer\']//ul/li[1]/a/span[contains(text(), \'Accessibility\')]\n- Page Should Contain Element xpath=//div[@id=\'portal-footer\']//ul/li[3]/a/span[contains(text(), \'Site Map\')]\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Element //div[@id=\'portal-footer\']//ul/li[1]/a/span[contains(text(), \'Accessibility\')]\n+ Get Element //div[@id=\'portal-footer\']//ul/li[3]/a/span[contains(text(), \'Site Map\')]\n+\n \n logged-in users can see the new action\n- Disable autologin\n- Enable autologin as Contributor\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Contain My favorites\n+ Disable autologin\n+ Enable autologin as Contributor\n+ Go to ${PLONE_URL}\n+ Get Element Count //*[@id="personaltools-favorites"] should be 1\n+ Get Text //*[@id="personaltools-favorites"] contains My favorites\n+\n \n anonymous users cannot see the action anymore\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Not Contain Site Map\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Text //body not contains Site Map\n+\n \n anonymous users can see the action again\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Accessibility\n- Page Should Contain Site Map\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Text //body contains Site Map\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_editing.robot b/Products/CMFPlone/tests/robot/test_controlpanel_editing.robot\nindex 3d997f0899..1b76469bc6 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_editing.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_editing.robot\n@@ -1,105 +1,109 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n+*** Variables ***\n \n-*** Test Cases ***************************************************************\n+${PAGE_TITLE} Doc\n+${PAGE_ID} doc\n+\n+*** Test Cases ***\n \n Scenario: Disable Standard Editor in the Editing Control Panel\n- Given a logged-in site administrator\n- and the editing control panel\n- When I disable the standard editor\n-# XXX: This test fails because the TinyMCE 4 widget ignores both the old and\n-# the new setting.\n-# Then I do not see the standard editor when I create a document\n+ Given a logged-in site administrator\n+ and the editing control panel\n+ When I disable the standard editor\n+ Then I do not see the standard editor when I create a document\n+\n+ When I go to the editing control panel\n+ and I enable the standard editor\n+ Then I see the standard editor when I create a document\n+\n \n Scenario: Enable Link Integrity Check in the Editing Control Panel\n- Given a logged-in site administrator\n- and the editing control panel\n- When I enable link integrity checks\n-# XXX: Enabling referencefield behaviour for Documents to make this test work makes other tests fail.\n-# See https://github.com/plone/Products.CMFPlone/issues/255 for details.\n-# Then I will be warned if I remove a linked document\n+ Given a logged-in site administrator\n+ and the editing control panel\n+ When I enable link integrity checks\n+ # Linkintegrity checks are in `test_linkintegrity.robot`\n \n \n Scenario: Enable Lock on Through The Web in the Editing Control Panel\n- Given a logged-in site administrator\n- and the editing control panel\n- When I enable lock on through the web\n-# XXX: This test is not finished yet.\n-# Then I will see a warning if a document is edited by another user\n+ Given a logged-in site administrator\n+ and the editing control panel\n+ and a document \'${PAGE_TITLE}\'\n+ When I enable lock on through the web\n+ and I edit the document\n+ Then I will see a warning if a document is edited by another user\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+the editing control panel\n+ Go to ${PLONE_URL}/@@editing-controlpanel\n \n-a logged-in manager\n- Enable autologin as Manager\n \n-a document \'${title}\'\n- Create content type=Document id=doc title=${title}\n+# WHEN\n \n-the editing control panel\n- Go to ${PLONE_URL}/@@editing-controlpanel\n- Wait until page contains Editing Settings\n+I disable the standard editor\n+ Select Options By //select[@name="form.widgets.default_editor:list"] label None\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n-# --- WHEN -------------------------------------------------------------------\n \n-I disable the standard editor\n- Select from list by label name=form.widgets.default_editor:list None\n- Click Button Save\n- Wait until page contains Changes saved\n+I enable the standard editor\n+ Select Options By //select[@name="form.widgets.default_editor:list"] label TinyMCE\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n+\n+I go to the editing control panel\n+ Go to ${PLONE_URL}/@@editing-controlpanel\n+\n \n I enable link integrity checks\n- Select Checkbox name=form.widgets.enable_link_integrity_checks:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_link_integrity_checks:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n \n I enable lock on through the web\n- Select Checkbox name=form.widgets.lock_on_ttw_edit:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.lock_on_ttw_edit:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n+I edit the document\n+ Go to ${PLONE_URL}/${PAGE_ID}\n+ Click //li[@id="contentview-edit"]/a\n+ Get Text //body contains Edit Page\n \n-# --- THEN -------------------------------------------------------------------\n \n-I can see an id field in the settings tab when I create a document\n- Go To ${PLONE_URL}/++add++Document\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'My Document\'); return 0;\n- Click Link Settings\n- Page should contain element name=form.widgets.IShortName.id\n- Input Text name=form.widgets.IShortName.id this-is-my-custom-short-name\n- Click Button Save\n- Wait until page contains Item created\n- Location should be ${PLONE_URL}/this-is-my-custom-short-name/view\n+# THEN\n \n I do not see the standard editor when I create a document\n- Go To ${PLONE_URL}/++add++Document\n- Wait until page contains Add Page\n- Page should not contain element css=.mce-tinymce\n-\n-I will be warned if I remove a linked document\n- ${doc1_uid}= Create content id=doc1 type=Document\n- ${doc2_uid}= Create content id=doc2 type=Document\n- Set field value uid=${doc1_uid} field=text field_type=text/html value=

link

\n- Go To ${PLONE_URL}/doc2/delete_confirmation\n- Wait until page contains doc2\n- Click Button Delete\n- Wait until page contains Potential link breakage\n+ Go To ${PLONE_URL}/++add++Document\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Wait For Condition Element Count //*[@id="formfield-form-widgets-IRichTextBehavior-text"]/div[@role="application"] should be 0\n+ Wait For Condition Element States //textarea[@name="form.widgets.IRichTextBehavior.text"] contains visible\n+\n+\n+I see the standard editor when I create a document\n+ Go To ${PLONE_URL}/++add++Document\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Wait For Condition Element Count //*[@id="formfield-form-widgets-IRichTextBehavior-text"]/div[@role="application"] should be 1\n+ Wait For Condition Element States //textarea[@name="form.widgets.IRichTextBehavior.text"] contains hidden\n \n I will see a warning if a document is edited by another user\n- ${doc1_uid}= Create content id=doc1 type=Document\n+ Disable autologin\n+ Enable autologin as Contributor Reviewer Manager\n+ New Page ${PLONE_URL}/${PAGE_ID}\n+ Wait For Condition Text //body contains Lock\n+ Wait For Condition Element Count //input[@value="Unlock"] should be 1\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot b/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot\nindex bcdf3307aa..008639c174 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot\n@@ -1,160 +1,162 @@\n-# ============================================================================\n-# Tests for the Plone Filter Control Panel\n-# ============================================================================\n-#\n-# $ bin/robot-server --reload-path src/Products.CMFPlone/Products/CMFPlone/ Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-#\n-# $ bin/robot src/Products.CMFPlone/Products/CMFPlone/tests/robot/test_controlpanel_filter.robot\n-#\n-# ============================================================================\n-\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n-\n-Library Remote ${PLONE_URL}/RobotRemote\n-Library Collections\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource keywords.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n \n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Configure Filter Control Panel to filter out nasty tags\n- Given a logged-in site administrator\n- and the filter control panel\n- When I add \'h1\' to the nasty tags list and remove it from the valid tags list\n- Then the \'h1\' tag is filtered out when a document is saved\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I add \'h1\' to the nasty tags list and remove it from the valid tags list\n+ Then the \'h1\' tag is filtered out when a document is saved\n \n Scenario: Configure Filter Control Panel to strip out tags\n- Given a logged-in site administrator\n- and the filter control panel\n- When I remove \'h1\' from the valid tags list\n- Then the \'h1\' tag is stripped when a document is saved\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I remove \'h1\' from the valid tags list\n+ Then the \'h1\' tag is stripped when a document is saved\n \n Scenario: Configure Filter Control Panel to allow custom tags\n- Given a logged-in site administrator\n- and the filter control panel\n- When I add \'foobar\' to the valid tags list\n- Then the \'foobar\' tag is preserved when a document is saved\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I add \'foobar\' to the valid tags list\n+ Then the \'foobar\' tag is preserved when a document is saved\n \n Scenario: Configure Filter Control Panel to allow custom attributes\n- Given a logged-in site administrator\n- and the filter control panel\n- When I add \'foo-foo\' to the custom attributes list\n- Then the \'foo-foo\' attribute is preserved when a document is saved\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I add \'foo-foo\' to the custom attributes list\n+ Then the \'foo-foo\' attribute is preserved when a document is saved\n \n Scenario: Filter Control Panel displays information regarding caching when saved\n- Given a logged-in site administrator\n- and the filter control panel\n- When I save the form\n- Then success message should contain information regarding caching\n-\n+ Given a logged-in site administrator\n+ and the filter control panel\n+ When I save the form\n+ Then success message should contain information regarding caching\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the filter control panel\n- Go to ${PLONE_URL}/@@filter-controlpanel\n- Wait until page contains HTML Filtering Settings\n-\n-Input RichText\n- [Arguments] ${input}\n- # Sleep to avoid random failures where the text is not actually set.\n- # This warning from the robotframework docs might be the cause:\n- # "Starting from Robot Framework 2.5 errors caused by invalid syntax, timeouts,\n- # or fatal exceptions are not caught by this keyword."\n- # See https://robotframework.org/robotframework/2.6.1/libraries/BuiltIn.html#Wait%20Until%20Keyword%20Succeeds\n- Sleep 1\n- Wait until keyword succeeds 5s 1s Set and Check TinyMCE Content ${input}\n-\n-Set and Check TinyMCE Content\n- [Arguments] ${input}\n- # Simply check if tinyMCE.getContent() isn\'t empty when we set an input\n- Execute Javascript tinyMCE.activeEditor.setContent(\'${input}\');\n- Sleep 0.5\n- ${check}= Execute Javascript return tinyMCE.activeEditor.getContent();\n- Should not be empty ${check}\n-\n-\n-# --- WHEN -------------------------------------------------------------------\n+ Go to ${PLONE_URL}/@@filter-controlpanel\n+\n+# WHEN\n \n I add \'${tag}\' to the nasty tags list and remove it from the valid tags list\n- Input Text name=form.widgets.nasty_tags ${tag}\n- Remove line from textarea form.widgets.valid_tags ${tag}\n- I save the form\n+ Type Text //textarea[@name="form.widgets.nasty_tags"] ${tag}\n+ Remove line from textarea form.widgets.valid_tags ${tag}\n+ I save the form\n+\n+\n+I save the form\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n \n I remove \'${tag}\' from the valid tags list\n- Remove line from textarea form.widgets.valid_tags ${tag}\n- I save the form\n+ Remove line from textarea form.widgets.valid_tags ${tag}\n+ I save the form\n+\n \n I add \'${tag}\' to the valid tags list\n- Input Text name=form.widgets.valid_tags ${tag}\n- I save the form\n- Page Should Contain ${tag}\n+ Type Text //textarea[@name="form.widgets.valid_tags"] ${tag}\n+ I save the form\n+ Get Text //textarea[@name="form.widgets.valid_tags"] contains ${tag}\n+\n \n I add \'${tag}\' to the custom attributes list\n- Input Text name=form.widgets.custom_attributes ${tag}\n- I save the form\n- Page Should Contain ${tag}\n+ Type Text //textarea[@name="form.widgets.custom_attributes"] ${tag}\n+ I save the form\n+ Get Text //textarea[@name="form.widgets.custom_attributes"] contains ${tag}\n \n-I save the form\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+# THEN\n \n+the \'h1\' tag is filtered out when a document is saved\n \n-# --- THEN -------------------------------------------------------------------\n+ ${doc1_uid}= Create content\n+ ... id=doc1\n+ ... title=Document 1\n+ ... type=Document\n+ Go To ${PLONE_URL}/doc1/edit\n+ Fill text to tinymce editor heading\\nSpanish Inquisition\n+ Mark text heading as h1 in tinymce editor\n+ I save the form\n+ Get Text //body contains Spanish Inquisition\n+ Get Text //body not contains heading\n \n-the \'h1\' tag is filtered out when a document is saved\n- ${doc1_uid}= Create content id=doc1 title=Document 1 type=Document\n- Go To ${PLONE_URL}/doc1/edit\n- patterns are loaded\n- Input RichText

h1 heading

Spanish Inquisition

\n- I save the form\n- # We check that some standard text is there, before checking the interesting part.\n- # If the standard text is invisible, then something completely different is wrong.\n- # I see tests randomly fail where the safe html transform is not even called.\n- # In fact, no text is saved. Maybe some timing problem.\n- # I suspect the Input RichText keyword, which is why I added Sleep in there.\n- Page should contain Spanish Inquisition\n- Page should not contain heading\n \n the \'h1\' tag is stripped when a document is saved\n- ${doc1_uid}= Create content id=doc1 title=Document 1 type=Document\n- Go To ${PLONE_URL}/doc1/edit\n- patterns are loaded\n- Input RichText

h1 heading

Spanish Inquisition

\n- I save the form\n- Page should contain Spanish Inquisition\n- Page should contain heading\n- Page Should Contain Element //div[@id=\'content-core\']//h1 limit=0 message=h1 should have been stripped out\n+\n+ ${doc1_uid}= Create content\n+ ... id=doc1\n+ ... title=Document 1\n+ ... type=Document\n+ Go To ${PLONE_URL}/doc1/edit\n+ Fill text to tinymce editor heading\\nSpanish Inquisition\n+ Mark text heading as h1 in tinymce editor\n+ I save the form\n+ Get Text //body contains Spanish Inquisition\n+ Get Text //body contains heading\n+ Get Element Count //div[@id=\'content-core\']//h1 should be 0 message=h1 should have been stripped out\n+\n \n the \'${tag}\' tag is preserved when a document is saved\n- ${doc1_uid}= Create content id=doc1 title=Document 1 type=Document\n- Go To ${PLONE_URL}/doc1/edit\n- patterns are loaded\n- Input RichText <${tag}>lorem ipsum

Spanish Inquisition

\n- I save the form\n- Page should contain Spanish Inquisition\n- Page Should Contain Element //div[@id=\'content-core\']//${tag} limit=1 message=the ${tag} tag should have been preserved\n+\n+ ${doc1_uid}= Create content\n+ ... id=doc1\n+ ... title=Document 1\n+ ... type=Document\n+ Go To ${PLONE_URL}/doc1/edit\n+ Fill source code to tinymce editor <${tag}>lorem ipsum

Spanish Inquisition

\n+ I save the form\n+ Get Text //body contains Spanish Inquisition\n+ Get Element Count //div[@id=\'content-core\']//${tag} should be 1 message=the ${tag} tag should have been preserved\n+\n \n the \'${attribute}\' attribute is preserved when a document is saved\n- ${doc1_uid}= Create content id=doc1 title=Document 1 type=Document\n- Go To ${PLONE_URL}/doc1/edit\n- patterns are loaded\n- Input RichText lorem ipsum

Spanish Inquisition

\n- I save the form\n- Page should contain Spanish Inquisition\n- Page Should Contain Element //span[@${attribute}] limit=1 message=the ${attribute} tag should have been preserved\n+\n+ ${doc1_uid}= Create content\n+ ... id=doc1\n+ ... title=Document 1\n+ ... type=Document\n+ Go To ${PLONE_URL}/doc1/edit\n+ Fill source code to tinymce editor lorem ipsum

Spanish Inquisition

\n+ I save the form\n+ Get Text //body contains Spanish Inquisition\n+ Get Element Count //span[@${attribute}] should be 1 message=the ${attribute} tag should have been preserved\n+\n \n success message should contain information regarding caching\n- Element Should Contain css=.alert-warning HTML generation is heavily cached across Plone. You may have to edit existing content or restart your server to see the changes.\n+ Get Text //*[contains(@class,"alert-warning")] contains HTML generation is heavily cached across Plone. You may have to edit existing content or restart your server to see the changes.\n+\n+\n+# DRY\n+\n+Mark text heading as h1 in tinymce editor\n+\n+ # select the text `heading` via javascript\n+ Evaluate JavaScript //div[contains(@class, \'tox-edit-area\')]//iframe\n+ ... (elem, args) => {\n+ ... let iframe_document = elem.contentDocument;\n+ ... let body = iframe_document.body;\n+ ... let p = body.firstChild;\n+ ... let range = new Range();\n+ ... range.setStart(p.firstChild, 0);\n+ ... range.setEnd(p.firstChild, 7);\n+ ... iframe_document.getSelection().removeAllRanges();\n+ ... iframe_document.getSelection().addRange(range);\n+ ... }\n+ ... all_elements=False\n+ # here we use the editor to format the text `heading` with h1\n+ Click //button[@aria-label="Formats"]\n+ Hover //div[@title="Headers"]\n+ Click //h1[contains(text(), "Header 1")]\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_language.robot b/Products/CMFPlone/tests/robot/test_controlpanel_language.robot\nindex 163081cffa..f7f9c265ad 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_language.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_language.robot\n@@ -1,51 +1,43 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Set Site Language in the Language Control Panel\n- Given a logged-in site administrator\n- and the language control panel\n- When I set the site language to German\n- Then the Plone user interface is in German\n-\n+ Given a logged-in site administrator\n+ and the language control panel\n+ When I set the site language to German\n+ Then the Plone user interface is in German\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the language control panel\n- Go to ${PLONE_URL}/@@language-controlpanel\n- Wait until page contains Language Settings\n+ Go to ${PLONE_URL}/@@language-controlpanel\n+ Get Text //body contains Language Settings\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I set the site language to German\n- Select From List By Label form.widgets.default_language:list Deutsch\n- Select From List By Label form.widgets.available_languages.from Deutsch\n- Click Button \xe2\x86\x92\n- Click Button Save\n- Wait until page contains Changes saved\n+ Select Options By //select[@name="form.widgets.default_language:list"] label Deutsch\n+ Select Options By //select[@name="form.widgets.available_languages.from"] label Deutsch\n+ Click //button[@value="\xe2\x86\x92"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n the Plone user interface is in German\n- Go to ${PLONE_URL}\n- Wait until page contains Lizensiert unter der\n- Page should contain Lizensiert unter der\n+ Go to ${PLONE_URL}\n+ Get Text //body contains Lizensiert unter der\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot\nindex d629df48a9..9b43a45cec 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot\n@@ -1,70 +1,67 @@\n-Documentation\n-... $ bin/robot-server Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-... $ bin/robot test_controlpanel_markup.robot\n+*** Settings ***\n \n-*** Settings *****************************************************************\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Resource keywords.robot\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Change Default Markup Types in the Markup Control Panel\n- Given a logged-in site administrator\n- and the markup control panel\n- When I set allowed types to "text/restructured"\n-#TODO: Waiting on richtext pattern to support this\n-# Then I do not see the standard editor when I create a document\n+ Given a logged-in site administrator\n+ and the markup control panel\n+ When I set allowed types to text/restructured\n+\n+ #TODO: Waiting on richtext pattern to support this\n+ #Then I do not see the standard editor when I create a document\n \n Scenario: Set Default Markup to be Restructured Text\n- Given a logged-in site administrator\n- and the markup control panel\n- When I set the default type to "text/restructured"\n-#TODO: Waiting on richtext pattern to support this\n-# Then I do not see the standard editor when I create a document\n+ Given a logged-in manager\n+ and the markup control panel\n+ When I set the default type to text/restructured\n \n-*** Keywords *****************************************************************\n+ #TODO: Waiting on richtext pattern to support this\n+ #Then I do not see the standard editor when I create a document\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a document \'${title}\'\n- Create content type=Document id=doc title=${title}\n+# GIVEN\n \n the markup control panel\n- Go to ${PLONE_URL}/@@markup-controlpanel\n- Wait until page contains Markup Settings\n+ Go to ${PLONE_URL}/@@markup-controlpanel\n+ Get Text //body contains Markup Settings\n \n \n # --- WHEN -------------------------------------------------------------------\n \n-I set allowed types to "${type}"\n- with the label ${type} Select Checkbox\n- with the label text/html UnSelect Checkbox\n- with the label text/x-web-textile UnSelect Checkbox\n- Click Button Save\n- Wait until page contains Changes saved\n- Checkbox Should Be Selected ${type}\n- Checkbox Should Not Be Selected text/html\n- Checkbox Should Not Be Selected text/x-web-textile\n+I set allowed types to\n+ [Arguments] ${type}\n \n-I set the default type to "${type}"\n- Select from list by label name=form.widgets.default_type:list ${type}\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.allowed_types:list" and @value="${type}"]\n+ Uncheck Checkbox //input[@name="form.widgets.allowed_types:list" and @value="text/html"]\n+ Uncheck Checkbox //input[@name="form.widgets.allowed_types:list" and @value="text/x-web-textile"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n-I disable the standard editor\n- Select from list by label name=form.widgets.default_editor:list None\n- Click Button Save\n- Wait until page contains Changes saved\n+ Get Element States //input[@name="form.widgets.allowed_types:list" and @value="${type}"] contains checked\n+ Get Element States //input[@name="form.widgets.allowed_types:list" and @value="text/html"] not contains checked\n+ Get Element States //input[@name="form.widgets.allowed_types:list" and @value="text/x-web-textile"] not contains checked\n+\n+I set the default type to\n+ [Arguments] ${type}\n+\n+ Select Options By //select[@name="form.widgets.default_type:list"] value ${type}\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n+\n+# I disable the standard editor\n+# Select from list by label name=form.widgets.default_editor:list None\n+# Click Button Save\n+# Wait until page contains Changes saved\n \n \n # --- THEN -------------------------------------------------------------------\n@@ -80,22 +77,7 @@ Then I can see only "${type}" when creating a document\n Wait until page contains Item created\n Location should be ${PLONE_URL}/this-is-my-custom-short-name/view\n \n-I do not see the standard editor when I create a document\n- Go To ${PLONE_URL}/++add++Document\n- Wait until page contains Add Page\n- Page should not contain element css=.mce-tinymce\n-\n-# --- Helpers -----------------------------------------------------------------\n-\n-With the label\n- [arguments] ${title} ${extra_keyword} @{list}\n- ${for}= label "${title}"\n- Run Keyword ${extra_keyword} id=${for} @{list}\n-\n-label "${title}"\n- [Return] ${for}\n- ${for}= Get Element Attribute xpath=//label[contains(., "${title}")] for\n-\n-label2 "${title}"\n- [Return] ${for}\n- ${for}= Get Element Attribute xpath=//label[contains(., "${title}")]//input\n+# I do not see the standard editor when I create a document\n+# Go To ${PLONE_URL}/++add++Document\n+# Pause\n+# Page should not contain element css=.mce-tinymce\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot b/Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot\nindex c277aedf52..f40e8b751c 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot\n@@ -1,115 +1,115 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Disable Generate Tabs in the Navigation Control Panel\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the navigation control panel\n- When I disable generate tabs\n- Then the document \'My Document\' does not show up in the navigation\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the navigation control panel\n+ When I disable generate tabs\n+ Then the document \'My Document\' does not show up in the navigation\n \n Scenario: Enable Folderish Tabs in the Navigation Control Panel\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the navigation control panel\n- When I disable non-folderish tabs\n- Then the document \'My Document\' does not show up in the navigation\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the navigation control panel\n+ When I disable non-folderish tabs\n+ Then the document \'My Document\' does not show up in the navigation\n \n Scenario: Filter Navigation By Displayed Types in the Navigation Control Panel\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the navigation control panel\n- When I remove \'Document\' from the displayed types list\n- Then the document \'My Document\' does not show up in the navigation\n- and the document \'My Document\' does not show up in the sitemap\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the navigation control panel\n+ When I remove \'Document\' from the displayed types list\n+ Then the document \'My Document\' does not show up in the navigation\n+ and the document \'My Document\' does not show up in the sitemap\n \n-#Scenario: Filter Navigation By Workflow States in the Navigation Control Panel\n-# Given a logged-in site administrator\n-# and a published document \'My Document\'\n-# and a private document \'My Internal Document\'\n-# and the navigation control panel\n-# When I enable filtering by workflow states\n-# and I choose to show \'published\' items\n-# and I choose to not show \'private\' items\n-# Then the document \'My Document\' shows up in the navigation\n-# and the document \'My Internal Document\' does not show up in the navigation\n+Scenario: Filter Navigation By Workflow States in the Navigation Control Panel\n+ Given a logged-in site administrator\n+ and a published document \'My Document\'\n+ and a private document \'My Internal Document\'\n+ and the navigation control panel\n+ When I enable filtering by workflow states\n+ and I choose to show \'published\' items\n+ and I choose to not show \'private\' items\n+ Then the document \'My Document\' shows up in the navigation\n+ and the document \'My Internal Document\' does not show up in the navigation\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n the navigation control panel\n- Go to ${PLONE_URL}/@@navigation-controlpanel\n- Wait until page contains Navigation Settings\n+ Go to ${PLONE_URL}/@@navigation-controlpanel\n+ Get Text //body contains Navigation Settings\n \n a published document \'${title}\'\n- ${uid}= a document \'${title}\'\n- Fire transition ${uid} publish\n+ ${uid}= Create content\n+ ... type=Document\n+ ... id=doc\n+ ... title=${title}\n+ Fire transition ${uid} publish\n \n a private document \'${title}\'\n- a document \'${title}\'\n+ Create content\n+ ... type=Document\n+ ... id=doc1\n+ ... title=${title}\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I disable generate tabs\n- Unselect Checkbox form.widgets.generate_tabs:list\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@name="form.widgets.generate_tabs:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I disable non-folderish tabs\n- Unselect Checkbox xpath=//input[@value=\'Document\']\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@value=\'Document\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I remove \'${portal_type}\' from the displayed types list\n- Unselect Checkbox xpath=//input[@value=\'Document\']\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@value=\'Document\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I enable filtering by workflow states\n- Select Checkbox name=form.widgets.filter_on_workflow:list\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.filter_on_workflow:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I choose to show \'${workflow_state}\' items\n- Select Checkbox xpath=//input[@value=\'${workflow_state}\']\n- Wait For Then Click Element form.buttons.save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@value=\'${workflow_state}\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n I choose to not show \'${workflow_state}\' items\n- Unselect Checkbox xpath=//input[@value=\'${workflow_state}\']\n- Click Button Save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@value=\'${workflow_state}\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n the document \'${title}\' shows up in the navigation\n- Go to ${PLONE_URL}\n- Wait until page contains Powered by Plone\n- Page Should Contain Element //ul[@id=\'portal-globalnav\']/li/a[contains(text(), \'${title}\')] limit=1 message=The global navigation should have contained the item \'${title}\'\n+ Go to ${PLONE_URL}\n+ Get Element Count //ul[@id=\'portal-globalnav\']/li/a[contains(text(), \'${title}\')] should be 1 message=The global navigation should have contained the item \'${title}\'\n \n the document \'${title}\' does not show up in the navigation\n- Go to ${PLONE_URL}\n- Wait until page contains Powered by Plone\n- Page Should Contain Element //ul[@id=\'portal-globalnav\']/li/a[contains(text(), \'${title}\')] limit=0 message=The global navigation should not have contained the item \'${title}\'\n+ Go to ${PLONE_URL}\n+ Get Element Count //ul[@id=\'portal-globalnav\']/li/a[contains(text(), \'${title}\')] should be 0 message=The global navigation should not have contained the item \'${title}\'\n \n the document \'${title}\' does not show up in the sitemap\n- Go to ${PLONE_URL}/sitemap\n- Wait until page contains Powered by Plone\n- Page Should Contain Element //ul[@id=\'portal-sitemap\']/li/a/span[contains(text(), \'${title}\')] limit=0 message=The sitemap should not have contained the item \'${title}\'\n+ Go to ${PLONE_URL}/sitemap\n+ Get Element Count //ul[@id=\'portal-sitemap\']/li/a/span[contains(text(), \'${title}\')] should be 0 message=The sitemap should not have contained the item \'${title}\'\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot b/Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot\nindex 6c2f6673c5..037cea873f 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot\n@@ -1,43 +1,40 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Add redirect in the URL Management Control Panel\n- Given a logged-in site administrator\n- and the URL Management control panel\n- When I add a redirect to the test folder from alternative url /old\n- Then I get redirected to the test folder when visiting /old\n+ Given a logged-in site administrator\n+ and the URL Management control panel\n+ When I add a redirect to the test folder from alternative url /old\n+ Then I get redirected to the test folder when visiting /old\n \n \n Scenario: Remove redirect in the URL Management Control Panel\n- Given a logged-in site administrator\n- and the URL Management control panel\n- When I add a redirect to the test folder from alternative url /old\n- and I remove the redirect from alternative url /old\n- Then I do not get redirected when visiting /old\n+ Given a logged-in site administrator\n+ and the URL Management control panel\n+ When I add a redirect to the test folder from alternative url /old\n+ and I remove the redirect from alternative url /old\n+ Then I do not get redirected when visiting /old\n \n \n Scenario: Remove filtered redirects in the URL Management Control Panel\n- Given a logged-in site administrator\n- and the URL Management control panel\n- When I add a redirect to the test folder from alternative url /a\n- and I add a redirect to the test folder from alternative url /b\n- and I filter the redirects with path /a\n- and I remove the matching redirects\n- Then I do not get redirected when visiting /a\n- and I get redirected to the test folder when visiting /b\n+ Given a logged-in site administrator\n+ and the URL Management control panel\n+ When I add a redirect to the test folder from alternative url /a\n+ and I add a redirect to the test folder from alternative url /b\n+ and I filter the redirects with path /a\n+ and I remove the matching redirects\n+ Then I do not get redirected when visiting /a\n+ and I get redirected to the test folder when visiting /b\n \n \n Scenario: Download all redirects in the URL Management Control Panel\n@@ -48,58 +45,59 @@ Scenario: Download all redirects in the URL Management Control Panel\n Then I can download all redirects as CSV\n \n \n-*** Keywords *****************************************************************\n-\n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the URL Management control panel\n- Go to ${PLONE_URL}/@@redirection-controlpanel\n+ Go to ${PLONE_URL}/@@redirection-controlpanel\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I add a redirect to the test folder from alternative url\n- [Documentation] target path must exist in the site\n- [Arguments] ${old}\n- Input Text name=redirection ${old}\n- Input Text name=target_path /test-folder\n- Click Button Add\n+ [Documentation] target path must exist in the site\n+ [Arguments] ${old}\n+ Type Text //input[@name="redirection"] ${old}\n+ Type Text //input[@name="target_path"] /test-folder\n+ Click //button[@name="form.button.Add"]\n \n \n I remove the redirect from alternative url\n- [Arguments] ${old}\n- Select Checkbox xpath=//input[@value=\'/plone${old}\']\n- Click Button Remove selected\n-\n+ [Arguments] ${old}\n+ Check Checkbox //input[@value="/plone${old}"]\n+ Click //button[@name="form.button.Remove"]\n \n I filter the redirects with path\n- [Arguments] ${old}\n- Input Text name=q ${old}\n- Click Button Filter\n+ [Arguments] ${old}\n+ Type Text //input[@name="q"] ${old}\n+ Click //button[@name="form.button.filter"]\n \n I remove the matching redirects\n- Click Button Remove all that match filter\n+ Click //button[@name="form.button.MatchRemove"]\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n I get redirected to the test folder when visiting\n- [Arguments] ${old}\n- Go to ${PLONE_URL}/${old}\n- Location Should Be ${PLONE_URL}/test-folder\n+ [Arguments] ${old}\n+ Go to ${PLONE_URL}/${old}\n+ Get Url should be ${PLONE_URL}/test-folder\n \n \n I do not get redirected when visiting\n- [Arguments] ${old}\n- Go to ${PLONE_URL}/${old}\n- Location Should Be ${PLONE_URL}/${old}\n- Wait Until Page Contains This page does not seem to exist\n+ [Arguments] ${old}\n+ Go to ${PLONE_URL}/${old}\n+ Get Url should be ${PLONE_URL}/${old}\n+ Get Text //body contains This page does not seem to exist\n \n \n I can download all redirects as CSV\n- [Documentation] I don\'t know how to get the contents of the downloaded file\n- Click Button Download all as CSV\n- Page Should Not Contain there seems to be an error\n+ [Documentation] Test the download of CSV file\n+\n+ Import library OperatingSystem\n+\n+ ${dl_promise} Promise To Wait For Download saveAs=redirections.csv\n+ Click //button[@name="form.button.Download"]\n+ ${file_obj}= Wait For ${dl_promise}\n+ File Should Exist ${file_obj}[saveAs]\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_search.robot b/Products/CMFPlone/tests/robot/test_controlpanel_search.robot\nindex de9c3b5cfe..8bc821890b 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_search.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_search.robot\n@@ -1,81 +1,65 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Enable Livesearch in the Search Control Panel\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the search control panel\n- When I enable livesearch\n-# Then then searching for \'My Document\' will show a live search\n-# XXX: Not implemented yet. See https://github.com/plone/Products.CMFPlone/issues/176 for details\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the search control panel\n+ When I enable livesearch\n+ Then then searching for \'My Document\' will show a live search\n \n Scenario: Exclude Content Types from Search\n- Given a logged-in site administrator\n- and a document \'My Document\'\n- and the search control panel\n- When I exclude the \'Document\' type from search\n- Then searching for \'My Document\' will not return any results\n-\n-\n-*** Keywords *****************************************************************\n+ Given a logged-in site administrator\n+ and a document \'My Document\'\n+ and the search control panel\n+ When I exclude the \'Document\' type from search\n+ Then searching for \'My Document\' will not return any results\n \n-# --- GIVEN ------------------------------------------------------------------\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+*** Keywords ***\n \n-a document \'${title}\'\n- Create content type=Document id=doc title=${title}\n+# GIVEN\n \n the search control panel\n- Go to ${PLONE_URL}/@@search-controlpanel\n- Wait until page contains Search Settings\n+ Go to ${PLONE_URL}/@@search-controlpanel\n+ Get Text //body contains Search Settings\n \n-\n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I enable livesearch\n- Select Checkbox form.widgets.enable_livesearch:list\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_livesearch:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I exclude the \'${portal_type}\' type from search\n- # Make sure we see the checkbox, in expanded in jenkins it gets a bit under the toolbar\n- ${element} Set Variable xpath=//input[@name=\'form.widgets.types_not_searched:list\' and @value=\'${portal_type}\']\n- Wait For Element ${element}\n- Unselect Checkbox ${element}\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ # Make sure we see the checkbox, in expanded in jenkins it gets a bit under the toolbar\n+ Check Checkbox //input[@name=\'form.widgets.types_not_searched:list\' and @value=\'${portal_type}\']\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n then searching for \'My Document\' will show a live search\n- # XXX: Not implemented yet.\n- Go to ${PLONE_URL}\n- Wait until page contains element xpath=//input[@name=\'SearchableText\']\n- Input Text name=SearchableText My\n+ Go to ${PLONE_URL}\n+ Type Text //input[@name="SearchableText"] My D\n+ Get Element States //ul[contains(@class,"livesearch-results")] contains visible\n+ Get Text //ul[contains(@class,"livesearch-results")] contains My Document\n \n searching for \'${search_term}\' will not return any results\n- Go to ${PLONE_URL}/@@search\n- Given patterns are loaded\n- Wait until page contains No results were found\n- Input Text xpath=//form[@id=\'searchform\']//input[@name=\'SearchableText\'] ${search_term}\n- Submit Form name=searchform\n- Wait until page contains items matching your search terms\n- Page Should Contain Element //span[@id=\'search-results-number\' and contains(.,\'0\')] 1\n-\n-\n+ Go to ${PLONE_URL}/@@search\n+ Get Text //body contains No results were found\n+ Type Text //form[@id=\'searchform\']//input[@name=\'SearchableText\'] ${search_term}\n+ Click //input[@type="submit" and @value="Search"]\n+ Get Text //body contains items matching your search terms\n+ Get Text //span[@id=\'search-results-number\'] should be 0\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_security.robot b/Products/CMFPlone/tests/robot/test_controlpanel_security.robot\nindex 535f96945e..f7dd470b21 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_security.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_security.robot\n@@ -1,190 +1,172 @@\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Enable self registration in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable self registration\n- Then anonymous users can register to the site\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable self registration\n+ Then anonymous users can register to the site\n \n Scenario: Enable users to select their own passwords in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable users to select their own passwords\n- Then users can select their own passwords when registering\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable users to select their own passwords\n+ Then users can select their own passwords when registering\n \n Scenario: Enable user folders in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable user folders\n- Then a user folder should be created when a user registers and logs in to the site\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable user folders\n+ Then a user folder should be created when a user registers and logs in to the site\n \n Scenario: Enable anyone to view \'about\' information in the Security Control Panel\n- Given a logged-in site administrator\n- and a published test folder\n- and the security control panel\n- When I enable anyone to view \'about\' information\n- Then anonymous users can view \'about\' information\n+ Given a logged-in site administrator\n+ and a published test folder\n+ and the security control panel\n+ When I enable anyone to view \'about\' information\n+ Then anonymous users can view \'about\' information\n \n Scenario: Enable use email as login in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable email to be used as a login name\n- Then users can use email as their login name\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable email to be used as a login name\n+ Then users can use email as their login name\n \n Scenario: Enable use uuid as uid in the Security Control Panel\n- Given a logged-in site administrator\n- and the security control panel\n- When I enable UUID to be used as a user id\n- Then UUID should be used for the user id\n-\n+ Given a logged-in site administrator\n+ and the security control panel\n+ When I enable UUID to be used as a user id\n+ Then UUID should be used for the user id\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the security control panel\n- Go to ${PLONE_URL}/@@security-controlpanel\n- Wait until page contains Security Settings\n+ Go to ${PLONE_URL}/@@security-controlpanel\n+ Get Text //body contains Security Settings\n \n a published test folder\n- Go to ${PLONE_URL}/test-folder\n- Wait For Element css=#plone-contentmenu-workflow\n- Click link xpath=//li[@id=\'plone-contentmenu-workflow\']/a\n- Wait For Element id=workflow-transition-publish\n- Click link id=workflow-transition-publish\n- Wait until page contains Item state changed\n+ Go to ${PLONE_URL}/test-folder\n+ Click //li[@id="plone-contentmenu-workflow"]/a\n+ Click //*[@id="workflow-transition-publish"]\n+ Get Text //body contains Item state changed\n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I enable self registration\n- Select Checkbox form.widgets.enable_self_reg:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable users to select their own passwords\n- Select Checkbox form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_user_pwd_choice:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_pwd_choice:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable user folders\n- Select Checkbox form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_user_pwd_choice:list\n- Select Checkbox form.widgets.enable_user_folders:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_pwd_choice:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_folders:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable anyone to view \'about\' information\n- Select Checkbox form.widgets.allow_anon_views_about:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.allow_anon_views_about:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable email to be used as a login name\n- Select Checkbox form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_user_pwd_choice:list\n- Select Checkbox form.widgets.use_email_as_login:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_pwd_choice:list"]\n+ Check Checkbox //input[@name="form.widgets.use_email_as_login:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable UUID to be used as a user id\n- Select Checkbox form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_user_pwd_choice:list\n- Select Checkbox form.widgets.use_uuid_as_userid:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Check Checkbox //input[@name="form.widgets.enable_user_pwd_choice:list"]\n+ Check Checkbox //input[@name="form.widgets.use_uuid_as_userid:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n Anonymous users can register to the site\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Element Should Be Visible xpath=//a[@id=\'personaltools-join\']\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Text //body contains Plone site\n+ Get Element States //a[@id="personaltools-join"] contains visible\n \n Users can select their own passwords when registering\n- Disable autologin\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Registration form\n- Element Should Be Visible xpath=//input[@id=\'form-widgets-password\']\n+ Disable autologin\n+ Go to ${PLONE_URL}/@@register\n+ Get Text //body contains Registration form\n+ Get Element States //input[@id="form-widgets-password"] contains visible\n \n Users can use email as their login name\n- Disable autologin\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Registration form\n- Element Should Be Visible xpath=//input[@id=\'form-widgets-email\']\n- Element Should Not Be Visible xpath=//input[@id=\'form-widgets-username\']\n+ Disable autologin\n+ Go to ${PLONE_URL}/@@register\n+ Get Text //body contains Registration form\n+ Get Element States //input[@id="form-widgets-email"] contains visible\n+ Get Element States //input[@id="form-widgets-username"] not contains visible\n \n A user folder should be created when a user registers and logs in to the site\n \n- Disable autologin\n-\n- # I register to the site\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Registration form\n- Input Text for sure form.widgets.username joe\n- Input Text for sure form.widgets.email joe@test.com\n- Input Text for sure form.widgets.password supersecret\n- Input Text for sure form.widgets.password_ctl supersecret\n- Wait For Then Click Element css=#form-buttons-register\n-\n- # I login to the site\n- Go to ${PLONE_URL}/login\n- Wait until page contains Login Name\n- Input text for sure __ac_name joe\n- Input text for sure __ac_password supersecret\n- Click Button Log in\n- Wait until page contains You are now logged in\n-\n- # The user folder should be created\n- Go to ${PLONE_URL}/Members/joe\n- Wait until element contains css=h1 joe\n- Page should Not contain This page does not seem to exist\n+ Disable autologin\n+ I register to the site\n+ I login to the site\n+ # The user folder should be created\n+ Go to ${PLONE_URL}/Members/joe\n+ Get Element Count //h1[contains(text(),\'joe doe\')] should be 1\n+ Get Text //body not contains This page does not seem to exist\n \n Anonymous users can view \'about\' information\n- Disable autologin\n- Go to ${PLONE_URL}/@@search?SearchableText=test\n- Wait until page contains Search results\n- Element Should Be Visible xpath=//span[contains(@class, \'documentAuthor\')]\n+ Disable autologin\n+ Go to ${PLONE_URL}/@@search?SearchableText=test\n+ Get Text //body contains Search results\n+ Get Element States //span[contains(@class, \'documentAuthor\')] contains visible\n \n UUID should be used for the user id\n \n- Disable autologin\n-\n- # I register to the site\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Registration form\n- Input Text for sure form.widgets.username joe\n- Input Text for sure form.widgets.email joe@test.com\n- Input Text for sure form.widgets.password supersecret\n- Input Text for sure form.widgets.password_ctl supersecret\n- Wait For Then Click Element css=#form-buttons-register\n-\n- # I login to the site\n- Go to ${PLONE_URL}/login\n- Wait until page contains Login Name\n- Input text for sure __ac_name joe\n- Input text for sure __ac_password supersecret\n- Click Button Log in\n- Wait until page contains You are now logged in\n- # XXX: Here we can\'t really test that this is a uuid, since it\'s random, so\n- # we just check that user id is not equal to username or email\n- ${userid}= Get Text xpath=//a[@id=\'personaltools-menulink\']\n- Should Not Be Equal As Strings ${userid} joe\n- Should Not Be Equal As Strings ${userid} joe@test.com\n+ Disable autologin\n+ I register to the site\n+ I login to the site\n+ # XXX: Here we can\'t really test that this is a uuid, since it\'s random, so\n+ # we just check that user id is not equal to username or email\n+ ${userid}= Get Text //a[@id=\'personaltools-menulink\']\n+ Should Not Be Equal As Strings ${userid} joe\n+ Should Not Be Equal As Strings ${userid} joe@test.com\n+\n+\n+# DRY\n+\n+I register to the site\n+ Go to ${PLONE_URL}/@@register\n+ Get Text //body contains Registration form\n+ Type Text //input[@name="form.widgets.fullname"] joe doe\n+ Type Text //input[@name="form.widgets.username"] joe\n+ Type Text //input[@name="form.widgets.email"] joe@test.com\n+ Type Text //input[@name="form.widgets.password"] supersecret\n+ Type Text //input[@name="form.widgets.password_ctl"] supersecret\n+ Click //button[@name="form.buttons.register"]\n+\n+I login to the site\n+ Go to ${PLONE_URL}/login\n+ Get Text //body contains Login Name\n+ Type Text //input[@name="__ac_name"] joe\n+ Type Text //input[@name="__ac_password"] supersecret\n+ Click //button[@name="buttons.login"]\n+ Get Text //body contains You are now logged in\n\\ No newline at end of file\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_site.robot b/Products/CMFPlone/tests/robot/test_controlpanel_site.robot\nindex 1844ac2d65..1e02aa71e0 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_site.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_site.robot\n@@ -1,125 +1,115 @@\n-Documentation\n-... $ bin/robot-server Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-... $ bin/robot test_controlpanel_site.robot\n+*** Settings ***\n \n-*** Settings *****************************************************************\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n-Variables Products/CMFPlone/tests/robot/variables.py\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Resource keywords.robot\n+Variables variables.py\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Set Site Title in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I set the site title to \'My Site\'\n- Then the site title should be set to \'My Site\'\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I set the site title to \'My Site\'\n+ Then the site title should be set to \'My Site\'\n \n Scenario: Set Site Logo in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I set a custom logo\n- Then the site logo should be set to the custom logo\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I set a custom logo\n+ Then the site logo should be set to the custom logo\n \n Scenario: Enable Dublin Core Metadata in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I enable dublin core metadata\n- Then the dublin core metadata shows up on the site\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I enable dublin core metadata\n+ Then the dublin core metadata shows up on the site\n \n Scenario: Enable Sitemap in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I enable the sitemap\n- Then then I can see a sitemap\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I enable the sitemap\n+ Then then I can see a sitemap\n \n Scenario: Add Webstats Javascript in the Site Control Panel\n- Given a logged-in site administrator\n- and the site control panel\n- When I add a Javascript snippet to the webstats javascript\n- Then the Javascript snippet shows up on the site\n+ Given a logged-in site administrator\n+ and the site control panel\n+ When I add a Javascript snippet to the webstats javascript\n+ Then the Javascript snippet shows up on the site\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n the site control panel\n- Go to ${PLONE_URL}/@@site-controlpanel\n- Wait until page contains Site Settings\n+ Go to ${PLONE_URL}/@@site-controlpanel\n+ Get Text //body contains Site Settings\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I enable the sitemap\n- Given patterns are loaded\n- Wait For Element css=#formfield-form-widgets-enable_sitemap\n- Select Checkbox form.widgets.enable_sitemap:list\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.enable_sitemap:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I set the site title to \'${site_title}\'\n- Given patterns are loaded\n- Input Text name=form.widgets.site_title ${site_title}\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Type Text //input[@name="form.widgets.site_title"] ${site_title}\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I set a custom logo\n- Given patterns are loaded\n- Choose File name=form.widgets.site_logo ${PATH_TO_TEST_FILES}/pixel.png\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Upload File By Selector //input[@name="form.widgets.site_logo"] ${PATH_TO_TEST_FILES}/pixel.png\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I enable dublin core metadata\n- Given patterns are loaded\n- Select Checkbox form.widgets.exposeDCMetaTags:list\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Check Checkbox //input[@name="form.widgets.exposeDCMetaTags:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I add a Javascript snippet to the webstats javascript\n- Given patterns are loaded\n- Input Text name=form.widgets.webstats_js \n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Type Text //textarea[@name="form.widgets.webstats_js"] \n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n the site title should be set to \'${expected_site_title}\'\n- Go To ${PLONE_URL}\n- ${actual_site_title}= Get title\n- Should be equal ${actual_site_title} ${expected_site_title}\n+ Go To ${PLONE_URL}\n+ Get Text //head/title should be ${expected_site_title}\n \n the site logo should be set to the custom logo\n- Go To ${PLONE_URL}\n- Wait Until Element Is Visible css=#portal-logo\n- Page should contain element //*[@id="portal-logo"]/img[contains(@src,\'@@site-logo/pixel.png\')]\n+ Go To ${PLONE_URL}\n+ Get Element Count //*[@id="portal-logo"]/img[contains(@src,\'@@site-logo/pixel.png\')] should be 1\n \n then I can see a sitemap\n- Go to ${PLONE_URL}/sitemap.xml.gz\n- # We need a \'Download file\' selenium2library keyword to test this:\n- # https://github.com/rtomac/robotframework-selenium2library/issues/24\n+\n+ Import library OperatingSystem\n+\n+ # this is for robotframework browser > 17\n+ Download ${PLONE_URL}/sitemap.xml.gz saveAs=/tmp/sitemap.xml.gz\n+ File Should Exist /tmp/sitemap.xml.gz\n+\n+ # this is for robotframework browser < 18.0\n+ # ${file_object}= Download ${PLONE_URL}/sitemap.xml.gz\n+ # File Should Exist ${file_object.saveAs}\n \n the dublin core metadata shows up on the site\n- Go to ${PLONE_URL}\n- Wait until page contains Powered by Plone\n- Page should contain element xpath=//html/head/meta[@name=\'DC.date.modified\']\n- Page should contain element xpath=//html/head/meta[@name=\'DC.format\']\n- Page should contain element xpath=//html/head/meta[@name=\'DC.type\']\n- Page should contain element xpath=//html/head/meta[@name=\'DC.date.created\']\n- Page should contain element xpath=//html/head/meta[@name=\'DC.language\']\n+ Go to ${PLONE_URL}\n+ Get Element Count //html/head/meta[@name="DC.date.modified"] should be 1\n+ Get Element Count //html/head/meta[@name="DC.format"] should be 1\n+ Get Element Count //html/head/meta[@name="DC.type"] should be 1\n+ Get Element Count //html/head/meta[@name="DC.date.created"] should be 1\n+ Get Element Count //html/head/meta[@name="DC.language"] should be 1\n \n the Javascript snippet shows up on the site\n- Go to ${PLONE_URL}\n- Wait until page contains Powered by Plone\n- Page should contain element id=webstats_snippet\n+ Go to ${PLONE_URL}\n+ Get Element Count //*[@id="webstats_snippet"] should be 1\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_social.robot b/Products/CMFPlone/tests/robot/test_controlpanel_social.robot\nindex 2fae936771..01239426e3 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_social.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_social.robot\n@@ -1,78 +1,69 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Social settings are provided\n- Given a logged-in site administrator\n- and the social control panel\n- When I provide social settings\n- Then social tags should exist for anonymous\n+ Given a logged-in site administrator\n+ and the social control panel\n+ When I provide social settings\n+ Then social tags should exist for anonymous\n \n Scenario: Social tags are disabled\n- Given a logged-in site administrator\n- and the social control panel\n- When I provide social settings\n- When I disable social\n- Then social tags should not exist\n-\n+ Given a logged-in site administrator\n+ and the social control panel\n+ When I provide social settings\n+ When I disable social\n+ Then social tags should not exist\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the social control panel\n- Go to ${PLONE_URL}/@@social-controlpanel\n- Wait until page contains Social Media Settings\n+ Go to ${PLONE_URL}/@@social-controlpanel\n+ Get Text //body contains Social Media Settings\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I disable social\n- UnSelect Checkbox form.widgets.share_social_data:list\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Uncheck Checkbox //input[@name="form.widgets.share_social_data:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n I provide social settings\n- Input Text name=form.widgets.twitter_username plonecms\n- Input Text name=form.widgets.facebook_app_id 123456\n- Input Text name=form.widgets.facebook_username plonecms\n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Type Text //input[@name="form.widgets.twitter_username"] plonecms\n+ Type Text //input[@name="form.widgets.facebook_app_id"] 123456\n+ Type Text //input[@name="form.widgets.facebook_username"] plonecms\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n social tags should exist for anonymous\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Page should not contain element css=meta[name="twitter:site"]\n- Page should not contain element css=meta[property="og:article:publisher"]\n- Page should not contain element css=meta[property="fb:app_id"]\n- Disable autologin\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Page should contain element css=meta[name="twitter:site"]\n- Page should contain element css=meta[property="og:article:publisher"]\n- Page should contain element css=meta[property="fb:app_id"]\n+ Go to ${PLONE_URL}\n+ Get Element Count //meta[@name="twitter:site"] should be 0\n+ Get Element Count //meta[@property="og:article:publisher"] should be 0\n+ Get Element Count //meta[@property="fb:app_id"] should be 0\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+ Get Element Count //meta[@name="twitter:site"] should be 1\n+ Get Element Count //meta[@property="og:article:publisher"] should be 1\n+ Get Element Count //meta[@property="fb:app_id"] should be 1\n \n social tags should not exist\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Page should not contain element css=meta[name="twitter:site"]\n- Page should not contain element css=meta[property="og:article:publisher"]\n- Page should not contain element css=meta[property="fb:app_id"]\n+ Go to ${PLONE_URL}\n+ Get Element Count //meta[@name="twitter:site"] should be 0\n+ Get Element Count //meta[@property="og:article:publisher"] should be 0\n+ Get Element Count //meta[@property="fb:app_id"] should be 0\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_types.robot b/Products/CMFPlone/tests/robot/test_controlpanel_types.robot\nindex 56fed5385a..4413ba0437 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_types.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_types.robot\n@@ -1,86 +1,50 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n-\n-Scenario: Allow comments for Link Type\n- Given a logged-in manager\n- and Globally enabled comments\n- and the types control panel\n- When I select \'Link\' in types dropdown\n- and Allow discussion\n- Then Wait until page contains Content Settings\n- When I add new Link \'my_link\'\n- Then Link \'my_link\' should have comments enabled\n \n+*** Test Cases ***\n Scenario: Change default workflow\n- Given a logged-in site administrator\n- and the types control panel\n- When I select \'Single State Workflow\' workflow\n- Then Wait until page contains Content Settings\n- When I add new Link \'my_link\'\n- Then Link \'my_link\' should have Single State Workflow enabled\n+ Given a logged-in site administrator\n+ and the types control panel\n+ When I select \'Single State Workflow\' workflow\n+ and I add new Link \'my_link\'\n+ Then Link \'my_link\' should have Single State Workflow enabled\n \n \n-*** Keywords *****************************************************************\n-\n-# --- GIVEN ------------------------------------------------------------------\n-\n-a logged-in manager\n- Enable autologin as Manager\n+*** Keywords ***\n \n+# GIVEN\n the types control panel\n- Go to ${PLONE_URL}/@@content-controlpanel\n- Wait until page contains Content Settings\n-\n-Globally enabled comments\n- Go to ${PLONE_URL}/@@discussion-settings\n- Wait until page contains Discussion settings\n- Select checkbox name=form.widgets.globally_enabled:list\n- Click button Save\n+ Go to ${PLONE_URL}/@@content-controlpanel\n+ Get Text //body contains Content Settings\n \n \n-\n-# --- WHEN -------------------------------------------------------------------\n-\n-I select \'${content_type}\' in types dropdown\n- Select from list by label name=type_id ${content_type}\n- Wait until page contains Globally addable\n-\n-Allow discussion\n- Select checkbox name=allow_discussion:boolean\n- Click Button Save\n-\n+# WHEN\n I select \'${workflow}\' workflow\n- Select from list by label name=new_workflow ${workflow}\n- Click Button Save\n+ Select Options By //select[@name="new_workflow"] label ${workflow}\n+ Click //button[@name="form.button.Save"]\n+ Wait For Condition Text //body contains Content Settings\n \n-I add new Link \'${id}\'\n- Go to ${PLONE_URL}\n- Wait until page contains Plone site\n- Create content type=Link id=${id} title=${id} remoteUrl=http://www.starzel.de\n \n+I add new Link \'${id}\'\n+ Go to ${PLONE_URL}\n+ Create content\n+ ... type=Link\n+ ... id=${id}\n+ ... title=${id}\n+ ... remoteUrl=https://www.plone.org\n \n-# --- THEN -------------------------------------------------------------------\n \n-Link \'${id}\' should have comments enabled\n- Go to ${PLONE_URL}/${id}\n- Wait until page contains ${id}\n- Page should contain element xpath=//div[@id="commenting"]\n+# THEN\n \n Link \'${id}\' should have Single State Workflow enabled\n- Go to ${PLONE_URL}/${id}\n- Wait until page contains ${id}\n- # We check that single state worklow is used, publish button is not present\n- Page should not contain element xpath=//a[@id="workflow-transition-publish"]\n+ Go to ${PLONE_URL}/${id}\n+ # We check that single state worklow is used, publish button is not present\n+ Get Element Count //a[@id="workflow-transition-publish"] should be 0\ndiff --git a/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot b/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot\nindex 0a4a2a9e1c..1b041b035e 100644\n--- a/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot\n+++ b/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot\n@@ -1,123 +1,103 @@\n-# ============================================================================\n-# Tests for the Plone Usergroups Control Panel\n-# ============================================================================\n-#\n-# $ bin/robot-server --reload-path src/Products.CMFPlone/Products/CMFPlone/ Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-#\n-# $ bin/robot src/Products.CMFPlone/Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot\n-#\n-# ============================================================================\n+*** Settings ***\n \n-*** Settings *****************************************************************\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Resource keywords.robot\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: Show all users in users control panel\n- Given a logged-in site administrator\n- and the users control panel\n- When I click show all users\n- Then all users should be shown\n+ Given a logged-in site administrator\n+ and the users control panel\n+ When I click show all users\n+ Then all users should be shown\n \n Scenario: Show all groups in groups control panel\n- Given a logged-in site administrator\n- and the groups control panel\n- When I click show all groups\n- Then all groups should be shown\n+ Given a logged-in site administrator\n+ and the groups control panel\n+ When I click show all groups\n+ Then all groups should be shown\n \n Scenario: Create new group\n- Given a logged-in site administrator\n- and the groups control panel\n- When I create new group\n- Then new group should show under all groups\n+ Given a logged-in site administrator\n+ and the groups control panel\n+ When I create new group\n+ and I click show all groups\n+ Then new group should show under all groups\n \n Scenario: Enable many groups and many users settings in usergroups control panel\n- Given a logged-in site administrator\n- and the user group settings control panel\n- When I enable many groups and many users settings\n- Then showing all users is disabled\n- and showing all groups is disabled\n-\n+ Given a logged-in site administrator\n+ and the user group settings control panel\n+ When I enable many groups and many users settings\n+ Then showing all users is disabled\n+ and showing all groups is disabled\n \n-*** Keywords *****************************************************************\n \n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+# GIVEN\n \n the users control panel\n- Go to ${PLONE_URL}/@@usergroup-userprefs\n- Wait until page contains User Search\n+ Go to ${PLONE_URL}/@@usergroup-userprefs\n+ Get Text //body contains User Search\n \n the groups control panel\n- Go to ${PLONE_URL}/@@usergroup-groupprefs\n- Wait until page contains Group Search\n+ Go to ${PLONE_URL}/@@usergroup-groupprefs\n+ Get Text //body contains Group Search\n \n the user group settings control panel\n- Go to ${PLONE_URL}/@@usergroup-controlpanel\n- Wait until page contains User and Groups Settings\n+ Go to ${PLONE_URL}/@@usergroup-controlpanel\n+ Get Text //body contains User and Groups Settings\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I click show all users\n- Click button Show all\n- Wait until page contains User Search\n+ Click //button[@name="form.button.FindAll"]\n+ Get Text //body contains User Search\n \n I click show all groups\n- Click button Show all\n- Wait until page contains Group Search\n+ Click //button[@name="form.button.FindAll"]\n+ Get Text //body contains Group Search\n \n I create new group\n- Click link Add New Group\n- Wait until page contains element name=addname\n- patterns are loaded\n- Input Text name=addname my-new-group\n- Input Text name=title:string My New Group\n- Input Text name=description:text This is my new group\n- Input Text name=email:string my-group@plone.org\n- Submit Form id=createGroup\n-# "Click button Save" does not work for modals. See https://stackoverflow.com/questions/17602334/element-is-not-currently-visible-and-so-may-not-be-interacted-with-but-another for details.\n- I click show all groups\n- Page should contain my-new-group\n+ Click //a[@id="add-group"]\n+ Type Text //input[@name="addname"] my-new-group\n+ Type Text //input[@name="title:string"] My New Group\n+ Type Text //textarea[@name="description:text"] This is my new group\n+ Type Text //input[@name="email:string"] my-group@plone.org\n+ Click //form[@id="createGroup"]//button[@name="form.button.Save"]\n \n I enable many groups and many users settings\n- Select Checkbox name=form.widgets.many_groups:list\n- Select Checkbox name=form.widgets.many_users:list\n- Click button Save\n- Wait until page contains Data successfully updated.\n+ Check Checkbox //input[@name="form.widgets.many_groups:list"]\n+ Check Checkbox //input[@name="form.widgets.many_users:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Data successfully updated.\n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n all users should be shown\n- Page should contain test-user\n- Page should contain admin\n+ Get Text //body contains test-user\n+ Get Text //body contains admin\n \n all groups should be shown\n- Page should contain Administrators\n- Page should contain Authenticated Users (Virtual Group) (AuthenticatedUsers)\n- Page should contain Reviewers\n- Page should contain Site Administrators\n+ Get Text //body contains Administrators\n+ Get Text //body contains Authenticated Users (Virtual Group) (AuthenticatedUsers)\n+ Get Text //body contains Reviewers\n+ Get Text //body contains Site Administrators\n \n showing all users is disabled\n- the users control panel\n- Page should not contain Show all\n+ the users control panel\n+ Get Text //body not contains Show all\n \n showing all groups is disabled\n- the users control panel\n- Page should not contain Show all\n+ the groups control panel\n+ Get Text //body not contains Show all\n \n new group should show under all groups\n- Page should contain my-new-group\n+ Get Text //body contains my-new-group\ndiff --git a/Products/CMFPlone/tests/robot/test_edit.robot b/Products/CMFPlone/tests/robot/test_edit.robot\nindex 944595e38e..0da4bb7580 100644\n--- a/Products/CMFPlone/tests/robot/test_edit.robot\n+++ b/Products/CMFPlone/tests/robot/test_edit.robot\n@@ -1,24 +1,23 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Variables ****************************************************************\n+*** Variables ***\n \n ${TITLE} An edited page\n+${LINK_TITLE} An edited link item\n ${PAGE_ID} an-edited-page\n+${LINK_ID} an-edited-link-item\n \n \n-*** Test cases ***************************************************************\n+*** Test cases ***\n \n Scenario: A page is opened to edit\n Given a logged-in site administrator\n@@ -29,7 +28,7 @@ Scenario: A page is opened to edit\n Scenario: Switch tabs\n Given a logged-in site administrator\n and an edited page\n- When i click the Categorization tab\n+ When i click the \'Categorization\' tab\n Then the Categorization tab is shown\n and no other tab is shown\n \n@@ -37,9 +36,8 @@ Scenario: Adding a related item\n # Order of the next two lines is important\n # First we\'re creating a new item and then editing the original page\n Given a logged-in site administrator\n- and at least one other item\n and an edited page\n- When i click the Categorization tab\n+ When i click the \'Categorization\' tab\n and i select a related item\n and i save the page\n Then the related item is shown in the page\n@@ -62,51 +60,78 @@ Scenario: Form dropdowns follows DateTime widget values\n and i select a date using the widget\n Then form dropdowns should not have the default values anymore\n \n+Scenario: A link item is opened to edit\n+ Given a logged-in site administrator\n+ and an edited link item\n+ Then i have the title input field\n+ and i can only see the default tab\n+\n+Scenario: Add an internal link to linked item\n+ Given a logged-in site administrator\n+ and an edited link item\n+ and i select a linked item\n+ and i save the page\n+ Then the linked item is shown in the page\n+ and Capture page screenshot and log source\n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n-# --- GIVEN ------------------------------------------------------------------\n+# GIVEN\n \n an edited page\n- Create content type=Document title=${TITLE}\n- Go to ${PLONE_URL}/${PAGE_ID}/edit\n- Wait until page contains Edit Page\n+ Create content\n+ ... type=Document\n+ ... title=${TITLE}\n+ Go to ${PLONE_URL}/${PAGE_ID}/edit\n+ Get Text //body contains Edit Page\n+\n+an edited link item\n+ Create content\n+ ... type=Link\n+ ... title=${LINK_TITLE}\n+ Go to ${PLONE_URL}/${LINK_ID}/edit\n+ Get Text //body contains Edit Link\n \n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I have the title input field\n- Element Should Be Visible xpath=//fieldset[@id=\'fieldset-default\']\n+ Get Element States //fieldset[@id=\'fieldset-default\'] contains visible\n \n I can only see the default tab\n- Wait For Condition return window.jQuery(\'.autotoc-nav .active:visible\').length > 0\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-settings\']\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-dates\']\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-categorization\']\n+ Get Element States //fieldset[@id=\'fieldset-default\'] contains visible\n+ Get Element States //fieldset[@id=\'fieldset-dates\'] not contains visible\n+ Get Element States //fieldset[@id=\'fieldset-categorization\'] not contains visible\n \n I click the ${tab} tab\n- Given patterns are loaded\n- Click link ${tab}\n+ Click //a[contains(text(),${tab})]\n \n I select a related item\n- Wait For Then Click Element jquery=.pat-relateditems-container ul.select2-choices:visible\n- Wait For Then Click Element jquery=a.pat-relateditems-result-select:first\n+ Click //div[@id="formfield-form-widgets-IRelatedItems-relatedItems"]//button[contains(text(), "Browse")]\n+ Wait For Condition Element States //div[@id="select2-drop"]//ul[@class="select2-results"] contains visible\n+ Click //a[@data-path="/test-folder" and contains(@class,"selectable")]\n+\n+I select a linked item\n+ Click //div[@id="formfield-form-widgets-remoteUrl"]//button[contains(text(), "Browse")]\n+ Wait For Condition Element States //div[@id="select2-drop"]//ul[@class="select2-results"] contains visible\n+ Click //a[@data-path="/test-folder" and contains(@class,"selectable")]\n+\n \n I save the page\n- Click Button Save\n+ Click //button[@name="form.buttons.save"]\n \n I click the calendar icon\n- Click Element xpath=//span[@id=\'edit_form_effectiveDate_0_popup\']\n- Element Should Be Visible xpath=//div[@class=\'calendar\']\n+ Click //span[@id=\'edit_form_effectiveDate_0_popup\']\n+ Get Element States //div[@class=\'calendar\'] contains visible\n \n I select a date using the widget\n- Click Element xpath=//div[@class=\'calendar\']/table/thead/tr[2]/td[4]/div\n+ Click //div[@class=\'calendar\']/table/thead/tr[2]/td[4]/div\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n popup calendar should have the same date\n- Element Text Should Be xpath=//div[@class=\'calendar\']//thead//td[@class=\'title\'] January, 2001\n+ Get Text //div[@class=\'calendar\']//thead//td[@class=\'title\'] should be January, 2001\n \n form dropdowns should not have the default values anymore\n ${yearLabel} = Get Selected List Label xpath=//select[@id=\'edit_form_effectiveDate_0_year\']\n@@ -117,21 +142,20 @@ form dropdowns should not have the default values anymore\n Should Not Be Equal ${dayLabel} --\n \n the related item is shown in the page\n- Page should contain element css=#section-related\n+ Get Element Count //*[@id="section-related"] should be 1\n+\n+the linked item is shown in the page\n+ # check if the selected testfolder is linked\n+ Get Element Count //a[@href=\'${PLONE_URL}/test-folder\'] greater than 0\n+\n \n an overlay pops up\n- Wait Until Page Contains Element xpath=//div[contains(@class, \'overlay\')]//input[@class=\'insertreference\']\n+ Get Element Count //div[contains(@class, \'overlay\')]//input[@class=\'insertreference\'] should be 1\n \n the categorization tab is shown\n- Element Should Be Visible xpath=//fieldset[@id=\'fieldset-categorization\']\n+ Get Element States //fieldset[@id=\'fieldset-categorization\'] contains visible\n \n no other tab is shown\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-dates\']\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-default\']\n- Element Should Not Be Visible xpath=//fieldset[@id=\'fieldset-settings\']\n-\n-at least one other item\n- Go to ${PLONE_URL}/++add++Document\n- Given patterns are loaded\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${TITLE}\'); return 0;\n- Click Button Save\n+ Get Element States //fieldset[@id=\'fieldset-dates\'] not contains visible\n+ Get Element States //fieldset[@id=\'fieldset-default\'] not contains visible\n+ Get Element States //fieldset[@id=\'fieldset-settings\'] not contains visible\ndiff --git a/Products/CMFPlone/tests/robot/test_edit_user_schema.robot b/Products/CMFPlone/tests/robot/test_edit_user_schema.robot\nindex 439bb5b074..60e1a0a691 100644\n--- a/Products/CMFPlone/tests/robot/test_edit_user_schema.robot\n+++ b/Products/CMFPlone/tests/robot/test_edit_user_schema.robot\n@@ -1,36 +1,23 @@\n-# ============================================================================\n-# Tests Editing the User Schema\n-# ============================================================================\n-#\n-# $ bin/robot-server --reload-path src/Products.CMFPlone/Products/CMFPlone/ Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-#\n-# $ bin/robot src/Products.CMFPlone/Products/CMFPlone/tests/robot/test_edit_user_schema.robot\n-#\n-# ============================================================================\n-\n *** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n-\n-Library Remote ${PLONE_URL}/RobotRemote\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource keywords.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n \n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: As a manager I can add a field to the registration form\n- Given a logged-in manager\n- and the mail setup configured\n- and site registration enabled\n- When I add a new text field to the member fields\n- and choose to show the field on registration\n- Then an anonymous user will see the field in the registration form\n+ Given a logged-in manager\n+ and the mail setup configured\n+ and site registration enabled\n+ When I add a new text field to the member fields\n+ and choose to show the field on registration\n+ Then an anonymous user will see the field in the registration form\n \n Scenario: As a manager I can add a field to the user form\n Given a logged-in manager\n@@ -41,12 +28,12 @@ Scenario: As a manager I can add a field to the user form\n Then a logged-in user will see the field in the user profile\n \n Scenario: As a manager I can add a required field to the user form\n- Given a logged-in manager\n- and the mail setup configured\n- and site registration enabled\n- When I add a new required text field to the member fields\n- and choose to show the field in the user profile\n- Then a logged-in user will see the required field in the user profile\n+ Given a logged-in manager\n+ and the mail setup configured\n+ and site registration enabled\n+ When I add a new required text field to the member fields\n+ and choose to show the field in the user profile\n+ Then a logged-in user will see the required field in the user profile\n \n Scenario: As a manager I can move user form fields\n Pass Execution Drag and drop in schemaeditor does not work\n@@ -69,111 +56,92 @@ Scenario: As a manager I can add a field with constraints to the registration fo\n \n \n \n-*** Keywords *****************************************************************\n-\n-# --- GIVEN ------------------------------------------------------------------\n+*** Keywords ***\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n-\n-a logged-in manager\n- Enable autologin as Manager\n+# GIVEN\n \n site registration enabled\n- Go To ${PLONE_URL}/@@security-controlpanel\n- Wait until page contains Security Settings\n- Wait until page contains element form.widgets.enable_self_reg:list\n- Select Checkbox form.widgets.enable_self_reg:list\n- Click Button Save\n- Wait until page contains Changes saved.\n-\n+ Go To ${PLONE_URL}/@@security-controlpanel\n+ Get Text //body contains Security Settings\n+ Check Checkbox //input[@name="form.widgets.enable_self_reg:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved.\n \n-# --- WHEN -------------------------------------------------------------------\n+# WHEN\n \n I add a new text field to the member fields\n- Go to ${PLONE_URL}/@@member-fields\n- Wait until page contains element css=#add-field\n- Click Link Add new field\xe2\x80\xa6\n- Wait Until Element Is visible css=#add-field-form #form-widgets-title\n- Input Text css=#add-field-form #form-widgets-title Test Field\n- Press Keys css=#add-field-form #form-widgets-title TAB\n- Select From List By Label css=#form-widgets-factory Text line (String)\n- Click button css=.pattern-modal-buttons button#form-buttons-add\n- Wait until page contains Field added successfully.\n+ Go to ${PLONE_URL}/@@member-fields\n+ Click //a[@id="add-field"]\n+ Type Text //form[@id="add-field-form"]//input[@name="form.widgets.title"] Test Field\n+ Press Keys //form[@id="add-field-form"]//input[@name="form.widgets.title"] Tab\n+ Select Options By //form[@id="add-field-form"]//select[@name="form.widgets.factory:list"] label Text line (String)\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.add"]\n+ Get Text //body contains Field added successfully.\n \n I Open the test_field Settings\n- Go to ${PLONE_URL}/@@member-fields\n- Wait For Element css=div[data-field_id=\'test_field\']\n- Wait For Then Click Element css=div[data-field_id=\'test_field\'] a.fieldSettings\n+ Go to ${PLONE_URL}/@@member-fields\n+ Click //div[@data-field_id="test_field"]//a[contains(@class,"fieldSettings")]\n \n I add a new required text field to the member fields\n- Go to ${PLONE_URL}/@@member-fields\n- Wait until page contains element css=#add-field\n- Click Link Add new field\xe2\x80\xa6\n- Wait Until Element Is visible css=#add-field-form #form-widgets-title\n- Input Text css=#add-field-form #form-widgets-title Test Field\n- Press Keys css=#add-field-form #form-widgets-title TAB\n- Select From List By Label css=#form-widgets-factory Text line (String)\n- Select Checkbox form.widgets.required:list\n- Click button css=.pattern-modal-buttons button#form-buttons-add\n- Wait until page contains Field added successfully.\n+ Go to ${PLONE_URL}/@@member-fields\n+ Click //a[@id="add-field"]\n+ Type Text //form[@id="add-field-form"]//input[@name="form.widgets.title"] Test Field\n+ Press Keys //form[@id="add-field-form"]//input[@name="form.widgets.title"] Tab\n+ Select Options By //form[@id="add-field-form"]//select[@name="form.widgets.factory:list"] label Text line (String)\n+ Check Checkbox //input[@name="form.widgets.required:list"]\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.add"]\n+ Get Text //body contains Field added successfully.\n \n choose to show the field on registration\n- I Open the test_field Settings\n- Wait Until Element Is visible form.widgets.IUserFormSelection.forms:list\n- Select Checkbox css=#form-widgets-IUserFormSelection-forms-0\n- Click button css=.pattern-modal-buttons button#form-buttons-save\n- Wait until page contains Data successfully updated.\n+ I Open the test_field Settings\n+ Check Checkbox //input[@name="form.widgets.IUserFormSelection.forms:list" and @value="On Registration"]\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.save"]\n+ Get Text //body contains Data successfully updated.\n \n choose to show the field in the user profile\n- I Open the test_field Settings\n- Wait Until Element Is visible form.widgets.IUserFormSelection.forms:list\n- Select Checkbox css=#form-widgets-IUserFormSelection-forms-1\n- Click button css=.pattern-modal-buttons button#form-buttons-save\n- Wait until page contains Data successfully updated.\n+ I Open the test_field Settings\n+ Check Checkbox //input[@name="form.widgets.IUserFormSelection.forms:list" and @value="In User Profile"]\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.save"]\n+ Get Text //body contains Data successfully updated.\n \n I move the new field to the top\n- # XXX: Drag and drop is not working!!!\n- Drag And Drop xpath=//div[@data-field_id="test_field"]//span[contains(@class, "draghandle")] xpath=//div[@data-field_id="home_page"]\n+ Drag And Drop //div[@data-field_id="test_field"]//span[contains(@class, "draghandle")] //div[@data-field_id="home_page"]\n+\n \n add a min/max constraint to the field\n- I Open the test_field Settings\n- Wait until page contains element form.widgets.min_length\n- Input Text form.widgets.min_length 4\n- Input Text form.widgets.max_length 6\n- Wait Until Element Is visible css=.pattern-modal-buttons button#form-buttons-save\n- Click Button css=.pattern-modal-buttons button#form-buttons-save\n- Sleep 1\n+ I Open the test_field Settings\n+ Type Text //input[@name="form.widgets.min_length"] 4\n+ Type Text //input[@name="form.widgets.max_length"] 6\n+ Click //div[@class="modal-footer"]//button[@name="form.buttons.save"]\n+ Get Text //body contains Data successfully updated.\n \n \n-# --- THEN -------------------------------------------------------------------\n+# THEN\n \n an anonymous user will see the field in the registration form\n- Disable Autologin\n- Go to ${PLONE_URL}/@@register\n- Wait until page contains Register\n- Page should contain element form.widgets.test_field\n+ Disable Autologin\n+ Go to ${PLONE_URL}/@@register\n+ Get Text //body contains Register\n+ Get Element Count //input[@name="form.widgets.test_field"] should be 1\n \n a logged-in user will see the field in the user profile\n- Disable Autologin\n- Enable autologin as Member\n- Go to ${PLONE_URL}/@@personal-information\n- Wait until page contains Change your personal information\n- Page should contain element form.widgets.test_field\n+ Disable Autologin\n+ a logged-in member\n+ Go to ${PLONE_URL}/@@personal-information\n+ Get Element Count //input[@name="form.widgets.test_field"] should be 1\n \n a logged-in user will see the required field in the user profile\n- a logged-in user will see the field in the user profile\n- Page Should Contain Element //div[@id=\'formfield-form-widgets-test_field\']//span[contains(@class, \'required\')] limit=1 message=test_field should be required\n+ a logged-in user will see the field in the user profile\n+ Get Element Count //div[@id=\'formfield-form-widgets-test_field\']//span[contains(@class, \'required\')] should be 1 message=test_field should be required\n \n a logged-in user will see the field on top of the user profile\n- a logged-in user will see the field in the user profile\n- Page Should Contain Element //form[@id=\'form\']/div[1]//input[@id=\'form-widgets-test_field\'] limit=1 message=test_field should be on top\n+ a logged-in user will see the field in the user profile\n+ Get Element Count //form[@id=\'form\']/div[1]//input[@id=\'form-widgets-test_field\'] should be 1 message=test_field should be on top\n \n a logged-in user will see a field with min/max constraints\n- a logged-in user will see the field in the user profile\n- Input Text form.widgets.email test@plone.org\n- Wait For Element css=#form-widgets-test_field\n- Input Text form.widgets.test_field 1\n- Wait For Then Click Element css=.formControls button#form-buttons-save\n- Wait until page contains There were some errors.\n- Page should contain Value is too short\n+ a logged-in user will see the field in the user profile\n+ Type Text //input[@name="form.widgets.email"] test@plone.org\n+ Type Text //input[@name="form.widgets.test_field"] 1\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains There were some errors.\n+ Get Text //body contains Value is too short\ndiff --git a/Products/CMFPlone/tests/robot/test_folder_contents.robot b/Products/CMFPlone/tests/robot/test_folder_contents.robot\nindex 1406b233e7..dcf33269b6 100644\n--- a/Products/CMFPlone/tests/robot/test_folder_contents.robot\n+++ b/Products/CMFPlone/tests/robot/test_folder_contents.robot\n@@ -1,18 +1,15 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test cases ***************************************************************\n+*** Test cases ***\n \n \n Scenario: Select All items\n@@ -21,14 +18,8 @@ Scenario: Select All items\n and the folder contents view\n When I select all the elements\n Then the selection count appears\n- and the four elements got selected\n and the clear selection link appears\n \n-Scenario: Clear selection\n- Given a logged-in site administrator\n- and a folder with four pages\n- and the folder contents view\n- And I select all the elements\n When I clear the selection\n Then no elements should be selected\n \n@@ -36,77 +27,88 @@ Scenario: Reorder Folder Contents\n Given a logged-in site administrator\n and a folder with four pages\n and the folder contents view\n- Then The Order Should Be 1 2 3 4\n+ Then The Order Should Be 1 2 3 4\n When I reorder the elements\n- Then The Order Should Be 4 3 2 1\n+ Then The Order Should Be 4 3 2 1\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n \n a folder with four pages\n- ${folder_uid}= Create content type=Folder title=My Folder\n- Create content type=Document title=Doc1 container=${folder_uid}\n- Create content type=Document title=Doc2 container=${folder_uid}\n- Create content type=Document title=Doc3 container=${folder_uid}\n- Create content type=Document title=Doc4 container=${folder_uid}\n+ ${folder_uid}= Create content\n+ ... type=Folder\n+ ... title=My Folder\n+ Create content\n+ ... type=Document\n+ ... title=Doc1\n+ ... container=${folder_uid}\n+ Create content\n+ ... type=Document\n+ ... title=Doc2\n+ ... container=${folder_uid}\n+ Create content\n+ ... type=Document\n+ ... title=Doc3\n+ ... container=${folder_uid}\n+ Create content\n+ ... type=Document\n+ ... title=Doc4\n+ ... container=${folder_uid}\n \n the folder contents view\n- Go to ${PLONE_URL}/my-folder/folder_contents\n- Given folder contents pattern loaded\n+ Go to ${PLONE_URL}/my-folder/folder_contents\n \n I click the \'${link_name}\' link\n- Click Link ${link_name}\n+ Click //a[contains(text(),${link_name})]\n \n I select all the elements\n- Wait until page contains element css=.pat-structure .select-all\n- Sleep 1s\n- ${select_all_selector} Set Variable .pat-structure .select-all\n- Wait Until Element Is Visible css=${select_all_selector}\n- Click Element css=${select_all_selector}\n-\n-the four elements got selected\n- Checkbox Should Be Selected css=tr[data-id="doc1"] input\n- Checkbox Should Be Selected css=tr[data-id="doc2"] input\n- Checkbox Should Be Selected css=tr[data-id="doc3"] input\n- Checkbox Should Be Selected css=tr[data-id="doc4"] input\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Check Checkbox //tr[@data-id="doc1"]//input[@type="checkbox"]\n+ Wait For Elements State //tr[@data-id="doc1"]//input[@type="checkbox"] checked timeout=10s\n+ Check Checkbox //tr[@data-id="doc2"]//input[@type="checkbox"]\n+ Wait For Elements State //tr[@data-id="doc2"]//input[@type="checkbox"] checked timeout=10s\n+ Check Checkbox //tr[@data-id="doc3"]//input[@type="checkbox"]\n+ Wait For Elements State //tr[@data-id="doc3"]//input[@type="checkbox"] checked timeout=10s\n+ Check Checkbox //tr[@data-id="doc4"]//input[@type="checkbox"]\n+ Wait For Elements State //tr[@data-id="doc4"]//input[@type="checkbox"] checked timeout=10s\n \n the selection count appears\n- Wait until page contains element css=#btn-selected-items .label-success\n- Element Should Contain css=#btn-selected-items .label-success 4\n+ Get Text //*[@id="btn-selected-items"]//*[contains(@class,"label-success")] should be 4\n \n the clear selection link appears\n- Page Should Contain Element css=a.remove-all\n+ Get Element Count //a[contains(@class,"remove-all")] greater than 0\n \n I clear the selection\n- Click link id=btn-selected-items\n- Click link css=a.remove-all\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Sleep 2s\n+ Check Checkbox //*[contains(@class,"pat-structure")]//input[contains(@class,"select-all")]\n+ Click //a[@id="btn-selected-items"]\n+ Click //a[contains(@class,"remove-all")]\n+\n \n no elements should be selected\n- Checkbox Should Not Be Selected css=tr[data-id="doc1"] input\n- Checkbox Should Not Be Selected css=tr[data-id="doc2"] input\n- Checkbox Should Not Be Selected css=tr[data-id="doc3"] input\n- Checkbox Should Not Be Selected css=tr[data-id="doc4"] input\n+ Get Checkbox State //tr[@data-id="doc1"]//input == unchecked\n+ Get Checkbox State //tr[@data-id="doc2"]//input == unchecked\n+ Get Checkbox State //tr[@data-id="doc3"]//input == unchecked\n+ Get Checkbox State //tr[@data-id="doc4"]//input == unchecked\n \n I reorder the elements\n- Click link css=#btn-structure-rearrange\n- Click element name=reversed\n- Click button css=#popover-structure-rearrange .btn-primary\n- Wait until page contains Successfully rearranged folder\n+ Click //a[@id="btn-structure-rearrange"]\n+ Check Checkbox //*[@id="popover-structure-rearrange"]//input[@name="reversed"]\n+ Click //*[@id="popover-structure-rearrange"]//button[contains(text(),"Rearrange")]\n+ Wait For Condition Text //body contains Successfully rearranged folder\n \n The Order Should Be\n- [Arguments] ${first} ${second} ${third} ${fourth}\n- Wait Until Element Is Visible css=#doc${first}\n- Wait Until Element Is Visible css=#doc${second}\n- Wait Until Element Is Visible css=#doc${third}\n- Wait Until Element Is Visible css=#doc${fourth}\n- Should be above css=tr[data-id="doc${first}"] css=tr[data-id="doc${second}"]\n- Should be above css=tr[data-id="doc${second}"] css=tr[data-id="doc${third}"]\n- Should be above css=tr[data-id="doc${third}"] css=tr[data-id="doc${fourth}"]\n+ [Arguments] ${first} ${second} ${third} ${fourth}\n+ Should be above //tr[@data-id="doc${first}"] //tr[@data-id="doc${second}"]\n+ Should be above //tr[@data-id="doc${second}"] //tr[@data-id="doc${third}"]\n+ Should be above //tr[@data-id="doc${third}"] //tr[@data-id="doc${fourth}"]\n \n Should be above\n- [Arguments] ${locator1} ${locator2}\n+ [Arguments] ${locator1} ${locator2}\n+\n+ ${locator1-position}= Get BoundingBox ${locator1} y\n+ ${locator2-position}= Get BoundingBox ${locator2} y\n \n- ${locator1-position} = Get vertical position ${locator1}\n- ${locator2-position} = Get vertical position ${locator2}\n- Should be true ${locator1-position} < ${locator2-position}\n+ Should be true ${locator1-position} < ${locator2-position}\ndiff --git a/Products/CMFPlone/tests/robot/test_linkintegrity.robot b/Products/CMFPlone/tests/robot/test_linkintegrity.robot\nindex b0c6fa4dbb..a0e61e0265 100644\n--- a/Products/CMFPlone/tests/robot/test_linkintegrity.robot\n+++ b/Products/CMFPlone/tests/robot/test_linkintegrity.robot\n@@ -1,144 +1,133 @@\n-# ============================================================================\n-# Tests for the Plone Link Integrity Support\n-# ============================================================================\n-#\n-# $ bin/robot-server --reload-path src/Products.CMFPlone/Products/CMFPlone/ Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING\n-#\n-# $ bin/robot src/Products.CMFPlone/Products/CMFPlone/tests/robot/test_linkintegrity.robot\n-#\n-# ============================================================================\n+*** Settings ***\n \n-*** Settings *****************************************************************\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Resource keywords.robot\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n-\n-\n-*** Test Cases ***************************************************************\n+*** Test Cases ***\n \n Scenario: When page is linked show warning\n Given a logged-in site administrator\n and a page to link to\n and a page to edit\n- and a link in rich text\n- should show warning when deleting page\n-\n+ When I add a link in rich text\n+ Then I should see a warning when deleting page\n \n Scenario: After you fix linked page no longer show warning\n Given a logged-in site administrator\n- a page to link to\n+ and a page to link to\n and a page to edit\n- and a link in rich text\n- should show warning when deleting page\n- remove link to page\n- should not show warning when deleting page\n+ When I add a link in rich text\n+ Then I should see a warning when deleting page\n \n+ When I remove link to page\n+ Then I should not see a warning when deleting page\n \n Scenario: Show warning when deleting linked item from folder_contents\n- Given a logged-in site administrator\n- a page to link to\n- and a page to edit\n- and a link in rich text\n- should show warning when deleting page from folder_contents\n- remove link to page\n- should not show warning when deleting page from folder_contents\n-\n-\n-*** Keywords *****************************************************************\n+ Given a logged-in site administrator\n+ and a page to link to\n+ and a page to edit\n+ When I add a link in rich text\n+ Then I should see a warning when deleting page from folder_contents\n \n-# --- GIVEN ------------------------------------------------------------------\n+ When I remove link to page\n+ Then I should not see a warning when deleting page from folder_contents\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n+*** Keywords ***\n \n+# GIVEN\n \n a page to link to\n- Create content type=Document id=foo title=Foo\n+ Create content\n+ ... type=Document\n+ ... id=foo\n+ ... title=Foo\n \n a page to edit\n- Create content type=Document id=bar title=Bar\n-\n-\n-a link in rich text\n- Go To ${PLONE_URL}/bar/edit\n- Wait until element is visible css=.tox-edit-area iframe\n- Select Frame css=.tox-edit-area iframe\n- Input text css=.mce-content-body foo\n- Execute Javascript function selectElementContents(el) {var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range);} var el = document.getElementById("tinymce"); selectElementContents(el);\n- UnSelect Frame\n- Click Button css=button[aria-label="Insert/edit link"]\n-\n- Given patterns are loaded\n- Wait until element is visible css=.pat-relateditems .select2-input.select2-default\n- Click Element css=.pat-relateditems .select2-input.select2-default\n- Wait until element is visible css=.pat-relateditems-result.one-level-up a.pat-relateditems-result-browse\n- Click Element css=.pat-relateditems-result.one-level-up a.pat-relateditems-result-browse\n- Wait until element is visible xpath=(//span[contains(., \'Foo\')])\n- Sleep 2s\n- Click Element xpath=(//span[contains(., \'Foo\')])\n- Wait until element is visible css=.pat-relateditems-item-title\n- Wait For Then Click Element css=.modal-footer .btn-primary\n- Wait For Then Click Element css=#form-buttons-save\n-\n-\n-should show warning when deleting page\n-\n- Go To ${PLONE_URL}/foo\n- Wait For Then Click Element css=#plone-contentmenu-actions > a\n- Wait For Then Click Element css=#plone-contentmenu-actions-delete\n- Wait until page contains element css=.breach-container .breach-item\n-\n-\n-should show warning when deleting page from folder_contents\n- Go To ${PLONE_URL}/folder_contents\n- Given folder contents pattern loaded\n- Wait For Then Click Element css=tr[data-id="foo"] input\n- Checkbox Should Be Selected css=tr[data-id="foo"] input\n- Wait until keyword succeeds 30 1 Page should not contain element css=#btn-delete.disabled\n-\n- Wait For Then Click Element css=#btngroup-mainbuttons #btn-delete\n- Wait until page contains element css=.popover-content .btn-danger\n- Page should contain element css=.breach-container .breach-item\n- Wait For Then Click Element css=#popover-delete .closeBtn\n- Checkbox Should Be Selected css=tr[data-id="foo"] input\n-\n-\n-should not show warning when deleting page from folder_contents\n- Go To ${PLONE_URL}/folder_contents\n- Given folder contents pattern loaded\n- Wait For Then Click Element css=tr[data-id="foo"] input\n- Checkbox Should Be Selected css=tr[data-id="foo"] input\n- Wait until keyword succeeds 30 1 Page should not contain element css=#btn-delete.disabled\n- Wait For Then Click Element css=#btngroup-mainbuttons #btn-delete\n- Wait until page contains element css=.popover-content .btn-danger\n- Page should not contain element css=.breach-container .breach-item\n- Wait For Then Click Element css=#popover-delete .applyBtn\n- Wait until page contains Successfully delete items\n- Wait until keyword succeeds 30 1 Page should not contain Element css=tr[data-id="foo"] input\n-\n-\n-should not show warning when deleting page\n- Go To ${PLONE_URL}/foo\n- Wait For Then Click Element css=#plone-contentmenu-actions > a\n- Wait For Then Click Element css=#plone-contentmenu-actions-delete\n- Page should not contain element css=.breach-container .breach-item\n-\n-\n-remove link to page\n- Go To ${PLONE_URL}/bar\n- Wait For Then Click Element css=#contentview-edit a\n- Wait For Element css=.tox-edit-area iframe\n- Select Frame css=.tox-edit-area iframe\n- Input text css=.mce-content-body foo\n- Execute Javascript function selectElementContents(el) {var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range);} var el = document.getElementById("tinymce"); selectElementContents(el);\n- UnSelect Frame\n- Click Button css=button[aria-label="Remove link"]\n- Wait For Then Click Element css=#form-buttons-save\n+ Create content\n+ ... type=Document\n+ ... id=bar\n+ ... title=Bar\n+\n+# When\n+I add a link in rich text\n+ Go To ${PLONE_URL}/bar/edit\n+ Fill text to tinymce editor foo\n+ Mark text foo in tinymce editor\n+ Click //button[@aria-label="Insert/edit link"]\n+ Wait For Condition Element States //div[@class="modal-content"] contains visible\n+ Click //div[@class="modal-body"]//fieldset[@data-linktype="internal"]//button[contains(@class,"mode") and contains(@class,"browse")]\n+ Click //a[@title="Go one level up"]\n+ Click //a[contains(@class,"selectable") and @data-path="/foo"]\n+ Click //div[contains(@class,"modal-footer")]//input[@name="insert"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n+I remove link to page\n+ Go To ${PLONE_URL}/bar\n+ Click //*[@id="contentview-edit"]//a\n+ Fill text to tinymce editor foo\n+ Mark text foo in tinymce editor\n+ Click //button[@aria-label="Remove link"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\n+\n+# Then\n+\n+I should see a warning when deleting page\n+ Go To ${PLONE_URL}/foo\n+ Click //*[@id="plone-contentmenu-actions"]/a\n+ Click //*[@id="plone-contentmenu-actions-delete"]\n+ Get Element Count //*[contains(@class,"breach-container")]//*[contains(@class,"breach-item")] greater than 0\n+\n+I should not see a warning when deleting page\n+ Go To ${PLONE_URL}/foo\n+ Click //*[@id="plone-contentmenu-actions"]/a\n+ Click //*[@id="plone-contentmenu-actions-delete"]\n+ Get Element Count //*[contains(@class,"breach-container")]//*[contains(@class,"breach-item")] should be 0\n+\n+\n+I should see a warning when deleting page from folder_contents\n+ Go To ${PLONE_URL}/folder_contents\n+ Check Checkbox //tr[@data-id="foo"]//input\n+ Get Checkbox State //tr[@data-id="foo"]//input == checked\n+ Get Element Count //*[@id="btngroup-mainbuttons"]//a[@id="btn-delete" and contains(@class,"disabled")] should be 0\n+ Click //*[@id="btngroup-mainbuttons"]//a[@id="btn-delete"]\n+ Get Element Count //*[contains(@class,"breach-container")]//*[contains(@class,"breach-item")] greater than 0\n+ Get Checkbox State //tr[@data-id="foo"]//input == checked\n+\n+\n+I should not see a warning when deleting page from folder_contents\n+ Go To ${PLONE_URL}/folder_contents\n+ Check Checkbox //tr[@data-id="foo"]//input\n+ Get Checkbox State //tr[@data-id="foo"]//input == checked\n+ Get Element Count //*[@id="btngroup-mainbuttons"]//a[@id="btn-delete" and contains(@class,"disabled")] should be 0\n+ Click //*[@id="btngroup-mainbuttons"]//a[@id="btn-delete"]\n+ Get Element States //*[@id="popover-delete"]//*[contains(@class,"popover-content")] contains visible\n+ Get Element Count //*[contains(@class,"breach-container")]//*[contains(@class,"breach-item")] should be 0\n+ Click //*[contains(@class,"popover-content")]//button[contains(@class,"applyBtn")]\n+ Get Text //body contains Successfully delete items\n+ Get Element Count //tr[@data-id="foo"]//input should be 0\n+\n+# DRY\n+\n+Mark text foo in tinymce editor\n+\n+ # select the text `heading` via javascript\n+ Evaluate JavaScript ${None}\n+ ... () => {\n+ ... let iframe_document = document.querySelector(".tox-edit-area iframe").contentDocument;\n+ ... let body = iframe_document.body;\n+ ... let p = body.firstChild;\n+ ... let range = new Range();\n+ ... range.setStart(p.firstChild, 0);\n+ ... range.setEnd(p.firstChild, 3);\n+ ... iframe_document.getSelection().removeAllRanges();\n+ ... iframe_document.getSelection().addRange(range);\n+ ... }\n+ ... all_elements=False\ndiff --git a/Products/CMFPlone/tests/robot/test_livesearch.robot b/Products/CMFPlone/tests/robot/test_livesearch.robot\nindex 8bed725311..a8a2c33ee5 100644\n--- a/Products/CMFPlone/tests/robot/test_livesearch.robot\n+++ b/Products/CMFPlone/tests/robot/test_livesearch.robot\n@@ -1,84 +1,82 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Variables Products/CMFPlone/tests/robot/variables.py\n+Variables variables.py\n \n-Resource keywords.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n \n-\n-*** Test cases ***************************************************************\n+*** Test cases ***\n \n \n Scenario: Simple Livesearch\n Given a logged-in site administrator\n- and a document Welcome to Plone\n- When I search for Welcome\n- Then the livesearch results should contain Welcome to Plone\n- and expected livesearch results 1\n+ and a document Welcome to Plone\n+ When I search for Welcome\n+ Then the livesearch results should contain Welcome to Plone\n+ and expected livesearch results 1\n \n Scenario: Livesearch with image results\n Given a logged-in site administrator\n- and a news item My News with Image\n- When I search for My News\n- Then the livesearch results should contain My News with Image\n- and expected livesearch results 1\n- and Page should contain image css=.livesearch-results li.search-result .col.img img\n+ and a news item My News with Image\n+ When I search for My News\n+ Then the livesearch results should contain My News with Image\n+ and expected livesearch results 1\n+ and Get Element Count //*[contains(@class,"livesearch-results")]//li[contains(@class,"search-result")]//*[contains(@class,"col") and contains(@class,"img")]//img greater than 0\n \n When I disable images in results in search controlpanel\n and I search for My News\n- Then Page should not contain image css=.livesearch-results li.search-result .col.img img\n+ and Get Element Count //*[contains(@class,"livesearch-results")]//li[contains(@class,"search-result")]//*[contains(@class,"col") and contains(@class,"img")]//img should be 0\n \n \n-*** Keywords *****************************************************************\n+*** Keywords ***\n \n a document\n- [Arguments] ${title}\n- Create content type=Document id=doc title=${title}\n+ [Arguments] ${title}\n+ Create content\n+ ... type=Document\n+ ... id=doc\n+ ... title=${title}\n \n a news item\n- [Arguments] ${title}\n- Go to ${PLONE_URL}/++add++News Item\n- Wait until page contains Add News Item\n- Input text name=form.widgets.IDublinCore.title ${title}\n- Choose File name=form.widgets.ILeadImageBehavior.image ${PATH_TO_TEST_FILES}/plone-logo.png\n- Click Button Save\n- Wait until page contains Item created error=Image could not be created.\n+ [Arguments] ${title}\n+ Go to ${PLONE_URL}/++add++News Item\n+ Type text //input[@name="form.widgets.IDublinCore.title"] ${title}\n+ Upload File By Selector //input[@name="form.widgets.ILeadImageBehavior.image"] ${PATH_TO_TEST_FILES}/pixel.png\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Item created message=Image could not be created.\n \n I search for\n- [Arguments] ${searchtext}\n- Input text css=input#searchGadget ${searchtext}\n- Wait For Element css=input#searchGadget\n+ [Arguments] ${searchtext}\n+ Type Text //input[@id="searchGadget"] ${searchtext}\n \n I search the currentfolder only for\n- [Arguments] ${searchtext}\n- Select checkbox id=searchbox_currentfolder_only\n- Input text css=input#searchGadget ${searchtext}\n- Wait For Element css=input#searchGadget\n+ [Arguments] ${searchtext}\n+ Check Checkbox //*[@id="searchbox_currentfolder_only"]\n+ Type Text //input[@id="searchGadget"] ${searchtext}\n \n the livesearch results should contain\n- [Arguments] ${text}\n- Wait until keyword succeeds 5s 1s Element should contain css=.livesearch-results li a .heading ${text}\n+ [Arguments] ${text}\n+ Get Element States //ul[contains(@class,"livesearch-results")] contains visible\n+ Get Text //ul[contains(@class,"livesearch-results")] contains ${text}\n \n the livesearch results should not contain\n- [Arguments] ${text}\n- Wait until keyword succeeds 5s 1s Page should not contain css=.livesearch-results li a .heading ${text}\n+ [Arguments] ${text}\n+ Get Element States //ul[contains(@class,"livesearch-results")] contains visible\n+ Get Text //ul[contains(@class,"livesearch-results")] not contains ${text}\n \n expected livesearch results\n- [Arguments] ${num}\n- ${count} = Get Element Count css=.livesearch-results li.search-result\n- Should Be Equal as Numbers ${count} ${num}\n+ [Arguments] ${num}\n+ Get Element Count //*[contains(@class,"livesearch-results")]//li[contains(@class,"search-result")] should be ${num}\n+\n \n I disable images in results in search controlpanel\n- Go to ${PLONE_URL}/@@search-controlpanel\n- Wait until page contains Search Settings\n- Unselect Checkbox form.widgets.search_show_images:list\n- Click Button Save\n- Wait until page contains Changes saved\n+ Go to ${PLONE_URL}/@@search-controlpanel\n+ Uncheck Checkbox //input[@name="form.widgets.search_show_images:list"]\n+ Click //button[@name="form.buttons.save"]\n+ Get Text //body contains Changes saved\ndiff --git a/Products/CMFPlone/tests/robot/test_overlays.robot b/Products/CMFPlone/tests/robot/test_overlays.robot\nindex b8fca6d3d9..d35f27ea41 100644\n--- a/Products/CMFPlone/tests/robot/test_overlays.robot\n+++ b/Products/CMFPlone/tests/robot/test_overlays.robot\n@@ -1,22 +1,18 @@\n *** Settings ***\n \n-Documentation These tests are just testing the overlay behavior not the\n-... functionality of each form. This is supposed to be tested in\n-... functional tests somewhere. At some point in the future the\n-... functional tests can be transferred to robot tests into each\n-... scenario test case.\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Variables variables.py\n \n-Resource common.robot\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-Test Setup Run Keywords Plone test setup\n-Test Teardown Run keywords Plone test teardown\n+*** Variables ***\n \n+${TEST_FOLDER} test-folder\n \n *** Test cases ***\n \n@@ -25,78 +21,65 @@ Scenario: Contact form overlay opens\n When I click the \'Contact\' link\n Then overlay should open\n \n+\n Scenario: Contact form overlay closes\n- Go to ${PLONE_URL}/logout\n- Given the \'Contact\' overlay\n+ Given the site root logged out\n+ and the \'Contact\' overlay\n When I close the overlay\n Then overlay should close\n \n Scenario: Log in form overlay opens\n- Go to ${PLONE_URL}/logout\n- Given the site root\n+ Given the site root logged out\n+ and the site root\n When I click the \'Log in\' link\n Then overlay should open\n \n Scenario: Log in form overlay closes\n- Go to ${PLONE_URL}/logout\n- Given the site root\n- Given the \'Log in\' overlay\n+ Given the site root logged out\n+ and the site root\n+ and the \'Log in\' overlay\n When I close the overlay\n Then overlay should close\n \n Scenario: Log in form overlay remains on wrong credentials\n- Go to ${PLONE_URL}/logout\n- Given the site root\n- Given the \'Log in\' overlay\n+ Given the site root logged out\n+ and the site root\n+ and the \'Log in\' overlay\n When I enter wrong credentials\n Then overlay should remain open\n- And login overlay shows an error\n+ and login overlay shows an error\n \n Scenario: Log in form overlay closes on valid credentials\n- Go to ${PLONE_URL}/logout\n- Given the site root\n- Given the \'Log in\' overlay\n+ Given the site root logged out\n+ and the site root\n+ and the \'Log in\' overlay\n When I enter valid credentials\n Then overlay should close\n \n Scenario: Set default content item of a folder overlay opens\n Given a logged-in site administrator\n- And a document \'doc\' in the test folder\n+ and a document \'doc\' in the test folder\n When I set the default content view of the test folder\n Then overlay should open\n \n-# XXX Next 2 tests are commented out. After hours of messing around,\n-# I still can not pinpoint why this is happening.\n-# The error originates from this change https://github.com/plone/mockup/commit/ccec87028bc22e082d6d9a95874d8a961f91b707\n-# which provides at least some error reporting(window.alert) to users when modals\n-# experience issues. We need this change in modals...\n-#\n-# However, in these 2 cases, it is triggering the window.alert\n-# and causing the tests to fail in certain cases.\n-# It ONLY happens when running automatically by the robot framework\n-# runner. If you try to use Import library DebugLibrary and\n-# run the commands manually, of course it works fine. So yes,\n-# there is no way to really figure out this AFAIK.\n-# Also, of course, this doesn\'t happen in real user testing.\n-#\n-#Scenario: Change default content item of a folder overlay opens\n-# Given a logged-in site administrator\n-# And a document as the default view of the test folder\n-# When I change the default content view of the test folder\n-# Then overlay should open\n-\n-#Scenario: Change default content item of a folder overlay closes\n-# Given a logged-in site administrator\n-# And a document as the default view of the test folder\n-# When I change the default content view of the test folder\n-# And I \'Cancel\' the form\n-# Then overlay should close\n-# When I change the default content view of the test folder\n-# And I \'Save\' the form\n-# Then overlay should close\n-# When I change the default content view of the test folder\n-# And I close the overlay\n-# Then overlay should close\n+Scenario: Change default content item of a folder overlay opens\n+ Given a logged-in site administrator\n+ and a document as the default view of the test folder\n+ When I change the default content view of the test folder\n+ Then overlay should open\n+\n+Scenario: Change default content item of a folder overlay closes\n+ Given a logged-in site administrator\n+ And a document as the default view of the test folder\n+ When I change the default content view of the test folder\n+ And I \'Cancel\' the form\n+ Then overlay should close\n+ When I change the default content view of the test folder\n+ And I \'Save\' the form\n+ Then overlay should close\n+ When I change the default content view of the test folder\n+ And I close the overlay\n+ Then overlay should close\n \n Scenario: Delete content action overlay opens\n Given a logged-in site administrator\n@@ -132,7 +115,7 @@ Scenario: Rename content action overlay closes\n Scenario: Register user overlay opens\n Given the mail setup configured\n And the self registration enabled\n- Go to ${PLONE_URL}/logout\n+ and the site root logged out\n And the site root\n When I click the \'Register\' link\n Then overlay should open\n@@ -140,7 +123,7 @@ Scenario: Register user overlay opens\n Scenario: Register user overlay closes\n Given the mail setup configured\n And the self registration enabled\n- Go to ${PLONE_URL}/logout\n+ and the site root logged out\n And the site root\n And the \'Register\' overlay\n When I close the overlay\n@@ -149,24 +132,22 @@ Scenario: Register user overlay closes\n Scenario: Register user overlay remains on wrong data\n Given the mail setup configured\n And the self registration enabled\n- Go to ${PLONE_URL}/logout\n+ and the site root logged out\n And the site root\n And the \'Register\' overlay\n When I send the register form\n Then overlay should remain open\n And overlay shows an error\n \n-# Note: For this one we need to fake the mail server, as it tries to send the\n-# mail right away. Or change the somehow confusing message that shows when this\n-# happens.\n-#Scenario: Register user overlay closes on valid data\n-# Given the mail setup configured\n-# And the self registration enabled\n-# And the site root\n-# And the \'Register\' overlay\n-# When I enter valid register user data\n-# And I send the register form\n-# Then overlay should close\n+# Tests based on MockupMailServer, this should be a valid tests\n+Scenario: Register user overlay closes on valid data\n+ Given the mail setup configured\n+ And the self registration enabled\n+ And the site root\n+ And the \'Register\' overlay\n+ When I enter valid register user data\n+ And I send the register form\n+ Then overlay should close\n \n Scenario: New user overlay opens\n Given a logged-in site administrator\n@@ -190,144 +171,137 @@ Scenario: New user overlay closes on valid data\n And I send the register form\n Then overlay should close\n \n-# There is no more history overlay\n-# Scenario: History overlay opens\n-# Given a logged-in site administrator\n-# And the test folder\n-# When I click the \'Content Info\' link\n-# And I click the \'History\' link\n-# Then overlay should open\n-#\n-# Scenario: History overlay closes\n-# Given a logged-in site administrator\n-# And the test folder\n-# When I click the \'Content Info\' link\n-# And I click the \'History\' link\n-# When I close the overlay\n-# Then overlay should close\n-#\n+\n *** Keywords ***\n \n-Background\n- Given a logged-in site administrator\n- and a test folder\n- Disable autologin\n- Go to homepage\n+# GIVEN\n+the site root logged out\n+ Go to ${PLONE_URL}/logout\n+\n+the site root\n+ Go to ${PLONE_URL}\n+\n+\n+the \'${link_name}\' overlay\n+ Click //a[descendant-or-self::*[contains(text(), "${link_name}")]]\n+ Get Element Count //div[contains(@class,"modal-dialog")] greater than 0\n+\n+\n+a document \'${title}\' in the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Document\n+ Type Text //input[@id="form-widgets-IDublinCore-title"] ${title}\n+ Click //button[@name="form.buttons.save"]\n+\n+\n+a document as the default view of the test folder\n+ a document \'doc\' in the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}\n+ Click //li[@id=\'plone-contentmenu-display\']/a\n+ Click //a[@id="contextSetDefaultPage"]\n+ Click //input[@id="doc"]\n+ Click //div[contains(@class,"modal-footer")]//button[@name="form.buttons.Save"]\n+ Wait For Condition Text //body//h1 contains doc\n \n-a logged-in site administrator\n- Enable autologin as Site Administrator\n \n the users and groups configlet\n- Go to ${PLONE_URL}/@@usergroup-userprefs\n- Wait until page contains User Search\n+ Go to ${PLONE_URL}/@@usergroup-userprefs\n+ Get Text //body contains User Search\n+\n+# WHEN\n \n I click the \'${link_name}\' link\n- Wait until page contains ${link_name}\n- Element should be visible xpath=//a[descendant-or-self::*[contains(text(), \'${link_name}\')]]\n- Click Link xpath=//a[descendant-or-self::*[contains(text(), \'${link_name}\')]]\n+ Get Element Count //a[descendant-or-self::*[contains(text(), "${link_name}")]] greater than 0\n+ Click //a[descendant-or-self::*[contains(text(), "${link_name}")]]\n \n-the \'${link_name}\' overlay\n- Wait until page contains ${link_name}\n- Click Link xpath=//a[descendant-or-self::*[contains(text(), \'${link_name}\')]]\n- Wait until keyword succeeds 30 1 Page should contain element css=div.modal-dialog\n \n-overlay should open\n- Wait until keyword succeeds 30 1 Element Should Be Visible css=div.modal-dialog\n+I close the overlay\n+ Click //div[contains(@class,"modal-header")]//button[contains(@class,"modal-close")]\n \n-overlay should remain open\n- Wait until page contains element css=div.modal-wrapper\n- Wait until element is visible css=div.modal-wrapper\n \n-I close the overlay\n- Click Element css=div.modal-header button.modal-close\n+I enter wrong credentials\n+ I enter credentials wrong user\n \n-overlay should close\n- Wait until keyword succeeds 40 1 Page should not contain element css=div.modal-dialog\n \n-login overlay shows an error\n- Wait Until Page Contains Error\n+I enter valid credentials\n+ I enter credentials ${SITE_OWNER_NAME} ${SITE_OWNER_PASSWORD}\n \n-overlay shows an error\n- Wait Until Page Contains There were errors\n \n-overlay requires to compile a field\n- Wait Until Page Contains Required input is missing\n+I set the default content view of the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}\n+ Click //li[@id=\'plone-contentmenu-display\']/a\n+ Click //a[@id="contextSetDefaultPage"]\n+\n+\n+I change the default content view of the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}\n+ Click //li[@id=\'plone-contentmenu-display\']/a\n+ Click //a[@id="folderChangeDefaultPage"]\n+\n \n I \'${action}\' the form\n- Wait until keyword succeeds 30 1 Element Should Be Visible css=div.modal-footer button[name="form.buttons.${action}"]\n- Click Element css=div.modal-footer button[name="form.buttons.${action}"]\n+ Click //div[contains(@class,"modal-footer")]//button[@name="form.buttons.${action}"]\n \n-I enter wrong credentials\n- Input text __ac_name wrong\n- Input text __ac_password user\n- Wait For Then Click Element css=div.modal-footer button\n \n-I enter valid credentials\n- Wait until page contains element name=__ac_name\n- Input text for sure __ac_name ${SITE_OWNER_NAME}\n- Input text for sure __ac_password ${SITE_OWNER_PASSWORD}\n- Wait For Then Click Element css=div.modal-footer button\n+I trigger the \'${action}\' action menu item of the test folder\n+ Go to ${PLONE_URL}/${TEST_FOLDER}\n+ Click //li[@id="plone-contentmenu-actions"]/a\n+ Click //a[@id="plone-contentmenu-actions-${action}"]\n \n-I enter valid user data\n- Wait until page contains element name=form.widgets.password_ctl\n- Input text for sure form.widgets.username myuser\n- Input text for sure form.widgets.email my@email.eu\n- Input text for sure form.widgets.password newpassword\n- Input text for sure form.widgets.password_ctl newpassword\n \n-I enter valid register user data\n- Wait until page contains element name=form.widgets.username\n- Input text form.widgets.username myuser\n- Input text form.widgets.email my@email.eu\n+I confirm deletion of the content\n+ Click //div[contains(@class,"modal-footer")]//button[@name="form.buttons.Delete"]\n+\n \n I send the register form\n- Wait until page contains element css=div.modal-footer #form-buttons-register\n- Click Element css=div.modal-footer #form-buttons-register\n+ Click //div[contains(@class,"modal-footer")]//button[@name="form.buttons.register"]\n+\n+\n+I enter valid register user data\n+ Type Text //input[@name="form.widgets.username"] myuser\n+ Type Text //input[@name="form.widgets.email"] myuser@plone.org\n+\n \n I trigger the add a new user action\n- Click Element id=add-user\n+ Click //a[@id="add-user"]\n \n-a document \'${title}\' in the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}/++add++Document\n- Wait For Condition return window.jQuery(\'.autotoc-nav .active:visible\').length > 0\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'${title}\'); return 0;\n- Click Button Save\n \n-I set the default content view of the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-display\']/a\n- Click link id=contextSetDefaultPage\n+I enter valid user data\n+ Type Text //input[@name="form.widgets.username"] myuser\n+ Type Text //input[@name="form.widgets.email"] myuser@plone.org\n+ Type Text //input[@name="form.widgets.password"] newpassword\n+ Type Text //input[@name="form.widgets.password_ctl"] newpassword\n \n-a document as the default view of the test folder\n- a document \'doc\' in the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-display\']/a\n- Wait until element is visible id=contextSetDefaultPage\n- Click link id=contextSetDefaultPage\n- Click element id=doc\n- Click element css=div.modal-footer button[name="form.buttons.Save"]\n \n-I change the default content view of the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n- Given patterns are loaded\n- Click link xpath=//li[@id=\'plone-contentmenu-display\']/a\n- Wait until element is visible id=folderChangeDefaultPage\n- Click link id=folderChangeDefaultPage\n \n-I trigger the \'${action}\' action menu item of the test folder\n- Go to ${PLONE_URL}/${TEST_FOLDER}\n- Given patterns are loaded\n- Element should be visible xpath=//li[@id=\'plone-contentmenu-actions\']/a\n- Click link xpath=//li[@id=\'plone-contentmenu-actions\']/a\n- Wait until element is visible id=plone-contentmenu-actions-${action}\n- Click link id=plone-contentmenu-actions-${action}\n- Wait until page contains Element css=div.modal-dialog\n+# THEN\n+\n+overlay should open\n+ Wait For Condition Element States //div[contains(@class,"modal-dialog")] contains visible\n+\n+\n+overlay should close\n+ Wait For Condition Element Count //div[contains(@class,"modal-dialog")] should be 0\n+\n+\n+overlay should remain open\n+ Wait For Condition Element States //div[contains(@class,"modal-wrapper")] contains visible\n+\n+\n+login overlay shows an error\n+ Wait For Condition Text //div[contains(@class,"modal-wrapper")] contains Error\n+\n+\n+overlay shows an error\n+ Wait For Condition Text //div[contains(@class,"modal-wrapper")] contains There were errors\n+\n+\n+overlay requires to compile a field\n+ Wait For Condition Text //div[contains(@class,"modal-wrapper")] contains Required input is missing\n \n-I confirm deletion of the content\n- # Note: The \'delete\' button has no standard z3c.form name attribute\n- Wait until keyword succeeds 2 2 Click Element css=div.modal-footer button#form-buttons-Delete\n \n-modals loaded\n- Wait For Condition return window.jQuery(\'.modal-wrapper\').size() > 0\n+# DRY\n+I enter credentials\n+ [Arguments] ${username} ${password}\n+ Type Text //input[@name="__ac_name"] ${username}\n+ Type Text //input[@name="__ac_password"] ${password}\n+ Click //div[contains(@class,"modal-footer")]//button\ndiff --git a/Products/CMFPlone/tests/robot/test_portlets.robot b/Products/CMFPlone/tests/robot/test_portlets.robot\nindex 6167adc91b..5641220fab 100644\n--- a/Products/CMFPlone/tests/robot/test_portlets.robot\n+++ b/Products/CMFPlone/tests/robot/test_portlets.robot\n@@ -1,56 +1,89 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Variables variables.py\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n \n-*** Test cases ***************************************************************\n+*** Test cases ***\n \n-Scenario: Add Login Portlet\n+Scenario: Add Login Portlet to left column\n Given a logged-in site administrator\n and a manage portlets view\n When I add a \'Login\' portlet to the left column\n+ and I go to portal root\n Then I should see a \'Login\' portlet in the left column\n \n+Scenario: Add Login Portlet to right column\n+ Given a logged-in site administrator\n+ and a manage portlets view\n+ When I add a \'Login\' portlet to the right column\n+ and I go to portal root\n+ Then I should see a \'Login\' portlet in the right column\n \n-*** Keywords *****************************************************************\n+Scenario: Delete Login Portlet from left column\n+ Given a logged-in site administrator\n+ and a manage portlets view\n+ When I add a \'Login\' portlet to the left column\n+ and I delete a \'Login\' portlet from the left column\n+ and I go to portal root\n+ Then I should not see a \'Login\' portlet in the left column\n+\n+Scenario: Delete Login Portlet from right column\n+ Given a logged-in site administrator\n+ and a manage portlets view\n+ When I add a \'Login\' portlet to the right column\n+ and I delete a \'Login\' portlet from the right column\n+ and I go to portal root\n+ Then I should not see a \'Login\' portlet in the right column\n+\n+# TODO: Move Portlets Up and Down\n+*** Keywords ***\n+\n+# Given\n \n a manage portlets view\n- Go to ${PLONE_URL}/@@manage-portlets\n- Wait until page contains Manage portlets\n+ Go to ${PLONE_URL}/@@manage-portlets\n+ Get Text //body contains Manage portlets\n+\n+# When\n \n I add a \'${portletname}\' portlet to the left column\n- Select from list by label xpath=//div[@id="portletmanager-plone-leftcolumn"]//select ${portletname}\n+ Select Options By //div[@id="portletmanager-plone-leftcolumn"]//select[contains(@class,"add-portlet")] label ${portletname}\n+ Get Text //body contains Portlet added\n \n I add a \'${portletname}\' portlet to the right column\n- Select from list by label xpath=//div[@id="portletmanager-plone-rightcolumn"]//select ${portletname}\n+ Select Options By //div[@id="portletmanager-plone-rightcolumn"]//select[contains(@class,"add-portlet")] label ${portletname}\n+ Get Text //body contains Portlet added\n+\n+I go to portal root\n+ Disable autologin\n+ Go to ${PLONE_URL}\n+\n+I delete a \'${portlet}\' portlet from the left column\n+ Click //*[@id="portletmanager-plone-leftcolumn"]/div[2]/div[2]/div[2]/form[3]/button\n+ Get Element Count //*[@id="portletmanager-plone-leftcolumn"]//div[@class="portletAssignment"] <= 1\n \n-I delete a \'${portlet}\'\' portlet from the left column\n- Click Link xpath=//div[@id="portal-column-one"]//div[@class="portletHeader" and contains(.,"${portlet}")]//a[@class="delete"] don\'t wait\n- Wait until keyword succeeds 1s 10s Flex Element Should not exist xpath=//div[@id="portal-column-one"]//div[@class="portletHeader" and contains(.,"${portlet}")]\n+I delete a \'${portlet}\' portlet from the right column\n+ Click //*[@id="portletmanager-plone-rightcolumn"]/div[2]/div[2]/div[2]/form[3]/button\n+ Get Element Count //*[@id="portletmanager-plone-rightcolumn"]//div[@class="portletAssignment"] <= 1\n \n-when I delete the \'${portlet}\' portlet from the right column\n- Click Link xpath=//div[@id="portal-column-two"]//div[@class="portletHeader" and contains(.,"${portlet}")]//a[@class="delete"] don\'t wait\n- Wait until keyword succeeds 1s 10s Flex Element Should not exist xpath=//div[@id="portal-column-two"]//div[@class="portletHeader" and contains(.,"${portlet}")]\n \n+# Then\n I should see a \'${portletname}\' portlet in the left column\n- Wait until page contains ${portletname}\n- Element should contain portal-column-one ${portletname}\n+ Get Element Count //*[@id="portal-column-one"]//div[contains(@class,"portlet${portletname}")] should be 1\n \n I should see a \'${portletname}\' portlet in the right column\n- Wait until page contains ${portletname}\n- Element should contain portal-column-two ${portletname}\n+ Get Element Count //*[@id="portal-column-two"]//div[contains(@class,"portlet${portletname}")] should be 1\n \n-I should not see \'${text}\' in the left column\n- Flex Element should not exist xpath=//div[@id="portal-column-one" and contains(.,"${text}")]\n+I should not see a \'${text}\' portlet in the left column\n+ Get Element Count //*[@id="portal-column-one"]//div[contains(@class,"portlet${text}")] should be 0\n \n-I should not see \'${text}\' in the right column\n- Flex Element should not exist xpath=//div[@id="portal-column-two" and contains(.,"${text}")]\n+I should not see a \'${text}\' portlet in the right column\n+ Get Element Count //*[@id="portal-column-two"]//div[contains(@class,"portlet${text}")] should be 0\ndiff --git a/Products/CMFPlone/tests/robot/test_querystring.robot b/Products/CMFPlone/tests/robot/test_querystring.robot\nindex 5a5e66fbf7..d25c417718 100644\n--- a/Products/CMFPlone/tests/robot/test_querystring.robot\n+++ b/Products/CMFPlone/tests/robot/test_querystring.robot\n@@ -1,246 +1,347 @@\n-*** Settings *****************************************************************\n+*** Settings ***\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n+Resource keywords.robot\n \n-Library Remote ${PLONE_URL}/RobotRemote\n+Library Remote ${PLONE_URL}/RobotRemote\n \n-Resource keywords.robot\n+Variables variables.py\n \n-Test Setup Run keywords Plone Test Setup\n-Test Teardown Run keywords Plone Test Teardown\n+Test Setup Run Keywords Plone test setup\n+Test Teardown Run keywords Plone test teardown\n \n-*** Test Cases **************************************************************\n+\n+*** Test Cases ***\n \n Scenario: Location query Current\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Current in the criteria Location\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Current in the criteria Location\n+ Then we expect 1 hits\n \n Scenario: Location query Parent\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Parent in the criteria Location\n- Then we expect 3 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Parent in the criteria Location\n+ Then we expect 3 hits\n \n Scenario: Location query Custom\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Custom in the criteria Location\n- and I search in B subfolder in the related items widget\n- Then we expect 5 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Custom in the criteria Location\n+ and I search in B subfolder in the related item widget\n+ Then we expect 5 hits\n \n Scenario: Location query Advanced\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Advanced in the criteria Location\n- Then I expect to be in Advanced mode\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Advanced in the criteria Location\n+ Then I expect to be in Advanced mode\n \n Scenario: Location query Simple\n+ # this fails simple is not available, first select \'Advanced Mode\' then you can select \'Simple Mode\'\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the operator Simple in the criteria Location\n- Then I expect to be in Simple mode\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the operator Advanced in the criteria Location\n+ and I open the select box titled operator\n+ and I select index Simple\n+ Then I expect to be in Simple mode\n \n Scenario: Title query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Title\n- and I search for A\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Title\n+ and I search for A\n+ Then we expect 1 hits\n \n Scenario: Description query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Description\n- and I search for a\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Description\n+ and I search for a\n+ Then we expect 1 hits\n \n Scenario: Searchable text query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Searchable text\n- and I search for a\n- and Sleep 0.2\n- and Wait For Then Click Element css=div.querystring-preview\n- Then we expect 2 hits\n- When I open the criteria Searchable text\n- and I search for d\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Searchable text\n+ and I search for a\n+ and Sleep 0.2\n+ Then we expect 2 hits\n+\n+ When I open the criteria Searchable text\n+ and I search for d\n+ Then we expect 1 hits\n \n Scenario: Tag query one\n+\n+ ${base_option_selector}= Set Variable select2-results-dept-0 select2-result select2-result-selectable select2-option\n+ ${base_option_selector_o}= Set Variable ${base_option_selector}-o\n+ ${base_option_selector_n}= Set Variable ${base_option_selector}-n\n+ ${base_option_selector_p}= Set Variable ${base_option_selector}-p\n+ ${base_option_selector_e}= Set Variable ${base_option_selector}-e\n # tests the "Matches any of" option\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the default operator in the criteria Tag\n- and I open the Selection Widget\n- ${base_option_selector} Set Variable li.select2-results-dept-0.select2-result.select2-result-selectable.select2-option\n- and Wait For Then Click Element css=${base_option_selector}-o\n- Then we expect 4 hits\n- When I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-n\n- Then we expect 4 hits\n- When I delete my selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-p\n- Then we expect 1 hits\n- When I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-e\n- Then we expect 2 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the default operator in the criteria Tag\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_o}")]\n+ Then we expect 4 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_n}")]\n+ Then we expect 4 hits\n+\n+ When I delete my selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_p}")]\n+ Then we expect 1 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_e}")]\n+ Then we expect 2 hits\n \n Scenario Tag query two\n+ ${base_option_selector}= Set Variable select2-results-dept-0 select2-result select2-result-selectable select2-option\n+ ${base_option_selector_o}= Set Variable ${base_option_selector}-o\n+ ${base_option_selector_n}= Set Variable ${base_option_selector}-n\n+ ${base_option_selector_p}= Set Variable ${base_option_selector}-p\n+ ${base_option_selector_e}= Set Variable ${base_option_selector}-e\n # tests the "Matches all of" option\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I expect an empty result after open the operator Matches all of in the criteria Tag\n- and I open the Selection Widget\n- ${base_option_selector} Set Variable li.select2-results-dept-0.select2-result.select2-result-selectable.select2-option\n- and Wait For Then Click Element css=${base_option_selector}-o\n- Then we expect 4 hits\n- When and I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-n\n- Then we expect 3 hits\n- When I delete my selection\n- and and I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-p\n- Then we expect 1 hits\n- When and I open the Selection Widget\n- and Wait For Then Click Element css=${base_option_selector}-e\n- Then we expect 1 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I expect an empty result after open the operator Matches all of in the criteria Tag\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_o}")]\n+ Then we expect 4 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_n}")]\n+ Then we expect 3 hits\n+\n+ When I delete my selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_p}")]\n+ Then we expect 1 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"${base_option_selector_e}")]\n+ Then we expect 1 hits\n \n \n Scenario Event end date query\n Given a logged-in manager\n- and a bunch of events\n- and the querystring pattern\n+ and a bunch of events\n+ and the querystring pattern\n # Before date\n- When I activate the default operator in the criteria Event end date\n- and Execute Javascript $(\'.querystring-criteria-value input[type="date"]\').val(\'2018-07-01\')\n- Then we do not expect any hits\n+ When I activate the default operator in the criteria Event end date\n+ and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date"]\n+ ... (element) => {\n+ ... # fire the event for the browser build-in date input field\n+ ... element.value="2018-07-01";\n+ ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ ... }\n+ ... all_elements=False\n+\n+ Then we do not expect any hits\n \n # When Execute Javascript $(\'.querystring-criteria-value input[type="date"]\').val(\'2018-07-06\')\n \n- # !!! BUG in plone.app.robotframework?\n+ # !!! BUG in plone.app.robotframework ?\n # File "~/.buildout/shared-eggs/plone.app.event-3.2.1-py3.6.egg/plone/app/event/recurrence.py", line 77, in occurrences\n # duration = event_end - event_start\n # TypeError: can\'t subtract offset-naive and offset-aware datetimes\n \n- # for some reason the timezone is not applied correctly here. this is\n- # probably a problem with plone.app.robotframework.content creation mechanism.\n- # actually we got 3 hits, but right would be:\n- # Then we expect 2 hits\n- # Between dates\n- # When I activate the operator Between dates in the criteria Event end date\n- # and Execute Javascript $($(\'.querystring-criteria-value .pattern-pickadate-date-wrapper > input[type="text"]\')[0]).pickadate(\'picker\').set(\'select\', new Date(2018, 7, 1))\n- # and Execute Javascript $($(\'.querystring-criteria-value .pattern-pickadate-date-wrapper > input[type="text"]\')[1]).pickadate(\'picker\').set(\'select\', new Date(2018, 7, 7))\n- # Then we expect 3 hits\n- # When Execute Javascript $($(\'.querystring-criteria-value .pattern-pickadate-date-wrapper > input[type="text"]\')[0]).pickadate(\'picker\').set(\'select\', new Date(2018, 7, 6))\n- # and Execute Javascript $($(\'.querystring-criteria-value .pattern-pickadate-date-wrapper > input[type="text"]\')[1]).pickadate(\'picker\').set(\'select\', new Date(2018, 7, 8))\n- # Then we expect 2 hits\n+ # When Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date"]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-06";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # Then we expect 2 hits\n+\n+ # # Between dates\n+ # When I activate the operator Between dates in the criteria Event end date\n+ # and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date" and contains(@class,"querystring-criteria-value-DateRangeWidget-start")]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-01";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date" and contains(@class,"querystring-criteria-value-DateRangeWidget-end")]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-07";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # Then we expect 3 hits\n+\n+ # # Between dates\n+ # When I activate the operator Between dates in the criteria Event end date\n+ # and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date" and contains(@class,"querystring-criteria-value-DateRangeWidget-start")]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-06";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # and Evaluate Javascript //div[contains(@class,"querystring-criteria-value")]//input[@type="date" and contains(@class,"querystring-criteria-value-DateRangeWidget-end")]\n+ # ... (element) => {\n+ # ... # fire the event for the browser build-in date input field\n+ # ... element.value="2018-08-06";\n+ # ... element.dispatchEvent(new Event("change", { bubbles: true }));\n+ # ... }\n+ # ... all_elements=False\n+ # Then we expect 2 hits\n+\n+\n \n Scenario Short name (id) query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Short name (id)\n- And I search for a\n- Then Page Should Contain A\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Short name (id)\n+ and I search for a\n+ Then I see A in Preview\n \n Scenario Review state query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I open the criteria Review State\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-private\n- Then we expect 7 hits\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I open the criteria Review State\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-private")]\n+ Then we expect 7 hits\n \n Scenario Type query\n Given a logged-in site administrator\n- and a bunch of events\n- and the querystring pattern\n- When I open the criteria Type\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-event\n- Then we expect 4 hits\n- When I delete one selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-file\n- Then we do not expect any hits\n- When I delete one selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-folder\n- Then we expect 5 hits\n- When I delete one selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-link\n- Then we expect 1 hits\n- When I delete one selection\n- and I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-document\n- Then we expect 2 hits\n- When I open the Selection Widget\n- and Wait For Then Click Element css=li.select2-option-link\n- Then we expect 3 hits\n+ and a bunch of events\n+ and the querystring pattern\n+ When I open the criteria Type\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-event")]\n+ Then we expect 4 hits\n+\n+ When I delete one selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-file")]\n+ Then we do not expect any hits\n+\n+ When I delete one selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-folder")]\n+ Then we expect 5 hits\n+\n+ When I delete one selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-link")]\n+ Then we expect 1 hits\n+\n+ When I delete one selection\n+ and I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-document")]\n+ Then we expect 2 hits\n+\n+ When I open the Selection Widget\n+ and Click //li[contains(@class,"select2-option-link")]\n+ Then we expect 3 hits\n \n Scenario Creator query\n Given a logged-in site administrator\n- and a bunch of folders\n- and the querystring pattern\n- When I activate the default operator in the criteria Creator\n- Then we expect 6 hits\n-\n+ and a bunch of folders\n+ and the querystring pattern\n+ When I activate the default operator in the criteria Creator\n+ Then we expect 6 hits\n \n-*** Keywords ****************************************************************\n \n-save\n- Click Link css=input#form-buttons-save\n+*** Keywords ***\n \n-the querystring pattern\n- #We go the /a to give more useful query results\n- Go to ${PLONE_URL}/a/++add++Collection\n- Wait until page contains element css=.pat-querystring\n- Given querystring pattern loaded\n- # Set a title, otherwise you see \'Please fill out this field\'\n- Execute Javascript $(\'#form-widgets-IDublinCore-title\').val(\'A Collection\'); return 0;\n- # for some unknown reason unload protection pops up, but only in robot tests\n- Execute Javascript $(window).unbind(\'beforeunload\')\n-\n-querystring pattern loaded\n- Wait For Condition return !!document.querySelector(\'.querystring-criteria-remove\')\n+# GIVEN\n \n a bunch of folders\n #We create enough items to give meaningful test results\n- ${F1}= Create content type=Folder title=A description=a subject=onep\n- ${F2}= Create content type=Folder title=B description=b subject=one container=${F1}\n- ${F3}= Create content type=Folder title=C description=and subject=on container=${F2}\n- Create content type=Document title=D subject=o container=${F3}\n- Create content type=Document title=E container=${F3}\n- Create content type=Link title=Link remoteUrl=/front-page container=${F3}\n+ ${F1}= Create content\n+ ... type=Folder\n+ ... title=A\n+ ... description=a\n+ ... subject=onep\n+ ${F2}= Create content\n+ ... type=Folder\n+ ... title=B\n+ ... description=b\n+ ... subject=one\n+ ... container=${F1}\n+ ${F3}= Create content\n+ ... type=Folder\n+ ... title=C\n+ ... description=and\n+ ... subject=on\n+ ... container=${F2}\n+ Create content\n+ ... type=Document\n+ ... title=D\n+ ... subject=o\n+ ... container=${F3}\n+ Create content\n+ ... type=Document\n+ ... title=E\n+ ... container=${F3}\n+ Create content\n+ ... type=Link\n+ ... title=Link\n+ ... remoteUrl=/front-page\n+ ... container=${F3}\n [Return] ${F1}\n \n+\n a bunch of events\n ${F1}= a bunch of folders\n- Create content type=Event title=Event1 start=2018-08-01T15:00 end=2018-08-01T17:00 container=${F1}\n- Create content type=Event title=Event2 start=2018-08-05T16:00 end=2018-08-07T11:00 container=${F1}\n- Create content type=Event title=Event3 start=2018-08-05T16:30 open_end-empty-marker=1 container=${F1}\n- Create content type=Event title=Event4 start=2018-08-06 end=2018-08-06 whole_day-empty-marker=1 container=${F1}\n+ Create content\n+ ... type=Event\n+ ... title=Event1\n+ ... start=2018-08-01T15:00\n+ ... end=2018-08-01T17:00\n+ ... container=${F1}\n+ Create content\n+ ... type=Event\n+ ... title=Event2\n+ ... start=2018-08-05T16:00\n+ ... end=2018-08-07T11:00\n+ ... container=${F1}\n+ Create content\n+ ... type=Event\n+ ... title=Event3\n+ ... start=2018-08-05T16:30\n+ ... open_end-empty-marker=1\n+ ... container=${F1}\n+ Create content\n+ ... type=Event\n+ ... title=Event4\n+ ... start=2018-08-06\n+ ... end=2018-08-06\n+ ... whole_day-empty-marker=1\n+ ... container=${F1}\n \n-I activate the default operator in the criteria ${CRITERIA}\n- open the select box titled index\n- select index type ${CRITERIA}\n+the querystring pattern\n+ # We go the /a to give more useful query results\n+ Go to ${PLONE_URL}/a/++add++Collection\n+ Wait For Condition Classes //body contains patterns-loaded\n+ Type Text //input[@id="form-widgets-IDublinCore-title"] A Collection\n+\n+# WHEN\n \n I activate the operator ${OPERATOR} in the criteria ${CRITERIA}\n open the select box titled index\n@@ -249,98 +350,128 @@ I activate the operator ${OPERATOR} in the criteria ${CRITERIA}\n open the select box titled operator\n select index type ${OPERATOR}\n \n-I expect an empty result after open the operator ${OPERATOR} in the criteria ${CRITERIA}\n- open the select box titled index\n- select index type ${CRITERIA}\n- Wait for condition return $("dl.searchResults").length == 0\n+\n+I search in ${NAME} subfolder in the related item widget\n+ mark results\n+ Click //div[@id="formfield-form-widgets-ICollection-query"]//div[@class="pat-relateditems-container"]//button[contains(@class,"mode") and contains(@class,"search")]\n+ Type Text //div[contains(@class,"querystring-criteria-value-ReferenceWidget")]//li[@class="select2-search-field"]//input[contains(@class,"select2-input")] ${NAME}\n+ Click //ul[@class="select2-results"]//a[contains(@class,"pat-relateditems-result-select") and contains(@class,"selectable")]\n+\n+\n+I open the select box titled operator\n open the select box titled operator\n- select index type ${OPERATOR}\n+\n+\n+I select index Simple\n+ select index type Simple\n+\n \n I open the criteria ${CRITERIA}\n open the select box titled index\n select index type ${CRITERIA}\n \n+\n I search for ${KEYWORD}\n- ${keyword_selector} Set Variable input.querystring-criteria-value-StringWidget\n- Wait For Then Click Element css=${keyword_selector}\n- Input Text css=${keyword_selector} ${KEYWORD}\n- Click Element css=div#content-core\n+ ${element} Get Element //input[contains(@class,"querystring-criteria-value-StringWidget")]\n+ Click ${element}\n+ Type Text ${element} ${KEYWORD}\n+ Click //div[@id="content-core"]\n+\n+\n+I activate the default operator in the criteria ${CRITERIA}\n+ open the select box titled index\n+ select index type ${CRITERIA}\n+\n \n I open the Selection Widget\n- Wait For Then Click Element css=div.select2-container-multi.querystring-criteria-value-MultipleSelectionWidget\n+ Click //div[contains(@class,"select2-container-multi") and contains(@class,"querystring-criteria-value-MultipleSelectionWidget")]\n \n-I delete one selection\n- #deletes one element\n- Wait For Then Click Element jquery=a.select2-search-choice-close:visible\n \n I delete my selection\n #deletes two elements\n- Wait For Then Click Element jquery=a.select2-search-choice-close:visible:first\n+ Click (//div[contains(@class,"querystring-criteria-value-MultipleSelectionWidget")]//a[contains(@class,"select2-search-choice-close")])[1]\n Sleep 0.1\n- Wait For Then Click Element jquery=a.select2-search-choice-close:visible\n+ Click //div[contains(@class,"querystring-criteria-value-MultipleSelectionWidget")]//a[contains(@class,"select2-search-choice-close")]\n \n-I search in ${NAME} subfolder in the related items widget\n- mark results\n- Wait For Then Click Element jquery=.pat-relateditems-container ul.select2-choices:visible\n- Wait Until Page Contains ${NAME}\n- # I have seen this fail sometimes, where the screen shot showed the NAME just fine.\n- Sleep 0.1\n- Click Element //a[contains(concat(\' \', normalize-space(@class), \' \'), \' pat-relateditems-result-select \')]//span[contains(text(),\'${NAME}\')]\n \n-I expect to be in Advanced mode\n- open the select box titled operator\n- ${selector} Set Variable .select2-drop-active[style*="display: block;"]\n- Element Should Contain jquery=${selector} Navigation Path\n- Element Should Contain jquery=${selector} Absolute Path\n- Element Should Contain jquery=${selector} Relative Path\n- Element Should Contain jquery=${selector} Simple Mode\n- ${selector} Set Variable div#select2-drop-mask\n- Wait For Then Click Invisible Element css=${selector}\n- Wait Until Element Is Not Visible css=${selector}\n+I delete one selection\n+ # :visible - should this be checked?\n+ Click //div[contains(@class,"querystring-criteria-value-MultipleSelectionWidget")]//a[contains(@class,"select2-search-choice-close")]\n \n-I expect to be in Simple mode\n+\n+I expect an empty result after open the operator ${OPERATOR} in the criteria ${CRITERIA}\n+ open the select box titled index\n+ select index type ${CRITERIA}\n+ Wait For Condition Element Count //dl[@class="searchResults"] should be 0\n open the select box titled operator\n- ${selector} Set Variable .select2-drop-active[style*="display: block;"]\n- Element Should Contain jquery=${selector} Custom\n- Element Should Contain jquery=${selector} Parent (../)\n- Element Should Contain jquery=${selector} Current (./)\n- Element Should Contain jquery=${selector} Advanced Mode\n- ${selector} Set Variable div#select2-drop-mask\n- Wait For Then Click Invisible Element css=${selector}\n- Wait Until Element Is Not Visible css=${selector}\n+ select index type ${OPERATOR}\n \n-open the select box titled ${NAME}\n- Click Element css=body\n- Wait For Then Click Element jquery=.querystring-criteria-${NAME} .select2-container:first\n \n-select index type ${INDEX}\n- ${input_selector} Set Variable .select2-drop-active[style*="display: block;"] input\n- Wait For Element css=${input_selector}\n- Input Text css=${input_selector} text=${INDEX}\n- Press Keys jquery=:focus RETURN\n+# THEN\n \n we expect ${NUM} hits\n #This assumes we have the 2 "Test document" and "Test folder" items from the\n #robot setup, as well as the 4 additional items from the "a bunch of folders" macro\n #works only for ${NUM} > 0\n- Sleep 0.5s\n+ # we need as `Sleep`, the select2 js is very slow\n+ Sleep 0.5s\n Wait until result is no longer marked\n- ${hits}= Execute Javascript return $(\'.searchResults > dd\').length\n- Should Be Equal As Integers ${hits} ${NUM}\n+ ${hits}= Evaluate Javascript //dl[@class="searchResults"]\n+ ... (element) => {\n+ ... return document.querySelectorAll(".searchResults > dd").length\n+ ... }\n+ ... all_elements=False\n+ Should Be Equal As Integers ${hits} ${NUM}\n mark results\n \n we do not expect any hits\n [Documentation] The search results may be the previous results that are still visible for a short time, so sleep a bit. Alternatively look at http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html\n- Sleep 0.2\n- Wait Until Element Is Visible css=div#search-results\n- Wait Until Element Contains css=div#search-results No results were found.\n+ Sleep 0.2\n+ Get Text //div[@id="search-results"] contains No results were found.\n+\n+I expect to be in Advanced mode\n+ open the select box titled operator\n+ ${element}= Get Element //div[contains(@class,"select2-drop-active") and contains(@style,"display: block;")]\n+ Get Text ${element} contains Navigation Path\n+ Get Text ${element} contains Absolute Path\n+ Get Text ${element} contains Relative Path\n+ Get Text ${element} contains Simple Mode\n+ Click //div[@id="select2-drop-mask"]\n+ Get Element States //div[@id="select2-drop-mask"] contains hidden\n+\n+I expect to be in Simple mode\n+ open the select box titled operator\n+ ${element}= Get Element //div[contains(@class,"select2-drop-active") and contains(@style,"display: block;")]\n+ Get Text ${element} contains Custom\n+ Get Text ${element} contains Parent (../)\n+ Get Text ${element} contains Current (./)\n+ Get Text ${element} contains Advanced Mode\n+ Click //div[@id="select2-drop-mask"]\n+ Get Element States //div[@id="select2-drop-mask"] contains hidden\n+\n+I see ${TEXT} in Preview\n+ Sleep 0.2\n+ Get Text //div[@id="search-results"] contains ${TEXT}\n+# Helper\n \n-a logged-in manager\n- Enable autologin as Manager Site Administrator Contributor Reviewer\n+open the select box titled ${NAME}\n+ Click //body\n+ Click (//div[@class="querystring-criteria-${NAME}"])[1]//div[contains(@class,"select2-container")]\n+\n+select index type ${INDEX}\n+ Type Text //div[contains(@class,"select2-drop-active") and contains(@style, "display: block;")]//input ${INDEX}\n+ Click //*[contains(@class,"select2-match")]\n \n mark results\n- Wait for condition return $("dl.searchResults").length > 0\n- Execute Javascript $("dl.searchResults").attr("marker", "marked")\n+ Evaluate Javascript //dl[@class="searchResults"]\n+ ... (element) => {\n+ ... element.setAttribute("marker", "marked")\n+ ... }\n+ ... all_elements=False\n \n wait until result is no longer marked\n- Wait for condition return $("dl.searchResults").length > 0 && $("dl.searchResults").attr("marker") != "marked"\n+ Evaluate Javascript //dl[@class="searchResults"]\n+ ... (element) => {\n+ ... return element && element.getAttribute("marker") != "marked"\n+ ... }\n+ ... all_elements=False\ndiff --git a/Products/CMFPlone/tests/robot/test_tinymce.robot b/Products/CMFPlone/tests/robot/test_tinymce.robot\nindex 75eb8d00c7..fe7138ddbb 100644\n--- a/Products/CMFPlone/tests/robot/test_tinymce.robot\n+++ b/Products/CMFPlone/tests/robot/test_tinymce.robot\n@@ -1,8 +1,6 @@\n *** Settings *****************************************************************\n \n-Resource plone/app/robotframework/keywords.robot\n-Resource plone/app/robotframework/saucelabs.robot\n-Resource plone/app/robotframework/selenium.robot\n+Resource plone/app/robotframework/browser.robot\n \n Library Remote ${PLONE_URL}/RobotRemote\n \n@@ -28,8 +26,8 @@ Scenario: A page is opened to edit in TinyMCE\n and insert link\n and insert image\n \n- Wait For Then Click Element css=#form-buttons-save\n- Wait until page contains Changes saved\n+ Click //*[@id="form-buttons-save"]\n+ Get Text //body contains Changes saved\n \n \n *** Keywords *****************************************************************\n@@ -39,39 +37,41 @@ Scenario: A page is opened to edit in TinyMCE\n an edited page\n Create content type=Document title=${TITLE}\n Go to ${PLONE_URL}/${PAGE_ID}/edit\n- Wait until page contains Edit Page\n+ Get Text //body contains Edit Page\n \n an uploaded image\n Create content type=Image title=an-image\n \n text inserted into wysiwyg\n- Wait Until Element Is Visible css=.tox-edit-area iframe\n- Select Frame css=.tox-edit-area iframe\n- Input text css=.mce-content-body foobar\n- UnSelect Frame\n+ Fill text to tinymce editor Susi Sorglos and John Doe\n \n insert link\n- Select Frame css=.tox-edit-area iframe\n- Execute Javascript function selectElementContents(el) {var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range);} var el = document.getElementById("tinymce"); selectElementContents(el);\n- UnSelect Frame\n- Click Button css=button[aria-label="Insert/edit link"]\n- Click Button css=.pat-relateditems-container button.favorites\n- Click Link css=.pat-relateditems-container .favorites a.fav[href=\'/\']\n- Wait Until Element Is Visible css=.pat-relateditems-result-select.selectable\n- Click Link css=.pat-relateditems-result-select.selectable\n- Click Button css=.modal-footer input[name="insert"]\n- Select Frame css=.tox-edit-area iframe\n- Execute Javascript window.getSelection().removeAllRanges()\n- UnSelect Frame\n- Wait Until Element Is Not Visible css=.modal-footer input[name="insert"]\n+ Evaluate JavaScript //div[contains(@class, \'tox-edit-area\')]//iframe\n+ ... (elem, args) => {\n+ ... const iframe_document = elem.contentDocument;\n+ ... const body = iframe_document.body;\n+ ... const p = body.firstChild;\n+ ... const range = new Range();\n+ ... range.setStart(p.firstChild, 5);\n+ ... range.setEnd(p.firstChild, 12);\n+ ... iframe_document.getSelection().removeAllRanges();\n+ ... iframe_document.getSelection().addRange(range);\n+ ... }\n+ ... all_elements=False\n+ Click //button[@aria-label=\'Insert/edit link\']\n+ Wait For Condition Element States //div[@class="modal-content"] contains visible\n+ Click //div[@class="modal-body"]//fieldset[@data-linktype="internal"]//button[contains(@class,"mode") and contains(@class,"browse")]\n+ Click //a[@title="Go one level up"]\n+ Click //a[contains(@class,"selectable") and @data-path="/test-folder"]\n+ Click //div[contains(@class,"modal-footer")]//input[@name="insert"]\n \n insert image\n- Click Button css=button[aria-label="Insert/edit image"]\n- Click Button css=.pat-relateditems-container button.favorites\n- Click Link css=.pat-relateditems-container .favorites a.fav[href=\'/\']\n- Wait Until Element Is Visible css=.pat-relateditems-result-select.selectable\n- Click Link css=.pat-relateditems-result-select.selectable\n- Input Text css=.modal-body [name="title"] SomeTitle\n- Input Text css=.modal-body [name="alt"] SomeAlt\n- Click Button css=.modal-footer input[name="insert"]\n- Wait Until Element Is Not Visible css=.modal-footer input[name="insert"]\n+ Click //button[@aria-label="Insert/edit image"]\n+ Wait For Condition Element States //div[@class="modal-content"] contains visible\n+ Click //div[@class="modal-body"]//fieldset[@data-linktype="image"]//button[contains(@class,"mode") and contains(@class,"browse")]\n+ Click //a[@title="Go one level up"]\n+ Wait For Condition Element States //div[@id="select2-drop"]//ul[@class="select2-results"] contains visible\n+ Click //div[@id="select2-drop"]//ul[@class="select2-results"]//li/div/div/a[contains(@class,"selectable") and @data-path="/image"]\n+ Type Text //div[contains(@class, \'modal-body\')]//input[@name="title"] SomeTitle\n+ Type Text //div[contains(@class, \'modal-body\')]//input[@name="alt"] SomeAlt\n+ Click //div[contains(@class, \'modal-footer\')]//input[contains(@name, \'insert\')]\ndiff --git a/news/4056.tests b/news/4056.tests\nnew file mode 100644\nindex 0000000000..f368aafe22\n--- /dev/null\n+++ b/news/4056.tests\n@@ -0,0 +1,2 @@\n+refactoring all robot tests to playwright based browser library tests\n+[1letter]\n'