Tobias Gritschacher has uploaded a new change for review. https://gerrit.wikimedia.org/r/94915
Change subject: Basic cucumber tests for statements ...................................................................... Basic cucumber tests for statements - baseline commit for cucumber statement tests Bug: 53845 Change-Id: Ie5c47a735b864b0bd28bed37610c09b60ea85ba4 --- A selenium_cuc/features/statement.feature A selenium_cuc/features/step_definitions/entity_selector_steps.rb A selenium_cuc/features/step_definitions/statement_steps.rb M selenium_cuc/features/support/modules/entity_selector_module.rb M selenium_cuc/features/support/modules/qualifiers_module.rb M selenium_cuc/features/support/modules/statement_module.rb 6 files changed, 213 insertions(+), 51 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/15/94915/1 diff --git a/selenium_cuc/features/statement.feature b/selenium_cuc/features/statement.feature new file mode 100644 index 0000000..41a835b --- /dev/null +++ b/selenium_cuc/features/statement.feature @@ -0,0 +1,47 @@ +# Wikidata UI tests +# +# Author:: Tobias Gritschacher (tobias.gritschac...@wikimedia.de) +# License:: GNU GPL v2+ +# +# feature definition for statements tests + +@wikidata.beta.wmflabs.org +Feature: Creating statements + + Background: + Given I am on an item page + And The copyright warning has been dismissed + And Anonymous edit warnings are disabled + + @ui_only + Scenario: Statement UI has all required elements + Then Statement add button should be there + And Statement cancel button should not be there + And Statement save button should not be there + And Entity selector input element should not be there + And Statement value input element should not be there + + @ui_only + Scenario: Click the add button + When I click the statement add button + Then Statement add button should be disabled + And Statement cancel button should be there + And Statement save button should be disabled + And Statement help field should be there + And Entity selector input element should be there + And Statement value input element should not be there + + @ui_only + Scenario Outline: Cancel statement + When I click the statement add button + And I <cancel> + Then Statement add button should be there + And Statement cancel button should not be there + And Statement save button should not be there + And Entity selector input element should not be there + And Statement value input element should not be there + + Examples: + | cancel | + | click the statement cancel button | + | press the ESC key in the entity selector input field | diff --git a/selenium_cuc/features/step_definitions/entity_selector_steps.rb b/selenium_cuc/features/step_definitions/entity_selector_steps.rb new file mode 100644 index 0000000..4c70583 --- /dev/null +++ b/selenium_cuc/features/step_definitions/entity_selector_steps.rb @@ -0,0 +1,19 @@ +# -*- encoding : utf-8 -*- +# Wikidata UI tests +# +# Author:: Tobias Gritschacher (tobias.gritschac...@wikimedia.de) +# License:: GNU GPL v2+ +# +# tests for entity selector + +When /^I press the ESC key in the entity selector input field$/ do + on(ItemPage).entitySelectorInput_element.send_keys :escape +end + +Then /^Entity selector input element should be there$/ do + on(ItemPage).entitySelectorInput?.should be_true +end + +Then /^Entity selector input element should not be there$/ do + on(ItemPage).entitySelectorInput?.should be_false +end diff --git a/selenium_cuc/features/step_definitions/statement_steps.rb b/selenium_cuc/features/step_definitions/statement_steps.rb new file mode 100644 index 0000000..51b7429 --- /dev/null +++ b/selenium_cuc/features/step_definitions/statement_steps.rb @@ -0,0 +1,61 @@ +# -*- encoding : utf-8 -*- +# Wikidata UI tests +# +# Author:: Tobias Gritschacher (tobias.gritschac...@wikimedia.de) +# License:: GNU GPL v2+ +# +# tests for statements + +When /^I click the statement add button$/ do + on(ItemPage).addStatement +end + +When /^I click the statement cancel button$/ do + on(ItemPage).cancelStatement +end + +Then /^Statement help field should be there$/ do + on(ItemPage).statementHelpField?.should be_true +end + +Then /^Statement add button should be there$/ do + on(ItemPage).addStatement?.should be_true +end + +Then /^Statement add button should be disabled$/ do + on(ItemPage) do |page| + page.addStatement?.should be_false + page.addStatementDisabled?.should be_true + end +end + +Then /^Statement save button should be there$/ do + on(ItemPage).saveStatement?.should be_true +end + +Then /^Statement save button should not be there$/ do + on(ItemPage).saveStatement?.should be_false +end + +Then /^Statement save button should be disabled$/ do + on(ItemPage) do |page| + page.saveStatement?.should be_false + page.saveStatementDisabled?.should be_true + end +end + +Then /^Statement cancel button should be there$/ do + on(ItemPage).cancelStatement?.should be_true +end + +Then /^Statement cancel button should not be there$/ do + on(ItemPage).cancelStatement?.should be_false +end + +Then /^Statement value input element should be there$/ do + on(ItemPage).statementValueInput?.should be_true +end + +Then /^Statement value input element should not be there$/ do + on(ItemPage).statementValueInput?.should be_false +end diff --git a/selenium_cuc/features/support/modules/entity_selector_module.rb b/selenium_cuc/features/support/modules/entity_selector_module.rb index 722e023..ee59fb7 100644 --- a/selenium_cuc/features/support/modules/entity_selector_module.rb +++ b/selenium_cuc/features/support/modules/entity_selector_module.rb @@ -9,24 +9,47 @@ module EntitySelectorPage include PageObject # entity selector widget UI elements - ul(:entitySelectorList, :class => "ui-entityselector-list") - a(:firstEntitySelectorLink, :xpath => "//ul[contains(@class, 'ui-entityselector-list')]/li/a") - span(:firstEntitySelectorLabel, :xpath => "//ul[contains(@class, 'ui-entityselector-list')]/li/a/span/span[contains(@class, 'ui-entityselector-label')]") - span(:firstEntitySelectorDescription, :xpath => "//ul[contains(@class, 'ui-entityselector-list')]/li/a/span/span[contains(@class, 'ui-entityselector-description')]") - text_field(:entitySelectorInput, :xpath => "//div[contains(@class, 'wb-claimlistview')]//input[contains(@class, 'ui-entityselector-input')]", :index => 0) - text_field(:entitySelectorInput2, :xpath => "//div[contains(@class, 'wb-claimlistview')]//input[contains(@class, 'ui-entityselector-input')]", :index => 1) + text_field(:entitySelectorInput, xpath: "//div[contains(@class, 'wb-claimlistview')]//input[contains(@class, 'ui-entityselector-input')]", index: 0) + #ul(:entitySelectorList, class: "ui-entityselector-list") + #a(:firstEntitySelectorLink, xpath: "//ul[contains(@class, 'ui-entityselector-list')]/li/a") + #span(:firstEntitySelectorLabel, xpath: "//ul[contains(@class, 'ui-entityselector-list')]/li/a/span/span[contains(@class, 'ui-entityselector-label')]") + #span(:firstEntitySelectorDescription, xpath: "//ul[contains(@class, 'ui-entityselector-list')]/li/a/span/span[contains(@class, 'ui-entityselector-description')]") + #text_field(:entitySelectorInput2, xpath: "//div[contains(@class, 'wb-claimlistview')]//input[contains(@class, 'ui-entityselector-input')]", index: 1) + #text_field(:entitySelectorSearchInput, id: "searchInput") + #ul(:entitySelectorSearch, xpath: "//body/ul[contains(@class, 'ui-entityselector-list')]") + +=begin def wait_for_entity_selector_list wait_until do entitySelectorList? end end -end -def select_entity(label) - self.entitySelectorInput = label - ajax_wait - self.wait_for_entity_selector_list - firstEntitySelectorLink - ajax_wait + def wait_for_suggestions_list + wait_until do + entitySelectorSearch? + end + end + + def select_entity(label) + self.entitySelectorInput = label + ajax_wait + self.wait_for_entity_selector_list + firstEntitySelectorLink + ajax_wait + end + + def count_search_results + entitySelectorSearch_element.items + end + + def get_search_results + results = [] + entitySelectorSearch_element.each do |li| + results << li + end + results + end +=end end diff --git a/selenium_cuc/features/support/modules/qualifiers_module.rb b/selenium_cuc/features/support/modules/qualifiers_module.rb index d977422..34807d2 100644 --- a/selenium_cuc/features/support/modules/qualifiers_module.rb +++ b/selenium_cuc/features/support/modules/qualifiers_module.rb @@ -6,7 +6,7 @@ # # module for qualifiers page object -module ReferencePage +module QualifierPage include PageObject # qualifiers UI elements div(:qualifiersContainer, :class => "wb-claim-qualifiers") diff --git a/selenium_cuc/features/support/modules/statement_module.rb b/selenium_cuc/features/support/modules/statement_module.rb index ca8ab2e..4c146a6 100644 --- a/selenium_cuc/features/support/modules/statement_module.rb +++ b/selenium_cuc/features/support/modules/statement_module.rb @@ -9,36 +9,45 @@ module StatementPage include PageObject include EntitySelectorPage - include ReferencePage - # statements UI elements - a(:addStatement, :xpath => "//div[contains(@class, 'wb-claimlistview')]/span[contains(@class, 'wb-addtoolbar')]/div/span/span/a") - a(:addClaimToFirstStatement, :xpath => "//div[contains(@class, 'wb-claim-section')][1]/span[contains(@class, 'wb-addtoolbar')]/div/span/span/a") - a(:editFirstStatement, :xpath => "//span[contains(@class, 'wb-edittoolbar')]/span/span/span[contains(@class, 'wb-ui-toolbar-editgroup-innoneditmode')]/span/a") - a(:saveStatement, :xpath => "//span[contains(@class, 'wb-edittoolbar')]/span/span/span[contains(@class, 'wb-ui-toolbar-editgroup-ineditmode')]/span/a[text()='save']") - a(:cancelStatement, :xpath => "//span[contains(@class, 'wb-edittoolbar')]/span/span/span[contains(@class, 'wb-ui-toolbar-editgroup-ineditmode')]/span/a[text()='cancel']") - a(:removeClaimButton, :xpath => "//span[contains(@class, 'wb-edittoolbar')]/span/span/span[contains(@class, 'wb-ui-toolbar-editgroup-ineditmode')]/span/a[text()='remove']") - # TODO: could this lead to problems? for CM & item type properties there is an additional "a" element around the textbox; this is not the case for string type properies - #textarea(:statementValueInput, :xpath => "//div[contains(@class, 'valueview-ineditmode')]/div/a/textarea[contains(@class, 'valueview-input')]") - textarea(:statementValueInput, :class => "valueview-input") - div(:claimEditMode, :xpath => "//div[contains(@class, 'wb-claim-section')]/div[contains(@class, 'wb-edit')]") - div(:statement1Name, :xpath => "//div[contains(@class, 'wb-claim-section')][1]/div[contains(@class, 'wb-claim-section-name')]/div[contains(@class, 'wb-claim-name')]") - div(:statement2Name, :xpath => "//div[contains(@class, 'wb-claim-section')][2]/div[contains(@class, 'wb-claim-section-name')]/div[contains(@class, 'wb-claim-name')]") - a(:statement1Link, :xpath => "//div[contains(@class, 'wb-claim-section')][1]/div[contains(@class, 'wb-claim-section-name')]/div[contains(@class, 'wb-claim-name')]/a") - a(:statement2Link, :xpath => "//div[contains(@class, 'wb-claim-section')][2]/div[contains(@class, 'wb-claim-section-name')]/div[contains(@class, 'wb-claim-name')]/a") - element(:statement1ClaimValue1, :a, :xpath => "//div[contains(@class, 'wb-claim-section')][1]/div[contains(@class, 'wb-claimview')][1]/div/div/div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") - element(:statement1ClaimValue2, :a, :xpath => "//div[contains(@class, 'wb-claim-section')][1]/div[contains(@class, 'wb-claimview')][2]/div/div/div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") - element(:statement1ClaimValue3, :a, :xpath => "//div[contains(@class, 'wb-claim-section')][1]/div[contains(@class, 'wb-claimview')][3]/div/div/div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") - element(:statement2ClaimValue1, :a, :xpath => "//div[contains(@class, 'wb-claim-section')][2]/div[contains(@class, 'wb-claimview')][1]/div/div/div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") - element(:statement2ClaimValue2, :a, :xpath => "//div[contains(@class, 'wb-claim-section')][2]/div[contains(@class, 'wb-claimview')][2]/div/div/div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") - element(:statement2ClaimValue3, :a, :xpath => "//div[contains(@class, 'wb-claim-section')][2]/div[contains(@class, 'wb-claimview')][3]/div/div/div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") - span(:snaktypeSelectorIcon, :xpath => "//div[contains(@class, 'wb-snak-typeselector')]/span[contains(@class, 'wb-snaktypeselector')]") - a(:snaktypeSelectorValue, :xpath => "//ul[contains(@class, 'wb-snaktypeselector-menu')]/li[contains(@class, 'wb-snaktypeselector-menuitem-value')]/a") - a(:snaktypeSelectorSomevalue, :xpath => "//ul[contains(@class, 'wb-snaktypeselector-menu')]/li[contains(@class, 'wb-snaktypeselector-menuitem-somevalue')]/a") - a(:snaktypeSelectorNovalue, :xpath => "//ul[contains(@class, 'wb-snaktypeselector-menu')]/li[contains(@class, 'wb-snaktypeselector-menuitem-novalue')]/a") + #include ReferencePage + #include QualifierPage + # statements UI elements + a(:addStatement, css: "div.wb-claimlistview a.wb-addtoolbar-addbutton:not(.wikibase-toolbarbutton-disabled)") + a(:addStatementDisabled, css: "div.wb-claimlistview a.wb-addtoolbar-addbutton.wikibase-toolbarbutton-disabled") + a(:saveStatement, css: ".wb-claimlistview div.listview-item.wb-new a.wikibase-toolbareditgroup-savebutton:not(.wikibase-toolbarbutton-disabled)") + a(:saveStatementDisabled, css: ".wb-claimlistview div.listview-item.wb-new a.wikibase-toolbareditgroup-savebutton.wikibase-toolbarbutton-disabled") + a(:cancelStatement, css: ".wb-claimlistview div.listview-item.wb-new a.wikibase-toolbareditgroup-cancelbutton:not(.wikibase-toolbarbutton-disabled)") + a(:cancelStatementDisabled, css: ".wb-claimlistview div.listview-item.wb-new a.wikibase-toolbareditgroup-cancelbutton.wikibase-toolbarbutton-disabled") + textarea(:statementValueInput, xpath: "//div[contains(@class, 'wb-claimlistview')]//input[contains(@class, 'valueview-input')]") + span(:statementHelpField, :css => "div.claimlistview span.mw-help-field-hint") + + #a(:addClaimToFirstStatement, css: "div.wb-claimlistview:nth-child(1) > span.wb-addtoolbar a:not(.wikibase-toolbarbutton-disabled)") + #a(:editFirstStatement, css: "span.wb-edittoolbar > span > span > span.wikibase-toolbareditgroup-innoneditmode > span > a:not(.wikibase-toolbarbutton-disabled):nth-child(1)") + #a(:removeClaimButton, xpath: "//span[contains(@class, 'wb-edittoolbar')]/span/span/span[contains(@class, 'wikibase-toolbareditgroup-ineditmode')]/span/a[not(contains(@class, 'wikibase-toolbarbutton-disabled'))][text()='remove']") + #text_field(:statementValueInputField, class: "valueview-input") + #div(:claimEditMode, xpath: "//div[contains(@class, 'wb-claim-section')]/div[contains(@class, 'wb-edit')]") + #div(:statement1Name, xpath: "//div[contains(@class, 'wb-claimlistview')][1]//div[contains(@class, 'wb-claim-name')]") + #div(:statement2Name, xpath: "//div[contains(@class, 'wb-claimlistview')][2]//div[contains(@class, 'wb-claim-name')]") + #a(:statement1Link, xpath: "//div[contains(@class, 'wb-claimlistview')][1]//div[contains(@class, 'wb-claim-name')]/a") + #a(:statement2Link, xpath: "//div[contains(@class, 'wb-claimlistview')][2]//div[contains(@class, 'wb-claim-name')]/a") + #element(:statement1ClaimValue1, :a, xpath: "//div[contains(@class, 'wb-claimlistview')][1]//div[contains(@class, 'wb-claimview')][1]//div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") + #element(:statement1ClaimValue2, :a, xpath: "//div[contains(@class, 'wb-claimlistview')][1]//div[contains(@class, 'wb-claimview')][2]//div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") + #element(:statement1ClaimValue3, :a, xpath: "//div[contains(@class, 'wb-claimlistview')][1]//div[contains(@class, 'wb-claimview')][3]//div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") + #element(:statement2ClaimValue1, :a, xpath: "//div[contains(@class, 'wb-claimlistview')][2]//div[contains(@class, 'wb-claimview')][1]//div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") + #element(:statement2ClaimValue2, :a, xpath: "//div[contains(@class, 'wb-claimlistview')][2]//div[contains(@class, 'wb-claimview')][2]//div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") + #element(:statement2ClaimValue3, :a, xpath: "//div[contains(@class, 'wb-claimlistview')][2]//div[contains(@class, 'wb-claimview')][3]//div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/a") + #span(:statement1ClaimValue1Nolink, xpath: "//div[contains(@class, 'wb-claimlistview')][1]//div[contains(@class, 'wb-claimview')][1]//div[contains(@class, 'wb-claim-mainsnak')]/div[contains(@class, 'wb-snak-value-container')]/div[contains(@class, 'wb-snak-value')]/div/div/span") + #span(:snaktypeSelectorIcon, xpath: "//div[contains(@class, 'wb-snak-typeselector')]/span[contains(@class, 'wb-snaktypeselector')]") + #a(:snaktypeSelectorValue, xpath: "//ul[contains(@class, 'wb-snaktypeselector-menu')]/li[contains(@class, 'wb-snaktypeselector-menuitem-value')]/a") + #a(:snaktypeSelectorSomevalue, xpath: "//ul[contains(@class, 'wb-snaktypeselector-menu')]/li[contains(@class, 'wb-snaktypeselector-menuitem-somevalue')]/a") + #a(:snaktypeSelectorNovalue, xpath: "//ul[contains(@class, 'wb-snaktypeselector-menu')]/li[contains(@class, 'wb-snaktypeselector-menuitem-novalue')]/a") + #span(:previewSpinner, class: "mw-small-spinner") + +=begin def wait_for_property_value_box wait_until do - self.statementValueInput? + self.statementValueInput? || self.statementValueInputField? end end @@ -56,7 +65,9 @@ self.wait_for_property_value_box if self.statementValueInput? self.statementValueInput = statement_value - # TODO: bug 43609: Regarding item property, as long as no verification of the input is done, we have to wait for the entityselector to finish the selection + ajax_wait + elsif self.statementValueInputField? + self.statementValueInputField = statement_value ajax_wait end saveStatement @@ -65,15 +76,15 @@ end def edit_first_statement(statement_value) - editFirstStatement - self.wait_for_property_value_box - self.statementValueInput_element.clear - self.statementValueInput = statement_value - ajax_wait - saveStatement - ajax_wait - self.wait_for_statement_request_finished - end + editFirstStatement + self.wait_for_property_value_box + self.statementValueInput_element.clear + self.statementValueInput = statement_value + ajax_wait + saveStatement + ajax_wait + self.wait_for_statement_request_finished + end def add_claim_to_first_statement(statement_value) addClaimToFirstStatement @@ -103,4 +114,5 @@ self.snaktypeSelectorNovalue end end +=end end -- To view, visit https://gerrit.wikimedia.org/r/94915 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie5c47a735b864b0bd28bed37610c09b60ea85ba4 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Tobias Gritschacher <tobias.gritschac...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits