Przeglądaj źródła

Issue/copy specify abstract objects as much as possible cross screen classes (#2913)

* Reformat all classes and add extends dependencies

* Refactored of base locators

* Fix and resolve conflicts

* Refactored BasePage methods and Pages classes

* Refactored unused locators

* Added extends ConsumersList

* Resolve conversation
Alexandr Nezboretskiy 2 lat temu
rodzic
commit
5a06d659e2
16 zmienionych plików z 205 dodań i 162 usunięć
  1. 78 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/BasePage.java
  2. 6 9
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/NaviSideBar.java
  3. 7 10
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/ConnectorCreateForm.java
  4. 9 13
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/ConnectorDetails.java
  5. 12 20
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/KafkaConnectList.java
  6. 10 11
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumer/ConsumersDetails.java
  7. 4 5
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumer/ConsumersList.java
  8. 8 11
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaCreateForm.java
  9. 5 9
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaDetails.java
  10. 8 12
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaRegistryList.java
  11. 6 8
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/ProduceMessagePanel.java
  12. 5 10
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicCreateEditForm.java
  13. 7 10
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicDetails.java
  14. 8 15
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicsList.java
  15. 13 7
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/tests/ConnectorsTests.java
  16. 19 12
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/tests/SchemasTests.java

+ 78 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/BasePage.java

@@ -0,0 +1,78 @@
+package com.provectus.kafka.ui.pages;
+
+import static com.codeborne.selenide.Selenide.$x;
+
+import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.utilities.WebUtils;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public abstract class BasePage extends WebUtils {
+
+  protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
+  protected SelenideElement submitBtn = $x("//button[@type='submit']");
+  protected SelenideElement tableGrid = $x("//table");
+  protected SelenideElement dotMenuBtn = $x("//button[@aria-label='Dropdown Toggle']");
+  protected SelenideElement alertHeader = $x("//div[@role='alert']//div[@role='heading']");
+  protected SelenideElement alertMessage = $x("//div[@role='alert']//div[@role='contentinfo']");
+  protected String tableElementNameLocator = "//tbody//a[contains(text(),'%s')]";
+
+  protected void waitUntilSpinnerDisappear() {
+    log.debug("\nwaitUntilSpinnerDisappear");
+    loadingSpinner.shouldBe(Condition.disappear);
+  }
+
+  protected void clickSubmitBtn() {
+    clickByJavaScript(submitBtn);
+  }
+
+  protected SelenideElement getTableElement(String elementName) {
+    log.debug("\ngetTableElement: {}", elementName);
+    return $x(String.format(tableElementNameLocator, elementName));
+  }
+
+  protected String getAlertHeader() {
+    log.debug("\ngetAlertHeader");
+    String result = alertHeader.shouldBe(Condition.visible).getText();
+    log.debug("-> {}", result);
+    return result;
+  }
+
+  protected String getAlertMessage() {
+    log.debug("\ngetAlertMessage");
+    String result = alertMessage.shouldBe(Condition.visible).getText();
+    log.debug("-> {}", result);
+    return result;
+  }
+
+  protected boolean isAlertVisible(AlertHeader header) {
+    log.debug("\nisAlertVisible: {}", header.toString());
+    boolean result = getAlertHeader().equals(header.toString());
+    log.debug("-> {}", result);
+    return result;
+  }
+
+  protected boolean isAlertVisible(AlertHeader header, String message) {
+    log.debug("\nisAlertVisible: {} {}", header, message);
+    boolean result = isAlertVisible(header) && getAlertMessage().equals(message);
+    log.debug("-> {}", result);
+    return result;
+  }
+
+  public enum AlertHeader {
+    SUCCESS("Success"),
+    VALIDATION_ERROR("Validation Error"),
+    BAD_REQUEST("400 Bad Request");
+
+    private final String value;
+
+    AlertHeader(String value) {
+      this.value = value;
+    }
+
+    public String toString() {
+      return value;
+    }
+  }
+}

+ 6 - 9
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/NaviSideBar.java

@@ -1,21 +1,18 @@
 package com.provectus.kafka.ui.pages;
 
+import static com.codeborne.selenide.Selenide.$x;
+import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import io.qameta.allure.Step;
-
 import java.time.Duration;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByActions;
-
-public class NaviSideBar {
+public class NaviSideBar extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
     protected SelenideElement dashboardMenuItem = $x("//a[@title='Dashboard']");
     protected String sideMenuOptionElementLocator = ".//ul/li[contains(.,'%s')]";
     protected String clusterElementLocator = "//aside/ul/li[contains(.,'%s')]";
@@ -30,7 +27,7 @@ public class NaviSideBar {
 
     @Step
     public NaviSideBar waitUntilScreenReady() {
-        loadingSpinner.shouldBe(Condition.disappear, Duration.ofSeconds(30));
+        waitUntilSpinnerDisappear();
         dashboardMenuItem.shouldBe(Condition.visible, Duration.ofSeconds(30));
         return this;
     }
@@ -70,4 +67,4 @@ public class NaviSideBar {
                 .map(option -> $x(String.format(sideMenuOptionElementLocator, option.value)))
                 .collect(Collectors.toList());
     }
-}
+}

+ 7 - 10
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/ConnectorCreateForm.java

@@ -1,24 +1,21 @@
 package com.provectus.kafka.ui.pages.connector;
 
+import static com.codeborne.selenide.Selenide.$x;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
-import static com.codeborne.selenide.Selenide.$x;
-import static com.codeborne.selenide.Selenide.refresh;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-
-public class ConnectorCreateForm {
+public class ConnectorCreateForm extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
     protected SelenideElement nameField = $x("//input[@name='name']");
     protected SelenideElement contentTextArea = $x("//textarea[@class='ace_text-input']");
-    protected SelenideElement submitBtn = $x("//button[@type='submit']");
     protected SelenideElement configField = $x("//div[@id='config']");
 
     @Step
     public ConnectorCreateForm waitUntilScreenReady() {
-        loadingSpinner.shouldBe(Condition.disappear);
+        waitUntilSpinnerDisappear();
         nameField.shouldBe(Condition.visible);
         return this;
     }
@@ -34,8 +31,8 @@ public class ConnectorCreateForm {
 
     @Step
     public ConnectorCreateForm clickSubmitButton() {
-      clickByJavaScript(submitBtn);
-      loadingSpinner.shouldBe(Condition.disappear);
+      clickSubmitBtn();
+      waitUntilSpinnerDisappear();
       return this;
     }
 }

+ 9 - 13
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/ConnectorDetails.java

@@ -1,33 +1,25 @@
 package com.provectus.kafka.ui.pages.connector;
 
 import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.utilities.WebUtils.clearByKeyboard;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
 
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
-import java.time.Duration;
-import java.util.Arrays;
 
-public class ConnectorDetails {
+public class ConnectorDetails extends BasePage {
 
-  protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
-  protected SelenideElement dotMenuBtn = $x("//button[@aria-label='Dropdown Toggle']");
   protected SelenideElement deleteBtn = $x("//li/div[contains(text(),'Delete')]");
   protected SelenideElement confirmBtnMdl = $x("//div[@role='dialog']//button[contains(text(),'Confirm')]");
-  protected SelenideElement submitBtn = $x("//button[@type='submit']");
   protected SelenideElement contentTextArea = $x("//textarea[@class='ace_text-input']");
   protected SelenideElement taskTab = $x("//a[contains(text(),'Tasks')]");
   protected SelenideElement configTab = $x("//a[contains(text(),'Config')]");
   protected SelenideElement configField = $x("//div[@id='config']");
-  protected SelenideElement successAlertMessage = $x("//div[contains(text(),'Config successfully updated')]");
   protected String connectorHeaderLocator = "//h1[contains(text(),'%s')]";
 
   @Step
   public ConnectorDetails waitUntilScreenReady() {
-    loadingSpinner.shouldBe(Condition.disappear);
+    waitUntilSpinnerDisappear();
     dotMenuBtn.shouldBe(Condition.visible);
     return this;
   }
@@ -49,8 +41,7 @@ public class ConnectorDetails {
 
     @Step
     public ConnectorDetails clickSubmitButton() {
-      clickByJavaScript(submitBtn);
-      successAlertMessage.shouldBe(Condition.visible);
+      clickSubmitBtn();
       return this;
     }
 
@@ -85,4 +76,9 @@ public class ConnectorDetails {
     public boolean isConnectorHeaderVisible(String connectorName) {
         return isVisible($x(String.format(connectorHeaderLocator,connectorName)));
     }
+
+    @Step
+    public boolean isAlertWithMessageVisible(AlertHeader header, String message){
+      return isAlertVisible(header, message);
+    }
 }

+ 12 - 20
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/KafkaConnectList.java

@@ -1,27 +1,27 @@
 package com.provectus.kafka.ui.pages.connector;
 
+import static com.codeborne.selenide.Selenide.$x;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.utilities.WaitUtils;
 import io.qameta.allure.Step;
 import lombok.experimental.ExtensionMethod;
-import org.openqa.selenium.By;
 
-import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
 
 @ExtensionMethod(WaitUtils.class)
-public class KafkaConnectList {
+public class KafkaConnectList extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
     protected SelenideElement createConnectorBtn = $x("//button[contains(text(),'Create Connector')]");
-    protected SelenideElement connectorsGrid = $x("//table");
-    protected String connectorNameLocator = "//td[contains(text(),'%s')]";
+
+    public KafkaConnectList(){
+        tableElementNameLocator = "//tbody//td[contains(text(),'%s')]";
+    }
 
     @Step
     public KafkaConnectList waitUntilScreenReady() {
-      loadingSpinner.shouldBe(Condition.disappear);
+      waitUntilSpinnerDisappear();
       createConnectorBtn.shouldBe(Condition.visible);
       return this;
     }
@@ -34,21 +34,13 @@ public class KafkaConnectList {
 
     @Step
     public KafkaConnectList openConnector(String connectorName) {
-        $x(String.format(connectorNameLocator, connectorName))
-                .shouldBe(Condition.enabled).click();
+      getTableElement(connectorName).shouldBe(Condition.enabled).click();
         return this;
     }
 
     @Step
     public boolean isConnectorVisible(String connectorName) {
-        connectorsGrid.shouldBe(Condition.visible);
-        return isVisible($x(String.format(connectorNameLocator,connectorName)));
-    }
-
-    @Step
-    public KafkaConnectList connectorIsUpdatedInList(String connectorName, String topicName) {
-        $x(String.format(connectorNameLocator,connectorName)).shouldBe(Condition.visible);
-        By.xpath(String.format(connectorNameLocator,topicName)).refreshUntil(Condition.visible);
-        return this;
+        tableGrid.shouldBe(Condition.visible);
+        return isVisible(getTableElement(connectorName));
     }
 }

+ 10 - 11
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumer/ConsumersDetails.java

@@ -1,32 +1,31 @@
 package com.provectus.kafka.ui.pages.consumer;
 
+import static com.codeborne.selenide.Selenide.$x;
+
 import com.codeborne.selenide.Condition;
-import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
-import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
-
-public class ConsumersDetails {
+public class ConsumersDetails extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
-    protected SelenideElement topicGrid = $x("//table");
     protected String consumerIdHeaderLocator = "//h1[contains(text(),'%s')]";
     protected String topicElementLocator = "//tbody//td//a[text()='%s']";
+
     @Step
     public ConsumersDetails waitUntilScreenReady() {
-        loadingSpinner.shouldBe(Condition.disappear);
-        topicGrid.shouldBe(Condition.visible);
+        waitUntilSpinnerDisappear();
+        tableGrid.shouldBe(Condition.visible);
         return this;
     }
+
     @Step
     public boolean isRedirectedConsumerTitleVisible(String consumerGroupId) {
         return isVisible($x(String.format(consumerIdHeaderLocator, consumerGroupId)));
     }
+
     @Step
     public boolean isTopicInConsumersDetailsVisible(String topicName) {
-        topicGrid.shouldBe(Condition.visible);
+        tableGrid.shouldBe(Condition.visible);
         return isVisible($x(String.format(topicElementLocator, topicName)));
     }
-
 }

+ 4 - 5
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumer/ConsumersList.java

@@ -1,11 +1,10 @@
 package com.provectus.kafka.ui.pages.consumer;
 
-import com.codeborne.selenide.SelenideElement;
-import com.provectus.kafka.ui.utilities.WaitUtils;
-import lombok.experimental.ExtensionMethod;
-
 import static com.codeborne.selenide.Selenide.$x;
-public class ConsumersList {
+
+import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
+public class ConsumersList extends BasePage {
 
     protected SelenideElement consumerListHeader = $x("//h1[text()='Consumers']");
 }

+ 8 - 11
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaCreateForm.java

@@ -1,23 +1,20 @@
 package com.provectus.kafka.ui.pages.schema;
 
+import static com.codeborne.selenide.Selenide.$;
+import static com.codeborne.selenide.Selenide.$x;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.api.model.CompatibilityLevel;
 import com.provectus.kafka.ui.api.model.SchemaType;
+import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
-import static com.codeborne.selenide.Selenide.$;
-import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.utilities.WebUtils.clearByKeyboard;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-
-public class SchemaCreateForm {
+public class SchemaCreateForm extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
     protected SelenideElement schemaNameField = $x("//input[@name='subject']");
     protected SelenideElement pageTitle = $x("//h1['Edit']");
     protected SelenideElement schemaTextArea = $x("//textarea[@name='schema']");
-    protected SelenideElement submitBtn = $x("//button[@type='submit']");
     protected SelenideElement newSchemaInput = $("#newSchema [wrap]");
     protected SelenideElement schemaTypeDdl = $x("//ul[@name='schemaType']");
     protected SelenideElement compatibilityLevelList = $x("//ul[@name='compatibilityLevel']");
@@ -26,7 +23,7 @@ public class SchemaCreateForm {
 
     @Step
     public SchemaCreateForm waitUntilScreenReady(){
-        loadingSpinner.shouldBe(Condition.disappear);
+        waitUntilSpinnerDisappear();
         pageTitle.shouldBe(Condition.visible);
         return this;
     }
@@ -51,8 +48,8 @@ public class SchemaCreateForm {
     }
 
     @Step
-    public SchemaCreateForm clickSubmitBtn() {
-        clickByJavaScript(submitBtn);
+    public SchemaCreateForm clickSubmitButton() {
+        clickSubmitBtn();
         return this;
     }
 

+ 5 - 9
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaDetails.java

@@ -1,18 +1,14 @@
 package com.provectus.kafka.ui.pages.schema;
 
+import static com.codeborne.selenide.Selenide.$x;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
-import static com.codeborne.selenide.Selenide.$$x;
-import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
-
-public class SchemaDetails {
+public class SchemaDetails extends BasePage {
 
-    protected SelenideElement dotMenuBtn = $$x("//button[@aria-label='Dropdown Toggle']").first();
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
     protected SelenideElement actualVersionTextArea = $x("//div[@id='schema']");
     protected SelenideElement compatibilityField = $x("//h4[contains(text(),'Compatibility')]/../p");
     protected SelenideElement editSchemaBtn = $x("//button[contains(text(),'Edit Schema')]");
@@ -23,7 +19,7 @@ public class SchemaDetails {
 
     @Step
     public SchemaDetails waitUntilScreenReady() {
-        loadingSpinner.shouldBe(Condition.disappear);
+        waitUntilSpinnerDisappear();
         actualVersionTextArea.shouldBe(Condition.visible);
         return this;
     }

+ 8 - 12
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaRegistryList.java

@@ -1,23 +1,19 @@
 package com.provectus.kafka.ui.pages.schema;
 
+import static com.codeborne.selenide.Selenide.$x;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
-import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
-
-public class SchemaRegistryList {
+public class SchemaRegistryList extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
     protected SelenideElement createSchemaBtn = $x("//button[contains(text(),'Create Schema')]");
-    protected SelenideElement schemaGrid = $x("//table");
-    protected String schemaTabElementLocator = "//a[contains(text(),'%s')]";
 
     @Step
     public SchemaRegistryList waitUntilScreenReady(){
-        loadingSpinner.shouldBe(Condition.disappear);
+        waitUntilSpinnerDisappear();
         createSchemaBtn.shouldBe(Condition.visible);
         return this;
     }
@@ -30,15 +26,15 @@ public class SchemaRegistryList {
 
     @Step
     public SchemaRegistryList openSchema(String schemaName) {
-        $x(String.format(schemaTabElementLocator,schemaName))
+        getTableElement(schemaName)
                 .shouldBe(Condition.enabled).click();
         return this;
     }
 
     @Step
     public boolean isSchemaVisible(String schemaName) {
-        schemaGrid.shouldBe(Condition.visible);
-        return isVisible($x(String.format(schemaTabElementLocator,schemaName)));
+        tableGrid.shouldBe(Condition.visible);
+        return isVisible(getTableElement(schemaName));
     }
 }
 

+ 6 - 8
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/ProduceMessagePanel.java

@@ -1,18 +1,16 @@
 package com.provectus.kafka.ui.pages.topic;
 
+import static com.codeborne.selenide.Selenide.$x;
+import static com.codeborne.selenide.Selenide.refresh;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
-
 import java.util.Arrays;
 
-import static com.codeborne.selenide.Selenide.$x;
-import static com.codeborne.selenide.Selenide.refresh;
-import static com.provectus.kafka.ui.utilities.WebUtils.clearByKeyboard;
-
-public class ProduceMessagePanel {
+public class ProduceMessagePanel extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
     protected SelenideElement keyTextArea = $x("//div[@id='key']/textarea");
     protected SelenideElement contentTextArea = $x("//div[@id='content']/textarea");
     protected SelenideElement headersTextArea = $x("//div[@id='headers']/textarea");
@@ -23,7 +21,7 @@ public class ProduceMessagePanel {
 
     @Step
     public ProduceMessagePanel waitUntilScreenReady(){
-        loadingSpinner.shouldBe(Condition.disappear);
+        waitUntilSpinnerDisappear();
         Arrays.asList(partitionDdl, keySerdeDdl, contentSerdeDdl).forEach(element -> element.shouldBe(Condition.visible));
         return this;
     }

+ 5 - 10
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicCreateEditForm.java

@@ -3,24 +3,20 @@ package com.provectus.kafka.ui.pages.topic;
 import static com.codeborne.selenide.Selenide.$;
 import static com.codeborne.selenide.Selenide.$$;
 import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.utilities.WebUtils.clearByKeyboard;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-import static com.provectus.kafka.ui.utilities.WebUtils.isEnabled;
-import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import com.codeborne.selenide.ClickOptions;
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.ElementsCollection;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.pages.topic.enums.CleanupPolicyValue;
 import com.provectus.kafka.ui.pages.topic.enums.CustomParameterType;
 import com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk;
 import io.qameta.allure.Step;
 
-public class TopicCreateEditForm {
+public class TopicCreateEditForm extends BasePage {
 
-  protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
   protected SelenideElement timeToRetainField = $x("//input[@id='timeToRetain']");
   protected SelenideElement partitionsField = $x("//input[@name='partitions']");
   protected SelenideElement nameField = $x("//input[@name='name']");
@@ -29,7 +25,6 @@ public class TopicCreateEditForm {
   protected SelenideElement cleanUpPolicyDdl = $x("//ul[@id='topicFormCleanupPolicy']");
   protected SelenideElement maxSizeOnDiscDdl = $x("//ul[@id='topicFormRetentionBytes']");
   protected SelenideElement customParameterDdl = $x("//ul[contains(@name,'customParams')]");
-  protected SelenideElement createTopicBtn = $x("//button[@type='submit']");
   protected SelenideElement deleteCustomParameterBtn = $x("//span[contains(@title,'Delete customParam')]");
   protected SelenideElement addCustomParameterTypeBtn = $x("//button[contains(text(),'Add Custom Parameter')]");
   protected SelenideElement customParameterValueField = $x("//input[@placeholder='Value']");
@@ -38,13 +33,13 @@ public class TopicCreateEditForm {
 
   @Step
   public TopicCreateEditForm waitUntilScreenReady() {
-    loadingSpinner.shouldBe(Condition.disappear);
+    waitUntilSpinnerDisappear();
     nameField.shouldBe(Condition.visible);
     return this;
   }
 
   public boolean isCreateTopicButtonEnabled() {
-    return isEnabled(createTopicBtn);
+    return isEnabled(submitBtn);
   }
 
   public boolean isDeleteCustomParameterButtonEnabled() {
@@ -148,7 +143,7 @@ public class TopicCreateEditForm {
 
   @Step
   public TopicCreateEditForm clickCreateTopicBtn() {
-    clickByJavaScript(createTopicBtn);
+    clickSubmitBtn();
     return this;
   }
 

+ 7 - 10
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicDetails.java

@@ -1,23 +1,20 @@
 package com.provectus.kafka.ui.pages.topic;
 
+import static com.codeborne.selenide.Selenide.$;
+import static com.codeborne.selenide.Selenide.$x;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.utilities.WaitUtils;
 import io.qameta.allure.Step;
+import java.util.Arrays;
 import lombok.experimental.ExtensionMethod;
 import org.openqa.selenium.By;
 
-import java.util.Arrays;
-
-import static com.codeborne.selenide.Selenide.*;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
-
 @ExtensionMethod({WaitUtils.class})
-public class TopicDetails {
+public class TopicDetails extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
-    protected SelenideElement dotMenuBtn = $$x("//button[@aria-label='Dropdown Toggle']").first();
     protected SelenideElement clearMessagesBtn = $x(("//div[contains(text(), 'Clear messages')]"));
     protected SelenideElement overviewTab = $x("//a[contains(text(),'Overview')]");
     protected SelenideElement messagesTab = $x("//a[contains(text(),'Messages')]");
@@ -33,7 +30,7 @@ public class TopicDetails {
 
     @Step
     public TopicDetails waitUntilScreenReady() {
-        loadingSpinner.shouldBe(Condition.disappear);
+        waitUntilSpinnerDisappear();
         Arrays.asList(overviewTab,messagesTab).forEach(element -> element.shouldBe(Condition.visible));
         return this;
     }

+ 8 - 15
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicsList.java

@@ -1,29 +1,23 @@
 package com.provectus.kafka.ui.pages.topic;
 
+import static com.codeborne.selenide.Selenide.$x;
+
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.utilities.WaitUtils;
 import io.qameta.allure.Step;
 import lombok.experimental.ExtensionMethod;
-import org.openqa.selenium.By;
-
-import static com.codeborne.selenide.Selenide.$;
-import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.utilities.WebUtils.clickByJavaScript;
-import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
 
 @ExtensionMethod(WaitUtils.class)
-public class TopicsList {
+public class TopicsList extends BasePage {
 
-    protected SelenideElement loadingSpinner = $x("//*[contains(text(),'Loading')]");
     protected SelenideElement topicListHeader = $x("//h1[text()='Topics']");
     protected SelenideElement addTopicBtn = $x("//button[normalize-space(text()) ='Add a Topic']");
-    protected SelenideElement topicGrid = $x("//table");
-    protected String topicElementLocator = "//tbody//td//a[text()='%s']";
 
     @Step
     public TopicsList waitUntilScreenReady() {
-        loadingSpinner.shouldBe(Condition.disappear);
+        waitUntilSpinnerDisappear();
         topicListHeader.shouldBe(Condition.visible);
         return this;
     }
@@ -36,14 +30,13 @@ public class TopicsList {
 
     @Step
     public boolean isTopicVisible(String topicName) {
-        topicGrid.shouldBe(Condition.visible);
-        return isVisible($x(String.format(topicElementLocator,topicName)));
+        tableGrid.shouldBe(Condition.visible);
+        return isVisible(getTableElement(topicName));
     }
 
     @Step
     public TopicsList openTopic(String topicName) {
-        $(By.linkText(topicName))
-                .shouldBe(Condition.enabled).click();
+        getTableElement(topicName).shouldBe(Condition.enabled).click();
         return this;
     }
 }

+ 13 - 7
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/tests/ConnectorsTests.java

@@ -1,5 +1,11 @@
 package com.provectus.kafka.ui.tests;
 
+import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
+import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.KAFKA_CONNECT;
+import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
+import static com.provectus.kafka.ui.utilities.FileUtils.getResourceAsString;
+import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
+
 import com.provectus.kafka.ui.base.BaseTest;
 import com.provectus.kafka.ui.models.Connector;
 import com.provectus.kafka.ui.models.Topic;
@@ -7,15 +13,14 @@ import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus
 import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
 import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
 import io.qase.api.annotation.CaseId;
-import org.junit.jupiter.api.*;
-
 import java.util.ArrayList;
 import java.util.List;
-
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.KAFKA_CONNECT;
-import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
-import static com.provectus.kafka.ui.utilities.FileUtils.getResourceAsString;
-import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
 
 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
 public class ConnectorsTests extends BaseTest {
@@ -106,6 +111,7 @@ public class ConnectorsTests extends BaseTest {
                 .openConfigTab()
                 .setConfig(CONNECTOR_FOR_UPDATE.getConfig())
                 .clickSubmitButton();
+        Assertions.assertTrue(connectorDetails.isAlertWithMessageVisible(SUCCESS,"Config successfully updated."),"isAlertWithMessageVisible()");
         naviSideBar
                 .openSideMenu(KAFKA_CONNECT);
         kafkaConnectList

+ 19 - 12
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/tests/SchemasTests.java

@@ -1,5 +1,9 @@
 package com.provectus.kafka.ui.tests;
 
+import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.SCHEMA_REGISTRY;
+import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
+import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
+
 import com.provectus.kafka.ui.api.model.CompatibilityLevel;
 import com.provectus.kafka.ui.base.BaseTest;
 import com.provectus.kafka.ui.models.Schema;
@@ -7,16 +11,19 @@ import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus
 import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
 import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
 import io.qase.api.annotation.CaseId;
-import lombok.SneakyThrows;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.*;
-
 import java.util.ArrayList;
 import java.util.List;
-
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.SCHEMA_REGISTRY;
-import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
-import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
+import lombok.SneakyThrows;
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.TestMethodOrder;
 
 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@@ -52,7 +59,7 @@ public class SchemasTests extends BaseTest {
                 .setSubjectName(schemaAvro.getName())
                 .setSchemaField(fileToString(schemaAvro.getValuePath()))
                 .selectSchemaTypeFromDropdown(schemaAvro.getType())
-                .clickSubmitBtn();
+                .clickSubmitButton();
         schemaDetails
                 .waitUntilScreenReady();
         SoftAssertions softly = new SoftAssertions();
@@ -90,7 +97,7 @@ public class SchemasTests extends BaseTest {
         schemaCreateForm
                 .selectCompatibilityLevelFromDropdown(CompatibilityLevel.CompatibilityEnum.NONE)
                 .setNewSchemaValue(fileToString(AVRO_API.getValuePath()))
-                .clickSubmitBtn();
+                .clickSubmitButton();
         schemaDetails
                 .waitUntilScreenReady();
         Assertions.assertEquals(CompatibilityLevel.CompatibilityEnum.NONE.toString(), schemaDetails.getCompatibility(), "getCompatibility()");
@@ -134,7 +141,7 @@ public class SchemasTests extends BaseTest {
                 .setSubjectName(schemaJson.getName())
                 .setSchemaField(fileToString(schemaJson.getValuePath()))
                 .selectSchemaTypeFromDropdown(schemaJson.getType())
-                .clickSubmitBtn();
+                .clickSubmitButton();
         schemaDetails
                 .waitUntilScreenReady();
         SoftAssertions softly = new SoftAssertions();
@@ -188,7 +195,7 @@ public class SchemasTests extends BaseTest {
                 .setSubjectName(schemaProtobuf.getName())
                 .setSchemaField(fileToString(schemaProtobuf.getValuePath()))
                 .selectSchemaTypeFromDropdown(schemaProtobuf.getType())
-                .clickSubmitBtn();
+                .clickSubmitButton();
         schemaDetails
                 .waitUntilScreenReady();
         SoftAssertions softly = new SoftAssertions();