From 97c58a29e0561db9f19e4825b7df2910b0cca3be Mon Sep 17 00:00:00 2001 From: spawn Date: Tue, 21 Apr 2026 03:03:45 +0300 Subject: [PATCH] Align page objects and DI with review comments --- .../component/AlertDialogComponent.java | 12 +--- .../component/BottomNavigationComponent.java | 15 +--- .../mobile/component/GiftFormComponent.java | 18 +---- .../mobile/component/GiftItemComponent.java | 6 +- .../component/GiftsContentComponent.java | 11 +-- .../mobile/component/TopBarComponent.java | 20 +----- .../mobile/component/UserItemComponent.java | 3 +- .../component/UsersContentComponent.java | 11 +-- .../component/UsersFilterComponent.java | 31 ++------- .../component/WishlistFormComponent.java | 15 +--- .../component/WishlistItemComponent.java | 6 +- .../component/WishlistsContentComponent.java | 11 +-- .../ru/otus/mobile/config/ProjectPaths.java | 5 ++ .../ru/otus/mobile/driver/EmulatorQueue.java | 4 ++ .../otus/mobile/driver/LogcatCollector.java | 4 ++ .../mobile/driver/MobileDriverFactory.java | 7 ++ .../java/ru/otus/mobile/guice/CoreModule.java | 32 --------- .../java/ru/otus/mobile/page/AbsBasePage.java | 7 +- .../ru/otus/mobile/page/AbsPageObject.java | 16 ----- .../java/ru/otus/mobile/page/GiftsPage.java | 33 ++++----- .../java/ru/otus/mobile/page/LoginPage.java | 27 +++++--- .../java/ru/otus/mobile/page/UsersPage.java | 68 +++++++------------ .../ru/otus/mobile/page/WishlistsPage.java | 52 ++++---------- 23 files changed, 137 insertions(+), 277 deletions(-) diff --git a/src/main/java/ru/otus/mobile/component/AlertDialogComponent.java b/src/main/java/ru/otus/mobile/component/AlertDialogComponent.java index 4e07274..d1f03d1 100644 --- a/src/main/java/ru/otus/mobile/component/AlertDialogComponent.java +++ b/src/main/java/ru/otus/mobile/component/AlertDialogComponent.java @@ -1,22 +1,12 @@ package ru.otus.mobile.component; import com.codeborne.selenide.SelenideElement; -import com.google.inject.Inject; -import io.appium.java_client.AppiumBy; - -import static com.codeborne.selenide.appium.SelenideAppium.$; public final class AlertDialogComponent extends BaseMobileComponent { - private final SelenideElement positiveButton; - - @Inject - public AlertDialogComponent() { - this($(AppiumBy.id("android:id/content"))); - } + private final SelenideElement positiveButton = byIdInRoot("android:id/button1"); public AlertDialogComponent(SelenideElement root) { super(root); - this.positiveButton = byIdInRoot("android:id/button1"); } public void acceptIfVisible() { diff --git a/src/main/java/ru/otus/mobile/component/BottomNavigationComponent.java b/src/main/java/ru/otus/mobile/component/BottomNavigationComponent.java index fc60018..c894edd 100644 --- a/src/main/java/ru/otus/mobile/component/BottomNavigationComponent.java +++ b/src/main/java/ru/otus/mobile/component/BottomNavigationComponent.java @@ -1,24 +1,13 @@ package ru.otus.mobile.component; import com.codeborne.selenide.SelenideElement; -import com.google.inject.Inject; -import io.appium.java_client.AppiumBy; - -import static com.codeborne.selenide.appium.SelenideAppium.$; public final class BottomNavigationComponent extends BaseMobileComponent { - private final SelenideElement mineMenu; - private final SelenideElement usersMenu; - - @Inject - public BottomNavigationComponent() { - this($(AppiumBy.id(fullIdValue("bottom_navigation")))); - } + private final SelenideElement mineMenu = byIdInRoot("mine_menu"); + private final SelenideElement usersMenu = byIdInRoot("users_menu"); public BottomNavigationComponent(SelenideElement root) { super(root); - this.mineMenu = byIdInRoot("mine_menu"); - this.usersMenu = byIdInRoot("users_menu"); } public void openWishlists() { diff --git a/src/main/java/ru/otus/mobile/component/GiftFormComponent.java b/src/main/java/ru/otus/mobile/component/GiftFormComponent.java index 7976509..979c706 100644 --- a/src/main/java/ru/otus/mobile/component/GiftFormComponent.java +++ b/src/main/java/ru/otus/mobile/component/GiftFormComponent.java @@ -1,26 +1,14 @@ package ru.otus.mobile.component; import com.codeborne.selenide.SelenideElement; -import com.google.inject.Inject; -import io.appium.java_client.AppiumBy; - -import static com.codeborne.selenide.appium.SelenideAppium.$; public final class GiftFormComponent extends BaseMobileComponent { - private final SelenideElement nameInput; - private final SelenideElement priceInput; - private final SelenideElement saveButton; - - @Inject - public GiftFormComponent() { - this($(AppiumBy.id("android:id/content"))); - } + private final SelenideElement nameInput = byIdInRoot("name_input"); + private final SelenideElement priceInput = byIdInRoot("price_input"); + private final SelenideElement saveButton = byIdInRoot("save_button"); public GiftFormComponent(SelenideElement root) { super(root); - this.nameInput = byIdInRoot("name_input"); - this.priceInput = byIdInRoot("price_input"); - this.saveButton = byIdInRoot("save_button"); } public void save(String name, String price) { diff --git a/src/main/java/ru/otus/mobile/component/GiftItemComponent.java b/src/main/java/ru/otus/mobile/component/GiftItemComponent.java index 3a217a1..850a65b 100644 --- a/src/main/java/ru/otus/mobile/component/GiftItemComponent.java +++ b/src/main/java/ru/otus/mobile/component/GiftItemComponent.java @@ -5,13 +5,11 @@ import com.codeborne.selenide.SelenideElement; import static com.codeborne.selenide.Condition.text; public final class GiftItemComponent extends BaseMobileComponent { - private final SelenideElement title; - private final SelenideElement editButton; + private final SelenideElement title = byIdInRoot("title"); + private final SelenideElement editButton = byIdInRoot("edit_button"); public GiftItemComponent(SelenideElement root) { super(root); - this.title = byIdInRoot("title"); - this.editButton = byIdInRoot("edit_button"); } public String titleText() { diff --git a/src/main/java/ru/otus/mobile/component/GiftsContentComponent.java b/src/main/java/ru/otus/mobile/component/GiftsContentComponent.java index 1ada6d5..c94f508 100644 --- a/src/main/java/ru/otus/mobile/component/GiftsContentComponent.java +++ b/src/main/java/ru/otus/mobile/component/GiftsContentComponent.java @@ -1,19 +1,21 @@ package ru.otus.mobile.component; +import com.codeborne.selenide.CollectionCondition; +import com.codeborne.selenide.Condition; import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; -import io.appium.java_client.AppiumBy; + +import java.time.Duration; public final class GiftsContentComponent extends BaseMobileComponent { - private final ElementsCollection items; + private final ElementsCollection items = allByIdInRoot("gift_item"); public GiftsContentComponent(SelenideElement root) { super(root); - this.items = root.$$(AppiumBy.id(fullIdValue("gift_item"))); } public GiftItemComponent get(int index) { - return new GiftItemComponent(items.get(index)); + return new GiftItemComponent(items.get(index).shouldBe(Condition.visible, Duration.ofSeconds(15))); } public GiftItemComponent first() { @@ -21,6 +23,7 @@ public final class GiftsContentComponent extends BaseMobileComponent { } public GiftItemComponent byTitle(String title) { + items.shouldHave(CollectionCondition.sizeGreaterThan(0), Duration.ofSeconds(15)); for (int i = 0; i < items.size(); i++) { GiftItemComponent item = get(i); if (title.equals(item.titleText())) { diff --git a/src/main/java/ru/otus/mobile/component/TopBarComponent.java b/src/main/java/ru/otus/mobile/component/TopBarComponent.java index ad2abda..f69083a 100644 --- a/src/main/java/ru/otus/mobile/component/TopBarComponent.java +++ b/src/main/java/ru/otus/mobile/component/TopBarComponent.java @@ -3,27 +3,13 @@ package ru.otus.mobile.component; import com.codeborne.selenide.SelenideElement; public final class TopBarComponent extends BaseMobileComponent { + private final SelenideElement filterButton = byIdInRoot("filter"); + public TopBarComponent(SelenideElement root) { super(root); } public void openUsersFilter() { - if (byId("filter").exists()) { - byId("filter").click(); - return; - } - if (byId("users_filter").exists()) { - byId("users_filter").click(); - return; - } - if (byId("filter_button").exists()) { - byId("filter_button").click(); - return; - } - if (byId("action_filter").exists()) { - byId("action_filter").click(); - return; - } - throw new IllegalStateException("Filter button was not found on Users screen."); + filterButton.click(); } } diff --git a/src/main/java/ru/otus/mobile/component/UserItemComponent.java b/src/main/java/ru/otus/mobile/component/UserItemComponent.java index 50d9e8d..ae7bc66 100644 --- a/src/main/java/ru/otus/mobile/component/UserItemComponent.java +++ b/src/main/java/ru/otus/mobile/component/UserItemComponent.java @@ -3,11 +3,10 @@ package ru.otus.mobile.component; import com.codeborne.selenide.SelenideElement; public final class UserItemComponent extends BaseMobileComponent { - private final SelenideElement username; + private final SelenideElement username = byIdInRoot("username"); public UserItemComponent(SelenideElement root) { super(root); - this.username = byIdInRoot("username"); } public String usernameText() { diff --git a/src/main/java/ru/otus/mobile/component/UsersContentComponent.java b/src/main/java/ru/otus/mobile/component/UsersContentComponent.java index 75f79e7..2c57579 100644 --- a/src/main/java/ru/otus/mobile/component/UsersContentComponent.java +++ b/src/main/java/ru/otus/mobile/component/UsersContentComponent.java @@ -1,19 +1,21 @@ package ru.otus.mobile.component; +import com.codeborne.selenide.CollectionCondition; +import com.codeborne.selenide.Condition; import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; -import io.appium.java_client.AppiumBy; + +import java.time.Duration; public final class UsersContentComponent extends BaseMobileComponent { - private final ElementsCollection items; + private final ElementsCollection items = allByIdInRoot("user_item"); public UsersContentComponent(SelenideElement root) { super(root); - this.items = root.$$(AppiumBy.id(fullIdValue("user_item"))); } public UserItemComponent get(int index) { - return new UserItemComponent(items.get(index)); + return new UserItemComponent(items.get(index).shouldBe(Condition.visible, Duration.ofSeconds(15))); } public UserItemComponent first() { @@ -21,6 +23,7 @@ public final class UsersContentComponent extends BaseMobileComponent { } public UserItemComponent byUsername(String username) { + items.shouldHave(CollectionCondition.sizeGreaterThan(0), Duration.ofSeconds(15)); for (int i = 0; i < items.size(); i++) { UserItemComponent item = get(i); if (username.equals(item.usernameText())) { diff --git a/src/main/java/ru/otus/mobile/component/UsersFilterComponent.java b/src/main/java/ru/otus/mobile/component/UsersFilterComponent.java index 5117f3c..059045e 100644 --- a/src/main/java/ru/otus/mobile/component/UsersFilterComponent.java +++ b/src/main/java/ru/otus/mobile/component/UsersFilterComponent.java @@ -3,36 +3,17 @@ package ru.otus.mobile.component; import com.codeborne.selenide.SelenideElement; public final class UsersFilterComponent extends BaseMobileComponent { + private final SelenideElement usernameInput = byIdInRoot("username_input"); + private final SelenideElement applyButton = byIdInRoot("apply_button"); + public UsersFilterComponent(SelenideElement root) { super(root); } public void applyByUsername(String username) { - SelenideElement filterInput = filterInput(); - SelenideElement applyButton = applyButton(); - filterInput.click(); - filterInput.clear(); - filterInput.sendKeys(username); + usernameInput.click(); + usernameInput.clear(); + usernameInput.sendKeys(username); applyButton.click(); } - - private SelenideElement filterInput() { - if (byIdInRoot("username_input").exists()) { - return byIdInRoot("username_input"); - } - if (byIdInRoot("filter_input").exists()) { - return byIdInRoot("filter_input"); - } - if (byIdInRoot("users_filter_input").exists()) { - return byIdInRoot("users_filter_input"); - } - return byIdInRoot("username_filter_input"); - } - - private SelenideElement applyButton() { - if (byIdInRoot("apply_button").exists()) { - return byIdInRoot("apply_button"); - } - return byIdInRoot("apply"); - } } diff --git a/src/main/java/ru/otus/mobile/component/WishlistFormComponent.java b/src/main/java/ru/otus/mobile/component/WishlistFormComponent.java index 8f0f7cb..5fc1afe 100644 --- a/src/main/java/ru/otus/mobile/component/WishlistFormComponent.java +++ b/src/main/java/ru/otus/mobile/component/WishlistFormComponent.java @@ -1,24 +1,13 @@ package ru.otus.mobile.component; import com.codeborne.selenide.SelenideElement; -import com.google.inject.Inject; -import io.appium.java_client.AppiumBy; - -import static com.codeborne.selenide.appium.SelenideAppium.$; public final class WishlistFormComponent extends BaseMobileComponent { - private final SelenideElement titleInput; - private final SelenideElement saveButton; - - @Inject - public WishlistFormComponent() { - this($(AppiumBy.id("android:id/content"))); - } + private final SelenideElement titleInput = byIdInRoot("title_input"); + private final SelenideElement saveButton = byIdInRoot("save_button"); public WishlistFormComponent(SelenideElement root) { super(root); - this.titleInput = byIdInRoot("title_input"); - this.saveButton = byIdInRoot("save_button"); } public void save(String title) { diff --git a/src/main/java/ru/otus/mobile/component/WishlistItemComponent.java b/src/main/java/ru/otus/mobile/component/WishlistItemComponent.java index f6f5412..827f063 100644 --- a/src/main/java/ru/otus/mobile/component/WishlistItemComponent.java +++ b/src/main/java/ru/otus/mobile/component/WishlistItemComponent.java @@ -5,13 +5,11 @@ import com.codeborne.selenide.SelenideElement; import static com.codeborne.selenide.Condition.text; public final class WishlistItemComponent extends BaseMobileComponent { - private final SelenideElement title; - private final SelenideElement editButton; + private final SelenideElement title = byIdInRoot("title"); + private final SelenideElement editButton = byIdInRoot("edit_button"); public WishlistItemComponent(SelenideElement root) { super(root); - this.title = byIdInRoot("title"); - this.editButton = byIdInRoot("edit_button"); } public String titleText() { diff --git a/src/main/java/ru/otus/mobile/component/WishlistsContentComponent.java b/src/main/java/ru/otus/mobile/component/WishlistsContentComponent.java index e2a8037..b0aa86e 100644 --- a/src/main/java/ru/otus/mobile/component/WishlistsContentComponent.java +++ b/src/main/java/ru/otus/mobile/component/WishlistsContentComponent.java @@ -1,19 +1,21 @@ package ru.otus.mobile.component; +import com.codeborne.selenide.CollectionCondition; +import com.codeborne.selenide.Condition; import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; -import io.appium.java_client.AppiumBy; + +import java.time.Duration; public final class WishlistsContentComponent extends BaseMobileComponent { - private final ElementsCollection items; + private final ElementsCollection items = allByIdInRoot("wishlist_item"); public WishlistsContentComponent(SelenideElement root) { super(root); - this.items = root.$$(AppiumBy.id(fullIdValue("wishlist_item"))); } public WishlistItemComponent get(int index) { - return new WishlistItemComponent(items.get(index)); + return new WishlistItemComponent(items.get(index).shouldBe(Condition.visible, Duration.ofSeconds(15))); } public WishlistItemComponent first() { @@ -21,6 +23,7 @@ public final class WishlistsContentComponent extends BaseMobileComponent { } public WishlistItemComponent byTitle(String title) { + items.shouldHave(CollectionCondition.sizeGreaterThan(0), Duration.ofSeconds(15)); for (int i = 0; i < items.size(); i++) { WishlistItemComponent item = get(i); if (title.equals(item.titleText())) { diff --git a/src/main/java/ru/otus/mobile/config/ProjectPaths.java b/src/main/java/ru/otus/mobile/config/ProjectPaths.java index ff21ee7..46f042e 100644 --- a/src/main/java/ru/otus/mobile/config/ProjectPaths.java +++ b/src/main/java/ru/otus/mobile/config/ProjectPaths.java @@ -1,11 +1,16 @@ package ru.otus.mobile.config; +import com.google.inject.Inject; +import com.google.inject.Singleton; + import java.nio.file.Path; import java.nio.file.Paths; +@Singleton public final class ProjectPaths { private final Path logcatFile; + @Inject public ProjectPaths() { this.logcatFile = Paths.get("").toAbsolutePath().normalize().resolve("logcat.txt"); } diff --git a/src/main/java/ru/otus/mobile/driver/EmulatorQueue.java b/src/main/java/ru/otus/mobile/driver/EmulatorQueue.java index ce1aa51..04d40f4 100644 --- a/src/main/java/ru/otus/mobile/driver/EmulatorQueue.java +++ b/src/main/java/ru/otus/mobile/driver/EmulatorQueue.java @@ -1,13 +1,17 @@ package ru.otus.mobile.driver; +import com.google.inject.Inject; +import com.google.inject.Singleton; import ru.otus.mobile.config.MobileConfig; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +@Singleton public final class EmulatorQueue { private final BlockingQueue queue; + @Inject public EmulatorQueue(MobileConfig config) { this.queue = new LinkedBlockingQueue<>(config.emulators()); } diff --git a/src/main/java/ru/otus/mobile/driver/LogcatCollector.java b/src/main/java/ru/otus/mobile/driver/LogcatCollector.java index 4d2b3b9..e376375 100644 --- a/src/main/java/ru/otus/mobile/driver/LogcatCollector.java +++ b/src/main/java/ru/otus/mobile/driver/LogcatCollector.java @@ -1,5 +1,7 @@ package ru.otus.mobile.driver; +import com.google.inject.Inject; +import com.google.inject.Singleton; import io.appium.java_client.android.AndroidDriver; import org.openqa.selenium.logging.LogEntries; import org.openqa.selenium.logging.LogEntry; @@ -11,9 +13,11 @@ import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.time.Instant; +@Singleton public final class LogcatCollector { private final ProjectPaths projectPaths; + @Inject public LogcatCollector(ProjectPaths projectPaths) { this.projectPaths = projectPaths; } diff --git a/src/main/java/ru/otus/mobile/driver/MobileDriverFactory.java b/src/main/java/ru/otus/mobile/driver/MobileDriverFactory.java index d770d9f..9996b60 100644 --- a/src/main/java/ru/otus/mobile/driver/MobileDriverFactory.java +++ b/src/main/java/ru/otus/mobile/driver/MobileDriverFactory.java @@ -1,5 +1,7 @@ package ru.otus.mobile.driver; +import com.google.inject.Inject; +import com.google.inject.Singleton; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.options.UiAutomator2Options; import ru.otus.mobile.config.MobileConfig; @@ -7,7 +9,12 @@ import ru.otus.mobile.config.MobileConfig; import java.net.MalformedURLException; import java.net.URI; +@Singleton public final class MobileDriverFactory { + @Inject + public MobileDriverFactory() { + } + public AndroidDriver create(MobileConfig.Emulator emulator) { UiAutomator2Options options = new UiAutomator2Options() .setPlatformName("Android") diff --git a/src/main/java/ru/otus/mobile/guice/CoreModule.java b/src/main/java/ru/otus/mobile/guice/CoreModule.java index 474bb15..b5bea3f 100644 --- a/src/main/java/ru/otus/mobile/guice/CoreModule.java +++ b/src/main/java/ru/otus/mobile/guice/CoreModule.java @@ -4,21 +4,13 @@ import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; import ru.otus.mobile.config.MobileConfig; -import ru.otus.mobile.config.ProjectPaths; import ru.otus.mobile.config.TestEmulator; import ru.otus.mobile.db.DbConfig; -import ru.otus.mobile.driver.EmulatorQueue; -import ru.otus.mobile.driver.LogcatCollector; -import ru.otus.mobile.driver.MobileDriverFactory; import java.util.Arrays; import java.util.List; public final class CoreModule extends AbstractModule { - @Override - protected void configure() { - } - @Provides @Singleton MobileConfig mobileConfig() { @@ -31,12 +23,6 @@ public final class CoreModule extends AbstractModule { return new MobileConfig(appPackage, appUrl, appiumHost, emulators); } - @Provides - @Singleton - ProjectPaths projectPaths() { - return new ProjectPaths(); - } - @Provides @Singleton DbConfig dbConfig() { @@ -46,24 +32,6 @@ public final class CoreModule extends AbstractModule { return new DbConfig(url, user, password); } - @Provides - @Singleton - EmulatorQueue emulatorQueue(MobileConfig config) { - return new EmulatorQueue(config); - } - - @Provides - @Singleton - MobileDriverFactory mobileDriverFactory() { - return new MobileDriverFactory(); - } - - @Provides - @Singleton - LogcatCollector logcatCollector(ProjectPaths projectPaths) { - return new LogcatCollector(projectPaths); - } - private String requiredValue(String property, String env) { String value = value(property, env, null); if (value == null) { diff --git a/src/main/java/ru/otus/mobile/page/AbsBasePage.java b/src/main/java/ru/otus/mobile/page/AbsBasePage.java index 62801be..5c19028 100644 --- a/src/main/java/ru/otus/mobile/page/AbsBasePage.java +++ b/src/main/java/ru/otus/mobile/page/AbsBasePage.java @@ -3,9 +3,6 @@ package ru.otus.mobile.page; import ru.otus.mobile.component.BottomNavigationComponent; public abstract class AbsBasePage extends AbsPageObject { - protected final BottomNavigationComponent bottomNavigation; - - protected AbsBasePage(BottomNavigationComponent bottomNavigation) { - this.bottomNavigation = bottomNavigation; - } + protected final BottomNavigationComponent bottomNavigation = + new BottomNavigationComponent(byId("bottom_navigation")); } diff --git a/src/main/java/ru/otus/mobile/page/AbsPageObject.java b/src/main/java/ru/otus/mobile/page/AbsPageObject.java index f12bebd..e8ba4a2 100644 --- a/src/main/java/ru/otus/mobile/page/AbsPageObject.java +++ b/src/main/java/ru/otus/mobile/page/AbsPageObject.java @@ -1,6 +1,5 @@ package ru.otus.mobile.page; -import com.codeborne.selenide.Condition; import com.codeborne.selenide.SelenideElement; import com.codeborne.selenide.WebDriverRunner; import com.codeborne.selenide.appium.SelenideAppiumCollection; @@ -21,21 +20,6 @@ public abstract class AbsPageObject { return $$(AppiumBy.id(fullIdValue(id))); } - protected void type(String id, String value) { - SelenideElement input = byId(id).shouldBe(Condition.visible); - input.click(); - input.clear(); - input.sendKeys(value); - } - - protected void tap(String id) { - byId(id).shouldBe(Condition.visible).click(); - } - - protected boolean exists(String id) { - return byId(id).exists(); - } - protected void back() { WebDriverRunner.getWebDriver().navigate().back(); } diff --git a/src/main/java/ru/otus/mobile/page/GiftsPage.java b/src/main/java/ru/otus/mobile/page/GiftsPage.java index ac09161..d895ca7 100644 --- a/src/main/java/ru/otus/mobile/page/GiftsPage.java +++ b/src/main/java/ru/otus/mobile/page/GiftsPage.java @@ -1,41 +1,38 @@ package ru.otus.mobile.page; import com.codeborne.selenide.Condition; -import com.google.inject.Inject; -import ru.otus.mobile.component.BottomNavigationComponent; -import ru.otus.mobile.component.GiftsContentComponent; +import com.codeborne.selenide.SelenideElement; +import com.google.inject.Singleton; import ru.otus.mobile.component.GiftFormComponent; +import ru.otus.mobile.component.GiftsContentComponent; +@Singleton public final class GiftsPage extends AbsBasePage { - private final GiftFormComponent form; - private final com.codeborne.selenide.SelenideElement addButton = byId("add_button"); - - @Inject - public GiftsPage(BottomNavigationComponent bottomNavigation, GiftFormComponent form) { - super(bottomNavigation); - this.form = form; - } + private final SelenideElement giftsContentRoot = byId("gifts_content"); + private final SelenideElement addButton = byId("add_button"); + private final SelenideElement formRoot = byId("gift_edit_bottom_sheet"); + private final GiftsContentComponent content = new GiftsContentComponent(giftsContentRoot); + private final GiftFormComponent form = new GiftFormComponent(formRoot); public void createGift(String name) { addButton.click(); form.save(name, "100"); + giftsContentRoot.shouldBe(Condition.visible); } public void editGift(String oldName, String newName) { openGift(oldName); - content().byTitle(oldName).edit(); + content.byTitle(oldName).edit(); form.save(newName, "100"); + giftsContentRoot.shouldBe(Condition.visible); } public void shouldSeeGift(String name) { - content().byTitle(name).shouldHaveTitle(name); + giftsContentRoot.shouldBe(Condition.visible); + content.byTitle(name).shouldHaveTitle(name); } private void openGift(String name) { - content().byTitle(name).open(); - } - - private GiftsContentComponent content() { - return new GiftsContentComponent(byId("gifts_content")); + content.byTitle(name).open(); } } diff --git a/src/main/java/ru/otus/mobile/page/LoginPage.java b/src/main/java/ru/otus/mobile/page/LoginPage.java index 6377ff3..84072a4 100644 --- a/src/main/java/ru/otus/mobile/page/LoginPage.java +++ b/src/main/java/ru/otus/mobile/page/LoginPage.java @@ -1,28 +1,33 @@ package ru.otus.mobile.page; -import com.google.inject.Inject; +import com.codeborne.selenide.SelenideElement; +import com.google.inject.Singleton; import ru.otus.mobile.component.AlertDialogComponent; import ru.otus.mobile.config.TestAccount; +@Singleton public final class LoginPage extends AbsPageObject { - private final AlertDialogComponent alertDialog; - - @Inject - public LoginPage(AlertDialogComponent alertDialog) { - this.alertDialog = alertDialog; - } + private final SelenideElement usernameInput = byId("username_text_input"); + private final SelenideElement passwordInput = byId("password_text_input"); + private final SelenideElement loginButton = byId("log_in_button"); + private final SelenideElement appMainContainer = byId("app_main_fragment_container"); + private final AlertDialogComponent alertDialog = new AlertDialogComponent(appMainContainer); public void login(TestAccount account) { if (!isOpened()) { return; } - type("username_text_input", account.username()); - type("password_text_input", account.password()); - tap("log_in_button"); + usernameInput.click(); + usernameInput.clear(); + usernameInput.sendKeys(account.username()); + passwordInput.click(); + passwordInput.clear(); + passwordInput.sendKeys(account.password()); + loginButton.click(); alertDialog.acceptIfVisible(); } public boolean isOpened() { - return exists("username_text_input") && exists("password_text_input"); + return usernameInput.exists() && passwordInput.exists(); } } diff --git a/src/main/java/ru/otus/mobile/page/UsersPage.java b/src/main/java/ru/otus/mobile/page/UsersPage.java index 9680a06..8b224b8 100644 --- a/src/main/java/ru/otus/mobile/page/UsersPage.java +++ b/src/main/java/ru/otus/mobile/page/UsersPage.java @@ -1,8 +1,8 @@ package ru.otus.mobile.page; import com.codeborne.selenide.Condition; -import com.google.inject.Inject; -import ru.otus.mobile.component.BottomNavigationComponent; +import com.codeborne.selenide.SelenideElement; +import com.google.inject.Singleton; import ru.otus.mobile.component.GiftsContentComponent; import ru.otus.mobile.component.TopBarComponent; import ru.otus.mobile.component.UsersContentComponent; @@ -11,75 +11,59 @@ import ru.otus.mobile.component.WishlistsContentComponent; import java.time.Duration; +@Singleton public final class UsersPage extends AbsBasePage { - private final TopBarComponent topBar; + private final SelenideElement topBarRoot = byId("top_app_bar"); + private final SelenideElement usersContentRoot = byId("users_content"); + private final SelenideElement usersFilterBottomSheet = byId("users_filter_bottom_sheet"); + private final SelenideElement firstUserItem = byId("user_item"); + private final SelenideElement wishlistsContentRoot = byId("wishlists_content"); + private final SelenideElement giftsContentRoot = byId("gifts_content"); + private final SelenideElement reservedToggle = byId("reserved"); - @Inject - public UsersPage(BottomNavigationComponent bottomNavigation) { - super(bottomNavigation); - this.topBar = new TopBarComponent(byId("android:id/content")); - } + private final TopBarComponent topBar = new TopBarComponent(topBarRoot); + private final UsersContentComponent usersContent = new UsersContentComponent(usersContentRoot); + private final UsersFilterComponent usersFilter = new UsersFilterComponent(usersFilterBottomSheet); + private final WishlistsContentComponent wishlistsContent = new WishlistsContentComponent(wishlistsContentRoot); + private final GiftsContentComponent giftsContent = new GiftsContentComponent(giftsContentRoot); public void open() { bottomNavigation.openUsers(); - usersContentRoot().shouldBe(Condition.visible, Duration.ofSeconds(15)); + usersContentRoot.shouldBe(Condition.visible, Duration.ofSeconds(15)); } public void filterByUsername(String username) { topBar.openUsersFilter(); - byId("users_filter_bottom_sheet").shouldBe(Condition.visible, Duration.ofSeconds(15)); - new UsersFilterComponent(byId("users_filter_bottom_sheet")).applyByUsername(username); - byId("user_item").shouldBe(Condition.visible, Duration.ofSeconds(15)); + usersFilterBottomSheet.shouldBe(Condition.visible, Duration.ofSeconds(15)); + usersFilter.applyByUsername(username); + firstUserItem.shouldBe(Condition.visible, Duration.ofSeconds(15)); } public void openUser(String username) { - usersContent().byUsername(username).open(); + usersContent.byUsername(username).open(); } public void openFirstWishlist() { - wishlistsContent().get(0).open(); + wishlistsContent.get(0).open(); } public void openWishlist(String name) { - wishlistsContent().byTitle(name).open(); + wishlistsContent.byTitle(name).open(); } public void openFirstGift() { - new GiftsContentComponent(byId("gifts_content")).get(0).open(); + giftsContent.get(0).open(); } public void openGift(String name) { - new GiftsContentComponent(byId("gifts_content")).byTitle(name).open(); + giftsContent.byTitle(name).open(); } public boolean isReserved() { - return Boolean.parseBoolean(byId("reserved").shouldBe(Condition.visible).getAttribute("checked")); + return Boolean.parseBoolean(reservedToggle.shouldBe(Condition.visible).getAttribute("checked")); } public void toggleReservation() { - byId("reserved").shouldBe(Condition.visible).click(); + reservedToggle.shouldBe(Condition.visible).click(); } - - private UsersContentComponent usersContent() { - return new UsersContentComponent(usersContentRoot()); - } - - private WishlistsContentComponent wishlistsContent() { - return new WishlistsContentComponent(wishlistsContentRoot()); - } - - private com.codeborne.selenide.SelenideElement usersContentRoot() { - if (byId("users_content").exists()) { - return byId("users_content"); - } - return byId("users"); - } - - private com.codeborne.selenide.SelenideElement wishlistsContentRoot() { - if (byId("wishlists_content").exists()) { - return byId("wishlists_content"); - } - return byId("wishlists"); - } - } diff --git a/src/main/java/ru/otus/mobile/page/WishlistsPage.java b/src/main/java/ru/otus/mobile/page/WishlistsPage.java index ee7afec..5946327 100644 --- a/src/main/java/ru/otus/mobile/page/WishlistsPage.java +++ b/src/main/java/ru/otus/mobile/page/WishlistsPage.java @@ -1,24 +1,24 @@ package ru.otus.mobile.page; import com.codeborne.selenide.Condition; -import com.google.inject.Inject; -import ru.otus.mobile.component.BottomNavigationComponent; +import com.codeborne.selenide.SelenideElement; +import com.google.inject.Singleton; import ru.otus.mobile.component.WishlistsContentComponent; import ru.otus.mobile.component.WishlistFormComponent; -public final class WishlistsPage extends AbsBasePage { - private final WishlistFormComponent form; - private final com.codeborne.selenide.SelenideElement addButton = byId("add_button"); +import java.time.Duration; - @Inject - public WishlistsPage(BottomNavigationComponent bottomNavigation, WishlistFormComponent form) { - super(bottomNavigation); - this.form = form; - } +@Singleton +public final class WishlistsPage extends AbsBasePage { + private final SelenideElement wishlistsContentRoot = byId("wishlists_content"); + private final SelenideElement addButton = byId("add_button"); + private final SelenideElement formRoot = byId("wishlist_edit_bottom_sheet"); + private final WishlistsContentComponent content = new WishlistsContentComponent(wishlistsContentRoot); + private final WishlistFormComponent form = new WishlistFormComponent(formRoot); public void open() { bottomNavigation.openWishlists(); - contentRoot().shouldBe(Condition.visible); + wishlistsContentRoot.shouldBe(Condition.visible, Duration.ofSeconds(15)); } public void createWishlist(String name) { @@ -27,41 +27,19 @@ public final class WishlistsPage extends AbsBasePage { } public void editWishlist(String oldName, String newName) { - ensureWishlistsList(); - content().byTitle(oldName).edit(); + content.byTitle(oldName).edit(); form.save(newName); } public void shouldSeeWishlist(String name) { - content().byTitle(name).shouldHaveTitle(name); + content.byTitle(name).shouldHaveTitle(name); } public void openWishlist(String name) { - content().byTitle(name).open(); + content.byTitle(name).open(); } public void openFirstWishlist() { - content().first().open(); - } - - private void ensureWishlistsList() { - if (exists("wishlist_item") || contentRoot().exists()) { - return; - } - if (exists("gifts_content") || exists("gift_item") || exists("add_button")) { - back(); - } - contentRoot().shouldBe(Condition.visible); - } - - private WishlistsContentComponent content() { - return new WishlistsContentComponent(contentRoot()); - } - - private com.codeborne.selenide.SelenideElement contentRoot() { - if (byId("wishlists_content").exists()) { - return byId("wishlists_content"); - } - return byId("wishlists"); + content.first().open(); } }