diff --git a/src/test/java/com/wikia/webdriver/elements/communities/desktop/components/categories/CategoryLayoutSelector.java b/src/test/java/com/wikia/webdriver/elements/communities/desktop/components/categories/CategoryLayoutSelector.java new file mode 100644 index 0000000000..0a68c491e0 --- /dev/null +++ b/src/test/java/com/wikia/webdriver/elements/communities/desktop/components/categories/CategoryLayoutSelector.java @@ -0,0 +1,49 @@ +package com.wikia.webdriver.elements.communities.desktop.components.categories; + +import com.wikia.webdriver.elements.communities.desktop.pages.categories.CategoryExhibitionPage; +import com.wikia.webdriver.elements.communities.desktop.pages.categories.DynamicCategoryPage; +import com.wikia.webdriver.pageobjectsfactory.pageobject.BasePageObject; + +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +/** + * This component lets user choose category page layout, it's available only for logged in users + */ +public class CategoryLayoutSelector extends BasePageObject { + + @FindBy(css = "li[data-category-layout=mediawiki]") + private WebElement classicViewButton; + @FindBy(css = "li[data-category-layout=category-exhibition]") + private WebElement categoryExhibitionButton; + @FindBy(css = "li[data-category-layout=category-page3]") + private WebElement dynamicViewButton; + @FindBy(css = ".category-layout-selector") + private WebElement viewContainer; + + public boolean isCategoryExhibitionActive() { + return categoryExhibitionButton.getAttribute("class").contains("is-active"); + } + + public boolean isDynamicViewActive() { + return dynamicViewButton.getAttribute("class").contains("is-active"); + } + + public void switchToClassicView() { + classicViewButton.click(); + } + + public CategoryExhibitionPage switchToCategoryExhibitionView() { + categoryExhibitionButton.click(); + return new CategoryExhibitionPage(); + } + + public DynamicCategoryPage switchToDynamicCategoriesView() { + dynamicViewButton.click(); + return new DynamicCategoryPage(); + } + + public boolean isVisible() { + return isVisible(viewContainer); + } +} diff --git a/src/test/java/com/wikia/webdriver/elements/communities/desktop/components/categories/PaginationControls.java b/src/test/java/com/wikia/webdriver/elements/communities/desktop/components/categories/PaginationControls.java new file mode 100644 index 0000000000..4ef73bc957 --- /dev/null +++ b/src/test/java/com/wikia/webdriver/elements/communities/desktop/components/categories/PaginationControls.java @@ -0,0 +1,68 @@ +package com.wikia.webdriver.elements.communities.desktop.components.categories; + +import com.wikia.webdriver.common.logging.Log; +import com.wikia.webdriver.pageobjectsfactory.pageobject.BasePageObject; + +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +public class PaginationControls extends BasePageObject { + + private final T outer; + @FindBy(xpath = "//a[contains(text(),'First')]") + private WebElement firstButton; + @FindBy(css = ".category-page__pagination-next") + private WebElement nextButton; + @FindBy(css = ".category-page__pagination-prev") + private WebElement previousButton; + @FindBy(xpath = "//a[contains(text(),'Last')]") + private WebElement lastButton; + + public PaginationControls (T outer) { + this.outer = outer; + } + + public boolean isFirstButtonIsVisible() { + return isVisible(firstButton); + } + + public boolean isNextButtonVisible() { + return isVisible(nextButton); + } + + public boolean isPreviousButtonVisible() { + return isVisible(previousButton); + } + + public boolean isLastButtonVisible() { + return isVisible(lastButton); + } + + public T clickFirstButton() { + this.scrollAndClick(firstButton); + Log.info("First page button clicked."); + + return outer; + } + + public T clickNextButton() { + this.scrollAndClick(nextButton); + Log.info("Next page button clicked."); + + return outer; + } + + public T clickPreviousButton() { + this.scrollAndClick(previousButton); + Log.info("Previous page button clicked."); + + return outer; + } + + public T clickLastButton() { + this.scrollAndClick(lastButton); + Log.info("Last page button clicked."); + + return outer; + } +} diff --git a/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/category/CategoryPageObject.java b/src/test/java/com/wikia/webdriver/elements/communities/desktop/pages/categories/CategoryExhibitionPage.java similarity index 89% rename from src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/category/CategoryPageObject.java rename to src/test/java/com/wikia/webdriver/elements/communities/desktop/pages/categories/CategoryExhibitionPage.java index 15cf885c3b..a7022f86ae 100644 --- a/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/category/CategoryPageObject.java +++ b/src/test/java/com/wikia/webdriver/elements/communities/desktop/pages/categories/CategoryExhibitionPage.java @@ -1,4 +1,4 @@ -package com.wikia.webdriver.pageobjectsfactory.pageobject.category; +package com.wikia.webdriver.elements.communities.desktop.pages.categories; import com.wikia.webdriver.common.logging.Log; import com.wikia.webdriver.pageobjectsfactory.pageobject.WikiBasePageObject; @@ -10,7 +10,7 @@ import java.util.List; -public class CategoryPageObject extends WikiBasePageObject { +public class CategoryExhibitionPage extends WikiBasePageObject { @FindBy(css = ".category-gallery-item") private List categoryGalleryItems; diff --git a/src/test/java/com/wikia/webdriver/elements/communities/desktop/pages/categories/DynamicCategoryPage.java b/src/test/java/com/wikia/webdriver/elements/communities/desktop/pages/categories/DynamicCategoryPage.java new file mode 100644 index 0000000000..214357b7c0 --- /dev/null +++ b/src/test/java/com/wikia/webdriver/elements/communities/desktop/pages/categories/DynamicCategoryPage.java @@ -0,0 +1,63 @@ +package com.wikia.webdriver.elements.communities.desktop.pages.categories; + +import com.wikia.webdriver.common.logging.Log; +import com.wikia.webdriver.elements.communities.desktop.components.categories.CategoryLayoutSelector; +import com.wikia.webdriver.elements.communities.desktop.components.categories.PaginationControls; +import com.wikia.webdriver.pageobjectsfactory.pageobject.WikiBasePageObject; + +import lombok.Getter; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DynamicCategoryPage extends WikiBasePageObject { + + @FindBy(css=".article-content") + private WebElement articleContent; + + + private By categoryMembersContainer = By.cssSelector(".category-members-grouped"); + private By categoryMembers = By.cssSelector(".category-page__members li a"); + + @Getter(lazy = true) + private final CategoryLayoutSelector layoutSelector = new CategoryLayoutSelector(); + @Getter(lazy = true) + private final PaginationControls paginationControls = new PaginationControls(this); + + public String getArticleContent() { + return articleContent.getText(); + } + + public boolean categoryMembersContainerIsVisible() { + wait.forElementVisible(categoryMembersContainer); + Log.info("Category members container is visible."); + + return true; + } + + public boolean hasCategoryMembers() { + wait.forElementVisible(categoryMembers); + Log.info("Category has members."); + + return driver.findElements(categoryMembers).size() > 0; + } + + public List getMembers() { + return driver.findElements(categoryMembers); + } + + public String getNumberOfElementsInCategory() { + Pattern pattern = Pattern.compile("(?:All items )\\((.d)\\)"); + Matcher matcher = pattern.matcher("test"); + if (matcher.group().isEmpty()) { + throw new IllegalArgumentException("Unable to extract number of elements in the category"); + } + return matcher.group(0); + } + + +} diff --git a/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/BasePageObject.java b/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/BasePageObject.java index 04edc91ded..721ad900b8 100644 --- a/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/BasePageObject.java +++ b/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/BasePageObject.java @@ -747,11 +747,14 @@ public void enterEmailChangeLink(String email, String password) { public boolean isVisible(WebElement element) { boolean result; + try { wait.forElementVisible(element); result = true; } catch (TimeoutException e) { + changeImplicitWait(0, TimeUnit.MILLISECONDS); Log.info("Element: " + element.toString() + " not found.", e); + restoreDefaultImplicitWait(); result = false; } return result; diff --git a/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/PortableInfobox.java b/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/PortableInfobox.java index 54cfdb0e45..28fd149481 100644 --- a/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/PortableInfobox.java +++ b/src/test/java/com/wikia/webdriver/pageobjectsfactory/pageobject/PortableInfobox.java @@ -3,7 +3,7 @@ import com.wikia.webdriver.common.core.Assertion; import com.wikia.webdriver.common.logging.Log; import com.wikia.webdriver.pageobjectsfactory.componentobject.modalwindows.CreateArticleModalComponentObject; -import com.wikia.webdriver.pageobjectsfactory.pageobject.category.CategoryPageObject; +import com.wikia.webdriver.elements.communities.desktop.pages.categories.CategoryExhibitionPage; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebElement; @@ -195,18 +195,18 @@ public PortableInfobox clickImage() { return this; } - public CategoryPageObject clickCategoryLink() { + public CategoryExhibitionPage clickCategoryLink() { wait.forElementVisible(categoryLinkInInfobox); scrollAndClick(categoryLinkInInfobox); - return new CategoryPageObject(); + return new CategoryExhibitionPage(); } - public CategoryPageObject clickCategoryWithIndex(int index) { + public CategoryExhibitionPage clickCategoryWithIndex(int index) { wait.forElementVisible(categories.get(index)); scrollAndClick(categories.get(index)); - return new CategoryPageObject(); + return new CategoryExhibitionPage(); } public PortableInfobox open(String articleTitle) { diff --git a/src/test/java/com/wikia/webdriver/testcases/desktop/categoriestests/DynamicCategoryPageTests.java b/src/test/java/com/wikia/webdriver/testcases/desktop/categoriestests/DynamicCategoryPageTests.java new file mode 100644 index 0000000000..739bd10526 --- /dev/null +++ b/src/test/java/com/wikia/webdriver/testcases/desktop/categoriestests/DynamicCategoryPageTests.java @@ -0,0 +1,128 @@ +package com.wikia.webdriver.testcases.desktop.categoriestests; + +import com.wikia.webdriver.common.core.Assertion; +import com.wikia.webdriver.common.core.annotations.Execute; +import com.wikia.webdriver.common.core.helpers.User; +import com.wikia.webdriver.common.templates.NewTestTemplate; +import com.wikia.webdriver.elements.communities.desktop.components.categories.CategoryLayoutSelector; +import com.wikia.webdriver.elements.communities.desktop.components.categories.PaginationControls; +import com.wikia.webdriver.elements.communities.desktop.pages.categories.DynamicCategoryPage; +import com.wikia.webdriver.pageobjectsfactory.pageobject.article.ArticlePageObject; + +import org.openqa.selenium.WebElement; +import org.testng.annotations.Test; + +import java.util.List; + +@Test(groups = {"Category, Oasis_Category"}) +@Execute(onWikia = "category") +public class DynamicCategoryPageTests extends NewTestTemplate { + + + public void dynamicCategoryAnonNotAbleToChangeLayout() { + new ArticlePageObject().open("Category:200elements"); + + DynamicCategoryPage categoryPage = new DynamicCategoryPage(); + CategoryLayoutSelector layoutSelector = categoryPage.getLayoutSelector(); + Assertion.assertFalse(layoutSelector.isVisible(), "Layout selectors are displayed for anon"); + } + + /** + * Category exhibition is set as default for USER + */ + @Execute(asUser = User.USER) + public void categoryExhibitionSetInPreferencesAsDefaultView() { + new ArticlePageObject().open("Category:200elements"); + + DynamicCategoryPage categoryPage = new DynamicCategoryPage(); + CategoryLayoutSelector layoutSelector = categoryPage.getLayoutSelector(); + Assertion.assertTrue(layoutSelector.isCategoryExhibitionActive()); + + } + + @Execute(asUser = User.USER) + public void dynamicCategoryLoggedInUserCanChangeLayout() { + new ArticlePageObject().open("Category:200elements"); + + DynamicCategoryPage categoryPage = new DynamicCategoryPage(); + CategoryLayoutSelector layoutSelector = categoryPage.getLayoutSelector(); + Assertion.assertTrue(layoutSelector.isVisible(), "Layout selectors are displayed for anon"); + String pageUrl = categoryPage.getCurrentUrl(); + layoutSelector.switchToDynamicCategoriesView(); + Assertion.assertStringContains(categoryPage.getCurrentUrl(), pageUrl); + } + + /** + * Default settings (dynamic category) are applied for USER_2 + */ + @Execute(asUser = User.USER_2) + public void pagination200elementsNoNextButton() { + new ArticlePageObject().open("Category:200elements"); + + DynamicCategoryPage categoryPage = new DynamicCategoryPage(); + CategoryLayoutSelector layoutSelector = categoryPage.getLayoutSelector(); + Assertion.assertTrue(layoutSelector.isDynamicViewActive()); + PaginationControls paginationControls = categoryPage.getPaginationControls(); + Assertion.assertFalse(paginationControls.isNextButtonVisible()); + } + + @Execute(asUser = User.USER_2) + public void pagination201elementsNextButtonVisible() { + new ArticlePageObject().open("Category:201elements"); + + DynamicCategoryPage categoryPage = new DynamicCategoryPage(); + CategoryLayoutSelector layoutSelector = categoryPage.getLayoutSelector(); + Assertion.assertEquals(layoutSelector.isDynamicViewActive(), true, "Dynamic view is not active"); + PaginationControls paginationControls = categoryPage.getPaginationControls(); + paginationControls.clickNextButton(); + Assertion.assertEquals(categoryPage.getMembers().size(), 1, "Invalid number of members on category page"); + } + + @Execute(asUser = User.USER_2) + public void pagination401elementsNextButtonVisible() { + new ArticlePageObject().open("Category:401elements"); + + DynamicCategoryPage categoryPage = new DynamicCategoryPage(); + CategoryLayoutSelector layoutSelector = categoryPage.getLayoutSelector(); + Assertion.assertEquals(layoutSelector.isDynamicViewActive(), true, "Dynamic view is not active"); + PaginationControls paginationControls = categoryPage.getPaginationControls(); + Assertion.assertTrue(paginationControls.isNextButtonVisible(), "Next button is not visible"); + Assertion.assertTrue(paginationControls.isLastButtonVisible(), "Last button is not visible"); + paginationControls.clickLastButton(); + + List memberList = categoryPage.getMembers(); + + Assertion.assertEquals(categoryPage.getMembers().size(), 1); + Assertion.assertTrue(memberList.stream().anyMatch(e->"Article99".equals(e.getText()))); + paginationControls.clickFirstButton(); + + memberList = categoryPage.getMembers(); + Assertion.assertTrue(memberList.stream().anyMatch(e->"Article1".equals(e.getText()))); + } + + @Execute(asUser = User.USER_2) + public void overridingLayoutSetInPreferences() { + new ArticlePageObject().open("Category:201elements"); + + DynamicCategoryPage categoryPage = new DynamicCategoryPage(); + CategoryLayoutSelector layoutSelector = categoryPage.getLayoutSelector(); + Assertion.assertTrue(layoutSelector.isVisible(), "Layout selectors are displayed for anon"); + Assertion.assertTrue(layoutSelector.isDynamicViewActive()); + layoutSelector.switchToCategoryExhibitionView(); + categoryPage.refreshPage(); + Assertion.assertTrue(layoutSelector.isCategoryExhibitionActive()); + } + + @Execute(asUser = User.USER_2) + public void subcategoriesAreMixedWithArticles() { + new ArticlePageObject().open("Category:Articles"); + + DynamicCategoryPage categoryPage = new DynamicCategoryPage(); + List memberList = categoryPage.getMembers(); + Assertion.assertTrue( + memberList.stream().anyMatch(m -> m.getText().matches("(?:Category|Kategoria):TestArticles")), + "Category cannot be found in the list" + ); + + } +} diff --git a/src/test/java/com/wikia/webdriver/testcases/desktop/infobox/portableinfoboxtests/PortableInfoboxTests.java b/src/test/java/com/wikia/webdriver/testcases/desktop/infobox/portableinfoboxtests/PortableInfoboxTests.java index dc64ffdf65..71e7f388c1 100644 --- a/src/test/java/com/wikia/webdriver/testcases/desktop/infobox/portableinfoboxtests/PortableInfoboxTests.java +++ b/src/test/java/com/wikia/webdriver/testcases/desktop/infobox/portableinfoboxtests/PortableInfoboxTests.java @@ -15,7 +15,7 @@ import com.wikia.webdriver.pageobjectsfactory.pageobject.PortableInfobox; import com.wikia.webdriver.pageobjectsfactory.pageobject.article.ArticlePageObject; import com.wikia.webdriver.pageobjectsfactory.pageobject.article.editmode.SourceEditModePageObject; -import com.wikia.webdriver.pageobjectsfactory.pageobject.category.CategoryPageObject; +import com.wikia.webdriver.elements.communities.desktop.pages.categories.CategoryExhibitionPage; import com.wikia.webdriver.pageobjectsfactory.pageobject.special.SpecialWhatLinksHerePageObject; import com.wikia.webdriver.pageobjectsfactory.pageobject.special.themedesigner.SpecialThemeDesignerPageObject; import com.wikia.webdriver.pageobjectsfactory.pageobject.visualeditor.VisualEditorPageObject; @@ -198,7 +198,7 @@ public void verifyInfoboxCategoryLinks() { String categoryLinkName = infobox.getCategoryLinkName(); infobox.clickCategoryLink(); - String categoryPageTitle = new CategoryPageObject().getCategoryPageTitle(); + String categoryPageTitle = new CategoryExhibitionPage().getCategoryPageTitle(); Assertion.assertTrue(categoryLinkName.contains(categoryPageTitle)); } @@ -373,10 +373,10 @@ public void infoboxImageOnCategoryPage() { String imageName = infobox.getDataImageName(); - CategoryPageObject categoryPage = infobox.clickCategoryWithIndex(0); + CategoryExhibitionPage categoryExhibitionPage = infobox.clickCategoryWithIndex(0); new ArticlePurger().purgeArticleAsLoggedUser(); - String categoryImageURL = categoryPage.getImageURLFromGallery(PageContent.INFOBOX_2); + String categoryImageURL = categoryExhibitionPage.getImageURLFromGallery(PageContent.INFOBOX_2); Assertion.assertTrue(categoryImageURL.contains(imageName)); } diff --git a/src/test/java/com/wikia/webdriver/testcases/mobile/category/CategoryPageTest.java b/src/test/java/com/wikia/webdriver/testcases/mobile/category/CategoryPageTest.java index 7fe48c4059..b1e251bf6d 100644 --- a/src/test/java/com/wikia/webdriver/testcases/mobile/category/CategoryPageTest.java +++ b/src/test/java/com/wikia/webdriver/testcases/mobile/category/CategoryPageTest.java @@ -14,7 +14,7 @@ import org.testng.annotations.Test; -@Test(groups = "Mercury_Category") +@Test(groups = "Category, Mercury_Category") @Execute(onWikia = MobileWikis.MERCURY_AUTOMATION_TESTING) @InBrowser(browser = Browser.CHROME, emulator = Emulator.GOOGLE_NEXUS_5) public class CategoryPageTest extends NewTestTemplate { diff --git a/src/test/java/com/wikia/webdriver/testcases/mobile/category/CategoryTest.java b/src/test/java/com/wikia/webdriver/testcases/mobile/category/CategoryTest.java index 45f9e47aed..52e311104b 100644 --- a/src/test/java/com/wikia/webdriver/testcases/mobile/category/CategoryTest.java +++ b/src/test/java/com/wikia/webdriver/testcases/mobile/category/CategoryTest.java @@ -11,7 +11,7 @@ import org.testng.annotations.Test; -@Test(groups = "Mercury_Category") +@Test(groups = "Category, Mercury_Category") @Execute(onWikia = MobileWikis.MERCURY_AUTOMATION_TESTING) @InBrowser(browser = Browser.CHROME, emulator = Emulator.GOOGLE_NEXUS_5) public class CategoryTest extends NewTestTemplate { diff --git a/src/test/java/com/wikia/webdriver/testsuites/testSuite.xml b/src/test/java/com/wikia/webdriver/testsuites/testSuite.xml index 095e2c2a98..b55ede3cb5 100644 --- a/src/test/java/com/wikia/webdriver/testsuites/testSuite.xml +++ b/src/test/java/com/wikia/webdriver/testsuites/testSuite.xml @@ -237,6 +237,7 @@ +