diff options
author | vasraz <vasyl.razinkov@est.tech> | 2021-05-05 10:52:16 +0100 |
---|---|---|
committer | Christophe Closset <christophe.closset@intl.att.com> | 2021-05-06 07:05:14 +0000 |
commit | 92a380e5856be904b064a9136f93b4b45ec93834 (patch) | |
tree | ad07b72e0eef2583b51e5578f0e97eed784ee050 /integration-tests/src/test/java/org | |
parent | 00b288e068b418ab0ff00ff64ee204adbb4ba382 (diff) |
Increase Import VFC UI test coverage
Change-Id: Ie51411304fefe6b8ee3aa437b980f1e12bbc4707
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Issue-ID: SDC-3566
Diffstat (limited to 'integration-tests/src/test/java/org')
6 files changed, 326 insertions, 21 deletions
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/ImportVfcUiTest.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/ImportVfcUiTest.java index a571c1b9f6..b3538e32d1 100644 --- a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/ImportVfcUiTest.java +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/execute/sanity/ImportVfcUiTest.java @@ -19,11 +19,11 @@ package org.onap.sdc.frontend.ci.tests.execute.sanity; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.anEmptyMap; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.not; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -32,6 +32,7 @@ import com.aventstack.extentreports.Status; import java.util.Arrays; import java.util.Map; import java.util.Optional; +import org.apache.commons.collections.MapUtils; import org.onap.sdc.backend.ci.tests.datatypes.enums.ComponentType; import org.onap.sdc.backend.ci.tests.datatypes.enums.ResourceCategoryEnum; import org.onap.sdc.backend.ci.tests.utils.general.ElementFactory; @@ -46,7 +47,10 @@ import org.onap.sdc.frontend.ci.tests.flow.CreateVfFlow; import org.onap.sdc.frontend.ci.tests.flow.CreateVfcFlow; import org.onap.sdc.frontend.ci.tests.flow.DownloadCsarArtifactFlow; import org.onap.sdc.frontend.ci.tests.flow.exception.UiTestFlowRuntimeException; +import org.onap.sdc.frontend.ci.tests.pages.AttributeModal; +import org.onap.sdc.frontend.ci.tests.pages.AttributesPage; import org.onap.sdc.frontend.ci.tests.pages.ComponentPage; +import org.onap.sdc.frontend.ci.tests.pages.ResourceCreatePage; import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionDetailSideBarComponent; import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionDetailSideBarComponent.CompositionDetailTabName; import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionInformationTab; @@ -69,6 +73,7 @@ public class ImportVfcUiTest extends SetupCDTest { private HomePage homePage; private ResourceCreateData vfcCreateData; private ResourceCreateData vfCreateData; + private ComponentInstance createdComponentInstance; @BeforeClass public void beforeClass() { @@ -97,13 +102,15 @@ public class ImportVfcUiTest extends SetupCDTest { // TC - Import hierarchy of VFCs fileName = "org.openecomp.resource.VFC-child.yml"; createVfcFlow = createVFC(fileName); - componentPage = createVfcFlow.getLandedPage() - .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage")); + componentPage = createVfcFlow.getLandedPage().orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage")); + componentPage.isLoaded(); + + componentPage = manageAttributes(componentPage); componentPage.isLoaded(); componentPage.certifyComponent(); componentPage.isLoaded(); - yamlObject = downloadToscaArtifact(createVfcFlow.getLandedPage().get()); + yamlObject = downloadToscaArtifact(componentPage); checkMetadata(yamlObject, vfcCreateData); checkNodeTypes(yamlObject); homePage.getTopNavComponent().clickOnHome(); @@ -126,6 +133,32 @@ public class ImportVfcUiTest extends SetupCDTest { } + private ComponentPage manageAttributes(final ComponentPage componentPage) { + final AttributesPage attributesPage = componentPage.goToAttributes(); + attributesPage.isLoaded(); + + assertTrue(attributesPage.isAttributePresent("test_1")); + assertTrue(attributesPage.isAttributePresent("test_2")); + assertTrue(attributesPage.isAttributePresent("test_3")); + assertTrue(attributesPage.isAttributePresent("test_4")); + + attributesPage.deleteAttribute("test_2"); + assertFalse(attributesPage.isAttributePresent("test_2")); + ExtentTestActions.takeScreenshot(Status.INFO, "attributesPage.deleteAttribute", "Attribute 'test_2' successfully deleted"); + attributesPage.addAttribute(new AttributeModal.AttributeData("test_9", "Additional attribute added from UI", "string", "one More Attribute")); + attributesPage.isLoaded(); + assertTrue(attributesPage.isAttributePresent("test_9")); + ExtentTestActions.takeScreenshot(Status.INFO, "attributesPage.addAttribute", "Additional Attribute 'test_9' successfully added"); + + attributesPage.editAttribute(new AttributeModal.AttributeData("test_9", "Additional attribute added from UI".toUpperCase(), "string", + "one More Attribute".toUpperCase())); + attributesPage.isLoaded(); + assertTrue(attributesPage.isAttributePresent("test_9")); + ExtentTestActions.takeScreenshot(Status.INFO, "attributesPage.editAttribute", "Additional Attribute 'test_9' successfully altered"); + + return attributesPage.clickOnGeneralMenuItem(ResourceCreatePage.class); + } + private CompositionPage addInterfaceOperations(final ComponentPage componentPage) { final AddNodeToCompositionFlow addNodeToCompositionFlow = addNodeToCompositionFlow(componentPage); final CompositionPage compositionPage = addNodeToCompositionFlow.getLandedPage() @@ -133,7 +166,7 @@ public class ImportVfcUiTest extends SetupCDTest { final CompositionDetailSideBarComponent detailSideBar = compositionPage.getDetailSideBar(); detailSideBar.isLoaded(); - final ComponentInstance createdComponentInstance = addNodeToCompositionFlow.getCreatedComponentInstance() + createdComponentInstance = addNodeToCompositionFlow.getCreatedComponentInstance() .orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a ComponentInstance")); compositionPage.selectNode(createdComponentInstance.getName()); @@ -288,32 +321,38 @@ public class ImportVfcUiTest extends SetupCDTest { final Map<String, Object> mapEntry = getMapEntry(map, "node_types"); final Map<String, Object> nodeTypes = getMapEntry(mapEntry, mapEntry.keySet().iterator().next()); - assertNotNull(nodeTypes); + assertFalse(MapUtils.isEmpty(nodeTypes)); assertEquals("aDescription", nodeTypes.get("description")); final Map<String, Object> properties = getMapEntry(nodeTypes, "properties"); - assertThat(properties, not(anEmptyMap())); + assertFalse(MapUtils.isEmpty(properties)); final Map<String, Object> attributes = getMapEntry(nodeTypes, "attributes"); - assertThat(attributes, not(anEmptyMap())); + assertFalse(MapUtils.isEmpty(attributes)); final Map<String, Object> interfaces = getMapEntry(nodeTypes, "interfaces"); - assertThat(interfaces, not(anEmptyMap())); + assertFalse(MapUtils.isEmpty(interfaces)); } private void checkTopologyTemplate(final Map<String, Object> map) { - final Map<String, Object> mapEntry = getMapEntry(map, "topology_template"); - assertNotNull(mapEntry); + final Map<String, Object> topologyTemplate = getMapEntry(map, "topology_template"); + assertNotNull(topologyTemplate); + + final Map<String, Object> inputs = getMapEntry(topologyTemplate, "inputs"); + assertFalse(MapUtils.isEmpty(inputs)); - final Map<String, Object> properties = getMapEntry(mapEntry, "inputs"); - assertThat(properties, not(anEmptyMap())); + final Map<String, Object> nodeTemplates = getMapEntry(topologyTemplate, "node_templates"); + assertFalse(MapUtils.isEmpty(nodeTemplates)); - final Map<String, Object> attributes = getMapEntry(mapEntry, "node_templates"); - assertThat(attributes, not(anEmptyMap())); + final Map<String, Object> attributes = getMapEntry((Map<String, Object>) nodeTemplates.get(createdComponentInstance.getName()), "attributes"); + assertFalse(MapUtils.isEmpty(attributes)); + assertEquals(4, attributes.keySet().stream() + .filter(s -> (s.contains("test_1") || s.contains("test_3") || s.contains("test_4") || s.contains("test_9")) && !s.contains("test_2")) + .count()); - final Map<String, Object> interfaces = getMapEntry(mapEntry, "substitution_mappings"); - assertThat(interfaces, not(anEmptyMap())); + final Map<String, Object> substitutionMappings = getMapEntry(topologyTemplate, "substitution_mappings"); + assertFalse(MapUtils.isEmpty(substitutionMappings)); } diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributeModal.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributeModal.java new file mode 100644 index 0000000000..bd1330d8cf --- /dev/null +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributeModal.java @@ -0,0 +1,118 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.sdc.frontend.ci.tests.pages; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +/** + * Handles the 'Attributes' Edit Modal UI actions + */ +public class AttributeModal extends AbstractPageObject { + + private WebElement wrappingElement; + + public AttributeModal(final WebDriver webDriver) { + super(webDriver); + } + + @Override + public void isLoaded() { + waitForElementVisibility(By.xpath(XpathSelector.TITLE_DIV.getXPath())); + waitForElementVisibility(By.xpath(XpathSelector.SAVE_BTN.getXPath())); + wrappingElement = findElement(By.xpath(XpathSelector.ATTR_CONTAINER_DIV.getXPath())); + } + + public void fillForm(final AttributeData attributeData, final boolean isUpdate) { + if (!isUpdate) { + editName(attributeData.getAttributeName()); + } + editDescription(attributeData.getDescription()); + editType(attributeData.getAttributeType()); + editDefaultValue(attributeData.getDefaultValue()); + } + + private void editName(final String attributeName) { + final WebElement webElement = waitForElementVisibility(By.xpath(XpathSelector.ATTRIBUTE_NAME_INPUT.getXPath())); + webElement.clear(); + webElement.sendKeys(attributeName); + } + + private void editDescription(final String description) { + final WebElement webElement = waitForElementVisibility(By.xpath(XpathSelector.DESCRIPTION_INPUT.getXPath())); + webElement.clear(); + webElement.sendKeys(description); + } + + private void editType(final String attributeType) { + waitToBeClickable(By.xpath(XpathSelector.ATTRIBUT_TYPE_ICON.getXPath())).click(); + final WebElement element = waitForElementVisibility(By.xpath(XpathSelector.DROPDOWN_RESULTS.getXPath())); + element.findElement(By.xpath(XpathSelector.ATTRIBUTE_TYPE_LI.getXPath(attributeType))).click(); + } + + private void editDefaultValue(final String defaultValue) { + final WebElement webElement = waitForElementVisibility(By.xpath(XpathSelector.DEFAULT_VALUE_INPUT.getXPath())); + webElement.clear(); + webElement.sendKeys(defaultValue); + } + + public void clickSave() { + waitToBeClickable(By.xpath(XpathSelector.SAVE_BTN.getXPath())).click(); + } + + @Getter + @AllArgsConstructor + public static class AttributeData { + + private final String attributeName; + private final String description; + private final String attributeType; + private final String defaultValue; + } + + /** + * Enum that contains identifiers and xpath expressions to elements related to the enclosing page object. + */ + @AllArgsConstructor + private enum XpathSelector { + TITLE_DIV("//div[contains(@class,'title') and contains(text(), ' Attribute Details')]"), + ATTR_CONTAINER_DIV("//div[@class='attr-container']"), + ATTRIBUTE_NAME_INPUT("//input[@data-tests-id='attributeName']"), + DESCRIPTION_INPUT("//textarea[@data-tests-id='description']"), + ATTRIBUTE_TYPE_LI("//li[@data-tests-id='%s']"), + ATTRIBUT_TYPE_ICON("//div[@data-tests-id='attributeType-icon']"), + DROPDOWN_RESULTS("//ul[contains(@class,'dropdown-results')]"), + ATTRIBUTE_TYPE_DIV("//div[@data-tests-id='attributeType']"), + DEFAULT_VALUE_INPUT("//input[@data-tests-id='defaultValue']"), + SAVE_BTN("//button[@data-tests-id='button-save']"); + + @Getter + private final String xPath; + + public String getXPath(final String... xpathParams) { + return String.format(xPath, xpathParams); + } + + } + +} diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesPage.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesPage.java new file mode 100644 index 0000000000..47b29b9f23 --- /dev/null +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/AttributesPage.java @@ -0,0 +1,126 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.sdc.frontend.ci.tests.pages; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.onap.sdc.frontend.ci.tests.pages.AttributeModal.AttributeData; +import org.onap.sdc.frontend.ci.tests.utilities.LoaderHelper; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +/** + * Handles the 'Attributes' Page UI actions + */ +public class AttributesPage extends ComponentPage { + + private WebElement wrappingElement; + + public AttributesPage(final WebDriver webDriver) { + super(webDriver); + } + + @Override + public void isLoaded() { + super.isLoaded(); + waitForElementVisibility(By.xpath(XpathSelector.MAIN_DIV.getXpath())); + waitForElementVisibility(By.xpath(XpathSelector.TITLE_DIV.getXpath())); + waitForElementVisibility(By.xpath(XpathSelector.ATTRIBUTES_DIV.getXpath())); + wrappingElement = findElement(By.xpath(XpathSelector.ATTRIBUTES_DIV.getXpath())); + } + + public boolean isAttributePresent(final String attributeName) { + try { + final WebElement element = wrappingElement.findElement(By.xpath(XpathSelector.ATTRIBUTES_NAME_SPAN.getXpath(attributeName))); + return element != null; + } catch (final Exception e) { + return false; + } + } + + public void addAttribute(final AttributeData attributeData) { + final AttributeModal attributeModal = clickOnAdd(); + attributeModal.isLoaded(); + attributeModal.fillForm(attributeData, false); + attributeModal.clickSave(); + loaderHelper.waitForLoader(LoaderHelper.XpathSelector.SDC_LOADER_LARGE, 5); + } + + public AttributeModal clickOnAdd() { + waitToBeClickable(By.xpath(XpathSelector.ADD_BTN.getXpath())).click(); + return new AttributeModal(webDriver); + } + + public AttributeModal clickOnEdit(final String attributeName) { + waitToBeClickable(By.xpath(XpathSelector.EDIT_BTN.getXpath(attributeName))).click(); + return new AttributeModal(webDriver); + } + + public void deleteAttribute(final String attributeName) { + if (attributeName == null) { + return; + } + waitForElementVisibility(By.xpath(XpathSelector.DELETE_BTN.getXpath(attributeName))).click(); + waitToBeClickable(By.xpath(XpathSelector.DELETE_ATTRIBUTE_CONFIRM_BTN.getXpath())).click(); + waitForElementInvisibility(By.xpath(XpathSelector.DELETE_BTN.getXpath(attributeName)), 5); + } + + public void editAttribute(final AttributeData attributeData) { + final AttributeModal attributeModal = clickOnEdit(attributeData.getAttributeName()); + attributeModal.isLoaded(); + attributeModal.fillForm(attributeData, true); + attributeModal.clickSave(); + loaderHelper.waitForLoader(LoaderHelper.XpathSelector.SDC_LOADER_LARGE, 5); + } + + /** + * Enum that contains identifiers and xpath expressions to elements related to the enclosing page object. + */ + @AllArgsConstructor + private enum XpathSelector { + MAIN_DIV("w-sdc-main-right-container", "//div[@class='%s']"), + TITLE_DIV("workspace-tab-title", "//div[contains(@class,'%s') and contains(text(), 'Attributes')]"), + ATTRIBUTES_DIV("workspace-attributes", "//div[@class='%s']"), + ADD_BTN("svg-icon-label", "//span[contains(@class,'%s') and contains(text(), 'Add')]"), + ATTRIBUTES_NAME_SPAN("//div[@data-tests-id='attrib-name_%s']"), + EDIT_BTN("//div[contains(@class,'svg-icon') and @data-tests-id='edit_%s']"), + DELETE_BTN("//div[contains(@class,'svg-icon') and @data-tests-id='delete_%s']"), + DELETE_ATTRIBUTE_CONFIRM_BTN("delete-modal-button-ok", "//button[@data-tests-id='%s']"); + + @Getter + private String id; + private final String xpathFormat; + + XpathSelector(final String xpathFormat) { + this.xpathFormat = xpathFormat; + } + + public String getXpath(final String... xpathParams) { + return String.format(xpathFormat, xpathParams); + } + + public String getXpath() { + return String.format(xpathFormat, id); + } + + } + +} diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ComponentPage.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ComponentPage.java index 68087f6261..8bbbf5a655 100644 --- a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ComponentPage.java +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ComponentPage.java @@ -91,6 +91,14 @@ public class ComponentPage extends AbstractPageObject { return resourceLeftSideMenu.clickOnAttributesOutputsMenuItem(); } + public AttributesPage goToAttributes() { + return resourceLeftSideMenu.clickOnAttributesMenuItem(); + } + + public <T extends ComponentPage> T clickOnGeneralMenuItem(Class<? extends T> clazz) { + return resourceLeftSideMenu.clickOnGeneralMenuItem(clazz); + } + public ResourcePropertiesAssignmentPage goToPropertiesAssignment() { return resourceLeftSideMenu.clickOnPropertiesAssignmentMenuItem(); } diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourceLeftSideMenu.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourceLeftSideMenu.java index 9b860d5ab0..413d4b4a6b 100644 --- a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourceLeftSideMenu.java +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourceLeftSideMenu.java @@ -75,6 +75,16 @@ public class ResourceLeftSideMenu extends AbstractPageObject { } /** + * Clicks on the 'Attributes' menu item. + * + * @return the next page object + */ + public AttributesPage clickOnAttributesMenuItem() { + wrappingElement.findElement(By.xpath(XpathSelector.ATTRIBUTES_MENU.getXpath())).click(); + return new AttributesPage(webDriver); + } + + /** * Clicks on the TOSCA artifacts menu item. * * @return the next page object @@ -85,13 +95,13 @@ public class ResourceLeftSideMenu extends AbstractPageObject { } /** - * Clicks on the TOSCA artifacts menu item. + * Clicks on the 'General' menu item. * * @return the next page object */ - public ServiceCreatePage clickOnGeneralMenuItem() { + public <T extends ComponentPage> T clickOnGeneralMenuItem(Class<? extends T> clazz) { wrappingElement.findElement(By.xpath(XpathSelector.GENERAL_MENU.getXpath())).click(); - return new ServiceCreatePage(webDriver); + return (T) new ComponentPage(webDriver); } public CompositionPage clickOnCompositionMenuItem() { @@ -106,9 +116,12 @@ public class ResourceLeftSideMenu extends AbstractPageObject { private enum XpathSelector { MAIN_DIV("w-sdc-left-sidebar", "//div[@class='%s']"), PROPERTIES_ASSIGNMENT_MENU("Properties AssignmentLeftSideMenu", "//*[@data-tests-id='%s']"), + PROPERTIES_MENU("PropertiesLeftSideMenu", "//*[@data-tests-id='%s']"), ATTRIBUTES_OUTPUTS_MENU("Attributes & OutputsLeftSideMenu", "//*[@data-tests-id='%s']"), + ATTRIBUTES_MENU("AttributesLeftSideMenu", "//*[@data-tests-id='%s']"), GENERAL_MENU("GeneralLeftSideMenu", "//*[@data-tests-id='%s']"), COMPOSITION_MENU("CompositionLeftSideMenu", "//*[@data-tests-id='%s']"), + REQUIREMENT_CAPABILITY_MENU("Req. & CapabilitiesLeftSideMenu", "//*[@data-tests-id='%s']"), TOSCA_ARTIFACTS_MENU("TOSCA ArtifactsLeftSideMenu", "//*[@data-tests-id='%s']"); @Getter diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/utilities/LoaderHelper.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/utilities/LoaderHelper.java index 6406c2a460..4c0356ff46 100644 --- a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/utilities/LoaderHelper.java +++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/utilities/LoaderHelper.java @@ -79,7 +79,8 @@ public class LoaderHelper extends AbstractPageObject { @AllArgsConstructor @Getter public enum XpathSelector { - LOADER_WITH_LOADER_BACKGROUND("//*[contains(@class, 'sdc-loader-background')]"); + LOADER_WITH_LOADER_BACKGROUND("//*[contains(@class, 'sdc-loader-background')]"), + SDC_LOADER_LARGE("//div[@data-tests-id='loader']"); private final String xpath; } |