Skip to content

Commit acfafe0

Browse files
authored
Merge pull request #4410 from magento-tsg/2.3-develop-mftf-pr17
[TSG] MFTF for 2.3 (pr17) (2.3.3)
2 parents 0421665 + 352a1a0 commit acfafe0

10 files changed

+218
-36
lines changed

app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductActionGroup.xml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<arguments>
3434
<argument name="product" defaultValue="_defaultProduct"/>
3535
</arguments>
36+
<scrollToTopOfPage stepKey="scrollToTopOfPage"/>
3637
<fillField selector="{{AdminProductFormSection.productName}}" userInput="{{product.name}}" stepKey="fillProductName"/>
3738
<fillField selector="{{AdminProductFormSection.productSku}}" userInput="{{product.sku}}" stepKey="fillProductSku"/>
3839
<fillField selector="{{AdminProductFormSection.productPrice}}" userInput="{{product.price}}" stepKey="fillProductPrice"/>
@@ -498,4 +499,29 @@
498499
<conditionalClick selector="{{AdminProductFormSection.enableProductLabel}}" dependentSelector="{{AdminProductFormSection.productStatusValue('1')}}" visible="true" stepKey="disableProduct"/>
499500
<seeElement selector="{{AdminProductFormSection.productStatusValue('2')}}" stepKey="assertThatProductSetToDisabled"/>
500501
</actionGroup>
502+
503+
<!-- You are on product Edit Page -->
504+
<!-- Assert checkbox available for website in Product In Websites -->
505+
<actionGroup name="AssertWebsiteIsAvailableInProductWebsites">
506+
<arguments>
507+
<argument name="website" type="string"/>
508+
</arguments>
509+
<scrollTo selector="{{ProductInWebsitesSection.sectionHeader}}" stepKey="scrollToProductInWebsitesSection"/>
510+
<conditionalClick selector="{{ProductInWebsitesSection.sectionHeader}}" dependentSelector="{{ProductInWebsitesSection.sectionHeaderOpened}}" visible="false" stepKey="expandProductWebsitesSection"/>
511+
<seeElement selector="{{ProductInWebsitesSection.website(website)}}" stepKey="seeCheckboxForWebsite"/>
512+
</actionGroup>
513+
514+
<!-- You are on product Edit Page -->
515+
<!-- Assert checkbox not available for website in Product In Websites -->
516+
<actionGroup name="AssertWebsiteIsNotAvailableInProductWebsites" extends="AssertWebsiteIsAvailableInProductWebsites">
517+
<remove keyForRemoval="seeCheckboxForWebsite"/>
518+
<dontSeeElement selector="{{ProductInWebsitesSection.website(website)}}" after="expandProductWebsitesSection" stepKey="dontSeeCheckboxForWebsite"/>
519+
</actionGroup>
520+
521+
<!-- You are on product Edit Page -->
522+
<!-- Assert checkbox Is checked for website in Product In Websites -->
523+
<actionGroup name="AssertProductIsAssignedToWebsite" extends="AssertWebsiteIsAvailableInProductWebsites">
524+
<remove keyForRemoval="seeCheckboxForWebsite"/>
525+
<seeCheckboxIsChecked selector="{{ProductInWebsitesSection.website(website)}}" after="expandProductWebsitesSection" stepKey="seeCustomWebsiteIsChecked"/>
526+
</actionGroup>
501527
</actionGroups>

app/code/Magento/Catalog/Test/Mftf/ActionGroup/CustomOptionsActionGroup.xml

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,26 @@
4747
<fillField selector="{{AdminProductCustomizableOptionsSection.lastOptionTitle}}" userInput="{{option.title}}" stepKey="fillTitle"/>
4848
<click selector="{{AdminProductCustomizableOptionsSection.lastOptionTypeParent}}" stepKey="openTypeSelect"/>
4949
<click selector="{{AdminProductCustomizableOptionsSection.optionType('File')}}" stepKey="selectTypeFile"/>
50-
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPrice('0')}}" stepKey="waitForElements"/>
51-
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPrice('0')}}" userInput="{{option.price}}" stepKey="fillPrice"/>
52-
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceType('0')}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
53-
<fillField selector="{{AdminProductCustomizableOptionsSection.optionFileExtensions('0')}}" userInput="{{option.file_extension}}" stepKey="fillCompatibleExtensions"/>
50+
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPriceByTitle(option.title)}}" stepKey="waitForElements"/>
51+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPriceByTitle(option.title)}}" userInput="{{option.price}}" stepKey="fillPrice"/>
52+
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceTypeByTitle(option.title)}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
53+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionFileExtensionByTitle(option.title)}}" userInput="{{option.file_extension}}" stepKey="fillCompatibleExtensions"/>
5454
</actionGroup>
5555
<actionGroup name="AddProductCustomOptionField">
5656
<arguments>
5757
<argument name="option" defaultValue="ProductOptionField"/>
58-
<argument name="optionIndex" type="string"/>
5958
</arguments>
59+
<scrollTo selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" stepKey="scrollToAddButtonOption"/>
6060
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.addOptionBtn}}" visible="false" stepKey="openCustomOptionSection"/>
6161
<click selector="{{AdminProductCustomizableOptionsSection.addOptionBtn}}" stepKey="clickAddOption"/>
6262
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.lastOptionTitle}}" stepKey="waitForOption"/>
6363
<fillField selector="{{AdminProductCustomizableOptionsSection.lastOptionTitle}}" userInput="{{option.title}}" stepKey="fillTitle"/>
6464
<click selector="{{AdminProductCustomizableOptionsSection.lastOptionTypeParent}}" stepKey="openTypeSelect"/>
6565
<click selector="{{AdminProductCustomizableOptionsSection.optionType('Field')}}" stepKey="selectTypeFile"/>
66-
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPrice(optionIndex)}}" stepKey="waitForElements"/>
67-
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPrice(optionIndex)}}" userInput="{{option.price}}" stepKey="fillPrice"/>
68-
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceType(optionIndex)}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
69-
<fillField selector="{{AdminProductCustomizableOptionsSection.optionSku(optionIndex)}}" userInput="{{option.title}}" stepKey="fillSku"/>
66+
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPriceByTitle(option.title)}}" stepKey="waitForElements"/>
67+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPriceByTitle(option.title)}}" userInput="{{option.price}}" stepKey="fillPrice"/>
68+
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceTypeByTitle(option.title)}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
69+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionSkuByTitle(option.title)}}" userInput="{{option.title}}" stepKey="fillSku"/>
7070
</actionGroup>
7171
<actionGroup name="importProductCustomizableOptions">
7272
<arguments>
@@ -99,4 +99,45 @@
9999
<assertEquals expected="{{option.price}}" expectedType="string" actual="$grabOptionPrice" stepKey="assertOptionPrice"/>
100100
<assertEquals expected="{{option.title}}" expectedType="string" actual="$grabOptionSku" stepKey="assertOptionSku"/>
101101
</actionGroup>
102+
<!-- Assumes we are on product edit page -->
103+
<actionGroup name="AdminDeleteAllProductCustomOptions">
104+
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.checkIfCustomizableOptionsTabOpen}}" visible="true" stepKey="expandContentTab"/>
105+
<waitForPageLoad time="10" stepKey="waitCustomizableOptionsTabOpened"/>
106+
<executeInSelenium function="function($webdriver) use ($I) {
107+
$buttons = $webdriver->findElements(\Facebook\WebDriver\WebDriverBy::cssSelector('[data-index=\'options\'] [data-index=\'delete_button\']'));
108+
while(!empty($buttons)) {
109+
$button = reset($buttons);
110+
$I->executeJS('arguments[0].scrollIntoView(false)', [$button]);
111+
$button->click();
112+
$webdriver->wait()->until(\Facebook\WebDriver\WebDriverExpectedCondition::stalenessOf($button));
113+
$buttons = $webdriver->findElements(\Facebook\WebDriver\WebDriverBy::cssSelector('[data-index=\'options\'] [data-index=\'delete_button\']'));
114+
}
115+
}" stepKey="deleteCustomOptions"/>
116+
<dontSeeElement selector="{{AdminProductCustomizableOptionsSection.customOptionButtonDelete}}" stepKey="assertNoCustomOptions"/>
117+
</actionGroup>
118+
<!-- Assumes we are on product edit page -->
119+
<actionGroup name="AdminAssertProductHasNoCustomOptions">
120+
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.checkIfCustomizableOptionsTabOpen}}" visible="true" stepKey="expandContentTab"/>
121+
<waitForPageLoad time="10" stepKey="waitCustomizableOptionsTabOpened"/>
122+
<dontSeeElement selector="{{AdminProductCustomizableOptionsSection.customOption}}" stepKey="assertNoCustomOptions"/>
123+
</actionGroup>
124+
<!-- Assumes we are on product edit page -->
125+
<actionGroup name="AdminAssertProductHasNoCustomOption" extends="AdminAssertProductCustomOptionVisible">
126+
<remove keyForRemoval="assertCustomOptionVisible"/>
127+
<dontSeeElement selector="{{AdminProductCustomizableOptionsSection.fillOptionTitle(option.title)}}" after="waitCustomizableOptionsTabOpened" stepKey="assertNoCustomOption"/>
128+
</actionGroup>
129+
<!-- Assumes we are on product edit page -->
130+
<actionGroup name="AdminAssertProductCustomOptionVisible">
131+
<arguments>
132+
<argument name="option" defaultValue="ProductOptionField"/>
133+
</arguments>
134+
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.checkIfCustomizableOptionsTabOpen}}" visible="true" stepKey="expandContentTab"/>
135+
<waitForPageLoad time="10" stepKey="waitCustomizableOptionsTabOpened"/>
136+
<seeElement selector="{{AdminProductCustomizableOptionsSection.fillOptionTitle(option.title)}}" stepKey="assertCustomOptionVisible"/>
137+
</actionGroup>
138+
<!-- Assumes we are on product edit page -->
139+
<actionGroup name="AdminDeleteProductCustomOption" extends="AdminAssertProductCustomOptionVisible">
140+
<remove keyForRemoval="assertCustomOptionVisible"/>
141+
<click selector="{{AdminProductCustomizableOptionsSection.deleteCustomOptions(option.title)}}" after="waitCustomizableOptionsTabOpened" stepKey="clickDeleteCustomOption"/>
142+
</actionGroup>
102143
</actionGroups>

app/code/Magento/Catalog/Test/Mftf/Data/ProductData.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,12 @@
506506
<requiredEntity type="product_option">ProductOptionField</requiredEntity>
507507
<requiredEntity type="product_option">ProductOptionArea</requiredEntity>
508508
</entity>
509+
<entity name="ProductWithTextFieldAndAreaAndFileOptions" type="product">
510+
<var key="sku" entityType="product" entityKey="sku" />
511+
<requiredEntity type="product_option">ProductOptionField</requiredEntity>
512+
<requiredEntity type="product_option">ProductOptionArea</requiredEntity>
513+
<requiredEntity type="product_option">ProductOptionFile</requiredEntity>
514+
</entity>
509515
<entity name="ApiVirtualProductWithDescription" type="product">
510516
<data key="sku" unique="suffix">api-virtual-product</data>
511517
<data key="type_id">virtual</data>

app/code/Magento/Catalog/Test/Mftf/Data/ProductOptionData.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,10 @@
176176
<data key="is_require">true</data>
177177
<requiredEntity type="product_option_value">ProductOptionPercentPriceValueDropdown</requiredEntity>
178178
</entity>
179+
<entity name="ProductOptionFieldSecond" extends="ProductOptionField">
180+
<data key="title" unique="suffix">fifth option</data>
181+
</entity>
182+
<entity name="ProductOptionFileSecond" extends="ProductOptionFile">
183+
<data key="title" unique="suffix">fourth option</data>
184+
</entity>
179185
</entities>

app/code/Magento/Catalog/Test/Mftf/Section/AdminProductCustomizableOptionsSection.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
<element name="optionTypeOpenDropDown" type="button" selector=".admin__dynamic-rows[data-index='options'] .action-select" timeout="30"/>
2020
<element name="optionTypeTextField" type="button" selector=".admin__dynamic-rows[data-index='options'] .action-menu._active li li" timeout="30"/>
2121
<element name="maxCharactersInput" type="input" selector="input[name='product[options][0][max_characters]']"/>
22+
<element name="deleteCustomOptions" type="button" selector="//div[contains(@class, 'fieldset-wrapper-title')]//span[contains(., '{{optionTitle}}')]/parent::div/parent::div//button[@class='action-delete']" parameterized="true" timeout="30"/>
23+
<element name="customOption" type="block" selector="[data-index='options'] tbody tr.data-row"/>
24+
<element name="customOptionButtonDelete" type="button" selector="[data-index='options'] [data-index='delete_button']"/>
2225

2326
<element name="optionTypeDropDown" type="select" selector="//table[@data-index='options']//tr[{{index}}]//div[@data-index='type']//div[contains(@class, 'action-select-wrap')]" parameterized="true" />
2427
<element name="optionTypeItem" type="select" selector="//table[@data-index='options']//tr[{{index}}]//div[@data-index='type']//*[contains(@class, 'action-menu-item')]//*[contains(., '{{optionValue}}')]" parameterized="true" />
2528
<element name="checkSelect" type="select" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//span[text()='Option Type']/parent::label/parent::div/parent::div//div[@data-role='selected-option']" parameterized="true"/>
29+
<element name="checkOptionType" type="select" selector="//span[text()='{{optionTitle}}']/parent::div/parent::div/parent::div//parent::label/parent::div/parent::div//li[@class='admin__action-multiselect-menu-inner-item']//label[text()='{{optionType}}']" parameterized="true"/>
2630
<element name="checkDropDown" type="select" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//parent::label/parent::div/parent::div//li[@class='admin__action-multiselect-menu-inner-item']//label[text()='Drop-down']" parameterized="true"/>
2731
<element name="clickAddValue" type="button" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//tfoot//button" parameterized="true"/>
2832
<element name="fillOptionValueTitle" type="input" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//tbody/tr[@data-repeat-index='{{var2}}']//span[text()='Title']/parent::label/parent::div/parent::div//div[@class='admin__field-control']/input" parameterized="true"/>
@@ -32,8 +36,13 @@
3236
<element name="checkboxUseDefaultOption" type="checkbox" selector="//table[@data-index='values']//tbody//tr[@data-repeat-index='{{var1}}']//div[@class='admin__field-control']//input[@type='checkbox']" parameterized="true"/>
3337
<element name="requiredCheckBox" type="checkbox" selector="input[name='product[options][{{index}}][is_require]']" parameterized="true" />
3438
<element name="fillOptionValueSku" type="input" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//tbody/tr[@data-repeat-index='{{var2}}']//span[text()='SKU']/parent::label/parent::div/parent::div//div[@class='admin__field-control']/input" parameterized="true"/>
39+
<element name="fillOptionCompatibleFileExtensions" type="input" selector="input[name='product[options][{{index}}][file_extension]']" parameterized="true"/>
3540

3641
<!-- Elements that make it easier to select the most recently added element -->
42+
<element name="optionPriceByTitle" type="input" selector="//*[@data-index='options']//*[@data-role='collapsible-title' and contains(., '{{optionTitle}}')]/ancestor::tr//*[@data-index='price']//input" parameterized="true"/>
43+
<element name="optionPriceTypeByTitle" type="select" selector="//*[@data-index='options']//*[@data-role='collapsible-title' and contains(., '{{optionTitle}}')]/ancestor::tr//*[@data-index='price_type']//select" parameterized="true"/>
44+
<element name="optionSkuByTitle" type="input" selector="//*[@data-index='options']//*[@data-role='collapsible-title' and contains(., '{{optionTitle}}')]/ancestor::tr//*[@data-index='sku']//input" parameterized="true"/>
45+
<element name="optionFileExtensionByTitle" type="input" selector="//*[@data-index='options']//*[@data-role='collapsible-title' and contains(., '{{optionTitle}}')]/ancestor::tr//*[@data-index='file_extension']//input" parameterized="true"/>
3746
<element name="lastOptionTitle" type="input" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr[last()]//*[contains(@class, '_required')]//input" />
3847
<element name="lastOptionTypeParent" type="block" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr[last()]//*[contains(@class, 'admin__action-multiselect-text')]" />
3948
<element name="lastOptionPrice" type="input" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr[last()]//*[contains(@name, '[price]')]"/>

app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
</section>
7878
<section name="ProductInWebsitesSection">
7979
<element name="sectionHeader" type="button" selector="div[data-index='websites']" timeout="30"/>
80+
<element name="sectionHeaderOpened" type="button" selector="[data-index='websites']._show" timeout="30"/>
8081
<element name="website" type="checkbox" selector="//label[contains(text(), '{{var1}}')]/parent::div//input[@type='checkbox']" parameterized="true"/>
8182
</section>
8283
<section name="ProductDesignSection">
@@ -215,4 +216,4 @@
215216
<element name="attributeGroupByName" type="button" selector="//div[@class='fieldset-wrapper-title']//span[text()='{{group}}']" parameterized="true"/>
216217
<element name="attributeByGroupAndName" type="text" selector="//div[@class='fieldset-wrapper-title']//span[text()='{{group}}']/../../following-sibling::div//span[contains(text(),'attribute')]" parameterized="true"/>
217218
</section>
218-
</sections>
219+
</sections>

app/code/Magento/Catalog/Test/Mftf/Test/AdminImportCustomizableOptionToProductWithSKUTest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@
5252
<waitForPageLoad stepKey="waitForProductEditPageLoad"/>
5353
<actionGroup ref="AddProductCustomOptionField" stepKey="addCutomOption1">
5454
<argument name="option" value="ProductOptionField"/>
55-
<argument name="optionIndex" value="0"/>
5655
</actionGroup>
5756
<actionGroup ref="AddProductCustomOptionField" stepKey="addCutomOption2">
5857
<argument name="option" value="ProductOptionField2"/>
59-
<argument name="optionIndex" value="1"/>
6058
</actionGroup>
6159
<actionGroup ref="saveProductForm" stepKey="saveProduct"/>
6260
<!--Change second product sku to first product sku-->

0 commit comments

Comments
 (0)