/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.selenium.page.group; import java.util.List; import org.junit.Assert; import org.olat.selenium.page.core.BookingPage; import org.olat.selenium.page.core.CalendarPage; import org.olat.selenium.page.core.ContactPage; import org.olat.selenium.page.core.FolderPage; import org.olat.selenium.page.core.IMPage; import org.olat.selenium.page.course.InfoMessageCEPage; import org.olat.selenium.page.forum.ForumPage; import org.olat.selenium.page.graphene.OOGraphene; import org.olat.selenium.page.portfolio.BinderPage; import org.olat.selenium.page.wiki.WikiPage; import org.olat.user.restapi.UserVO; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; /** * Drive the group run page * * Initial date: 03.07.2014<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class GroupPage { private static final By showOwners = By.className("o_sel_group_show_owners"); private static final By toolsBy = By.className("o_sel_collab_tools"); private static final By editDetails = By.className("o_sel_group_edit_title"); private static final By bookingConfigBy = By.className("o_sel_accesscontrol_create"); private static final By memberMenuItem = By.cssSelector("li.o_sel_group_members a"); private static final Tool calendarTool = new Tool( By.cssSelector("li.o_sel_group_calendar a"), By.cssSelector(".o_sel_collab_tools label.o_sel_hasCalendar input[type='checkbox']")); private static final Tool chatTool = new Tool( By.cssSelector("li.o_sel_group_chat a"), By.cssSelector(".o_sel_collab_tools label.o_sel_hasChat input[type='checkbox']")); private static final Tool contactTool = new Tool( By.cssSelector("li.o_sel_group_contact a"), By.cssSelector(".o_sel_collab_tools label.o_sel_hasContactForm input[type='checkbox']")); private static final Tool membersTool = new Tool( By.cssSelector("li.o_sel_group_members a"), null); private static final Tool newsTool = new Tool( By.cssSelector("li.o_sel_group_news a"), By.cssSelector(".o_sel_collab_tools label.o_sel_hasNews input[type='checkbox']")); private static final Tool folderTool = new Tool( By.cssSelector("li.o_sel_group_folder a"), By.cssSelector(".o_sel_collab_tools label.o_sel_hasFolder input[type='checkbox']")); private static final Tool forumTool = new Tool( By.cssSelector("li.o_sel_group_forum a"), By.cssSelector(".o_sel_collab_tools label.o_sel_hasForum input[type='checkbox']")); private static final Tool wikiTool = new Tool( By.cssSelector("li.o_sel_group_wiki a"), By.cssSelector(".o_sel_collab_tools label.o_sel_hasWiki input[type='checkbox']")); private static final Tool portfolioTool = new Tool( By.cssSelector("li.o_sel_group_portfolio a"), By.cssSelector(".o_sel_collab_tools label.o_sel_hasPortfolio input[type='checkbox']")); private WebDriver browser; public GroupPage() { // } public GroupPage(WebDriver browser) { this.browser = browser; } public static GroupPage getGroup(WebDriver browser) { return new GroupPage(browser); } public GroupPage openAdministration() { By adminBy = By.xpath("//div[contains(@class,'o_tree')]//a[contains(@onclick,'MENU_ADMINISTRATION')]"); WebElement adminLink = browser.findElement(adminBy); adminLink.click(); OOGraphene.waitBusy(browser); return this; } public GroupPage openEditDetails() { openAdminTab(editDetails); return this; } public GroupPage openAdminMembers() { openAdminTab(showOwners); return this; } public GroupPage openAdminTools() { openAdminTab(toolsBy); return this; } public BookingPage openBookingConfig() { openAdminTab(bookingConfigBy); return new BookingPage(browser); } public IMPage openChat() { openMenuItem(chatTool); OOGraphene.waitElement(By.cssSelector("a.o_sel_im_open_tool_chat"), 2, browser); return new IMPage(browser); } public CalendarPage openCalendar() { openMenuItem(calendarTool); OOGraphene.waitElement(CalendarPage.calendarToolbatBy, 2, browser); return new CalendarPage(browser); } public ContactPage openContact() { openMenuItem(contactTool); OOGraphene.waitElement(By.cssSelector("fieldset.o_sel_contact_form"), 5, browser); return new ContactPage(browser); } public GroupPage openMembers() { openMenuItem(membersTool); return this; } public InfoMessageCEPage openNews() { openMenuItem(newsTool); OOGraphene.waitElement(By.className("o_infomsg"), 5, browser); return new InfoMessageCEPage(browser); } public FolderPage openFolder() { openMenuItem(folderTool); OOGraphene.waitElement(FolderPage.folderBy, 5, browser); return new FolderPage(browser); } public ForumPage openForum() { openMenuItem(forumTool); OOGraphene.waitElement(ForumPage.threadTableBy, 5, browser); return ForumPage.getGroupForumPage(browser); } public WikiPage openWiki() { openMenuItem(wikiTool); OOGraphene.waitElement(WikiPage.wikiWrapperBy, 5, browser); return WikiPage.getGroupWiki(browser); } public BinderPage openPortfolio() { openMenuItem(portfolioTool); OOGraphene.waitElement(BinderPage.portfolioBy, 5, browser); return new BinderPage(browser); } private GroupPage openMenuItem(Tool tool) { browser.findElement(tool.getMenuItemBy()).click(); OOGraphene.waitBusy(browser); return this; } /** * Grap the REST url of the group (only, you need * to be in administration > description changes. * @return */ public String getGroupURL() { By urlBy = By.cssSelector("p.o_sel_group_url"); WebElement urlEl = browser.findElement(urlBy); String url = urlEl.getText(); return url; } public void close() { By closeBy = By.cssSelector("a i.o_icon_close_tool"); browser.findElement(closeBy).click(); OOGraphene.waitBusy(browser); } public GroupPage setVisibility(boolean owners, boolean participants, boolean waitingList) { if(owners) { By showOwnersBy = By.cssSelector(".o_sel_group_show_owners input[type='checkbox']"); browser.findElement(showOwnersBy).click(); OOGraphene.waitBusy(browser); OOGraphene.waitElement(memberMenuItem, 5, browser); } if(participants) { By showParticipants = By.cssSelector(".o_sel_group_show_participants input[type='checkbox']"); browser.findElement(showParticipants).click(); OOGraphene.waitBusy(browser); OOGraphene.waitElement(memberMenuItem, 5, browser); } if(waitingList) { By showWaitingListBy = By.cssSelector(".o_sel_group_show_waiting_list input[type='checkbox']"); browser.findElement(showWaitingListBy).click(); OOGraphene.waitBusy(browser); OOGraphene.waitElement(memberMenuItem, 5, browser); } return this; } public GroupPage setWaitingList() { By waitingListBy = By.cssSelector(".o_sel_group_edit_waiting_list input[type='checkbox']"); browser.findElement(waitingListBy).click(); OOGraphene.waitBusy(browser); return this; } public GroupPage setMaxNumberOfParticipants(int max) { By maxBy = By.cssSelector(".o_sel_group_edit_max_members input[type='text']"); browser.findElement(maxBy).sendKeys(Integer.toString(max)); return this; } /** * Save the details form. * @return The group page */ public GroupPage saveDetails() { By submitBy = By.cssSelector(".o_sel_group_edit_group_form button.btn-primary"); WebElement submitButton = browser.findElement(submitBy); submitButton.click(); OOGraphene.waitBusy(browser); return this; } public GroupPage enableTools() { return enableTool(calendarTool) .enableTool(chatTool) .enableTool(contactTool) .enableTool(newsTool) .enableTool(folderTool) .enableTool(forumTool) .enableTool(wikiTool) .enableTool(portfolioTool); } public GroupPage enableCalendarTool() { return enableTool(calendarTool); } private GroupPage enableTool(Tool tool) { By checkToolsBy = tool.getCheckboxBy(); WebElement checkToolEl = browser.findElement(checkToolsBy); checkToolEl.click(); OOGraphene.waitBusy(browser); OOGraphene.waitElement(tool.getMenuItemBy(), 2, browser); return this; } public MembersWizardPage addMember() { By addMemberBy = By.className("o_sel_group_add_member"); WebElement addMemberButton = browser.findElement(addMemberBy); addMemberButton.click(); OOGraphene.waitBusy(browser); return new MembersWizardPage(browser); } private void openAdminTab(By marker) { By navBarAdmin = By.cssSelector("div.o_tabbed_pane ul>li>a"); OOGraphene.waitElement(navBarAdmin, browser); List<WebElement> tabLinks = browser.findElements(navBarAdmin); Assert.assertFalse(tabLinks.isEmpty()); boolean found = false; for(WebElement tabLink:tabLinks) { tabLink.click(); OOGraphene.waitBusy(browser); List<WebElement> markerEls = browser.findElements(marker); if(markerEls.size() > 0) { found = true; break; } } Assert.assertTrue(found); } public GroupPage assertOnInfosPage(String name) { By groupNameBy = By.xpath("//div[@id='o_main_center_content_inner']//div[contains(@class,'o_name')]//div[contains(text(),'" + name + "')]"); List<WebElement> groupNameEls = browser.findElements(groupNameBy); Assert.assertFalse(groupNameEls.isEmpty()); return this; } public GroupPage assertNews(String name) { By groupNameBy = By.xpath("//div[@id='o_main_center_content_inner']//div[@id='o_msg_info']//p[contains(text(),'" + name+ "')]"); List<WebElement> groupNameEls = browser.findElements(groupNameBy); Assert.assertFalse(groupNameEls.isEmpty()); return this; } public GroupPage assertOnWaitingList(String name) { //check group name By groupNameBy = By.cssSelector("#o_main_center_content_inner h4"); WebElement groupNameEl = browser.findElement(groupNameBy); Assert.assertTrue(groupNameEl.getText().contains(name)); //check the warning By warningBy = By.xpath("//div[@id='o_main_center_content_inner']//p[contains(@class,'o_warning')]"); List<WebElement> warningEls = browser.findElements(warningBy); Assert.assertFalse(warningEls.isEmpty()); return this; } public GroupPage assertParticipantList() { By participantListBy = By.className("o_sel_participants"); List<WebElement> participantListEl = browser.findElements(participantListBy); Assert.assertFalse(participantListEl.isEmpty()); return this; } public GroupPage assertMembersInOwnerList(UserVO owner) { return assertMembers(owner, "o_sel_coaches"); } public GroupPage assertMembersInParticipantList(UserVO owner) { return assertMembers(owner, "o_sel_participants"); } public GroupPage assertMembersInWaitingList(UserVO owner) { return assertMembers(owner, "o_sel_waiting_list"); } private GroupPage assertMembers(UserVO member, String cssClass) { boolean isMember = isMembers( member, cssClass); Assert.assertTrue(isMember); return this; } public boolean isInMembersOwnerList(UserVO owner) { return isMembers(owner, "o_sel_coaches"); } public boolean isInMembersParticipantList(UserVO owner) { return isMembers(owner, "o_sel_participants"); } public boolean isInMembersInWaitingList(UserVO owner) { return isMembers(owner, "o_sel_waiting_list"); } private boolean isMembers(UserVO member, String cssClass) { String firstName = member.getFirstName(); By longBy = By.xpath("//div[contains(@class,'" + cssClass + "')]//div[contains(@class,'o_cmember_info_wrapper')]/a/span[contains(text(),'" + firstName + "')]"); List<WebElement> elements = browser.findElements(longBy); return elements.size() > 0; } private static class Tool { private final By menuItemBy; private final By checkboxBy; public Tool(By menuItemBy, By checkboxBy) { this.menuItemBy = menuItemBy; this.checkboxBy = checkboxBy; } public By getMenuItemBy() { return menuItemBy; } public By getCheckboxBy() { return checkboxBy; } } }