diff --git a/.gitignore b/.gitignore index 09af494..f452d18 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target/ +/test-output/ # Eclipse STS artifacts **/.settings/** @@ -12,3 +13,6 @@ # Mac OS files .DS_Store +#log files +*.log* + diff --git a/pom.xml b/pom.xml index 6ce8d83..d268f02 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,13 @@ 3.8.1 + + + log4j + log4j + 1.2.17 + + @@ -87,5 +94,15 @@ + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + diff --git a/src/main/java/Itacademy/Page/BasePage.java b/src/main/java/Itacademy/Page/BasePage.java deleted file mode 100644 index 7212769..0000000 --- a/src/main/java/Itacademy/Page/BasePage.java +++ /dev/null @@ -1,49 +0,0 @@ -package Itacademy.Page; - -import org.openqa.selenium.By; -import org.openqa.selenium.StaleElementReferenceException; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.ExpectedCondition; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.Wait; -import org.openqa.selenium.support.ui.WebDriverWait; - -public class BasePage { - - private WebDriver driver; - private Wait wait; - - public BasePage(WebDriver driver) { - this.driver = driver; - wait = new WebDriverWait(driver, 10, 500) - .withMessage("Element was not found in X seconds") - .ignoring(StaleElementReferenceException.class); - } - - public WebDriver getDriver() { - return driver; - } - - // Ждет пока указанный элемент не появится на странице и не станет видимым (опрос элемента происходит в соответствии с настройками wait) - public WebElement waitVisible(By by) { - wait.until(ExpectedConditions.presenceOfElementLocated(by)); - return wait.until(ExpectedConditions.visibilityOfElementLocated(by)); - } - - // from here: https://stackoverflow.com/questions/15237129/webdriverwait-for-an-element-attribute-to-change - public boolean waiteForAttribute(final By by, final String atributeName) { - return wait.until(new ExpectedCondition() { - public Boolean apply(WebDriver driver) { - WebElement element = driver.findElement(by); - String attributeValue = element.getAttribute(atributeName); - if (attributeValue != null) { - return true; - } else { - return false; - } - } - }); - } - -} diff --git a/src/main/java/Itacademy/Page/LoginPage.java b/src/main/java/Itacademy/Page/LoginPage.java deleted file mode 100644 index 03c6c16..0000000 --- a/src/main/java/Itacademy/Page/LoginPage.java +++ /dev/null @@ -1,74 +0,0 @@ -package Itacademy.Page; - -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; - -public class LoginPage extends BasePage { - - private static final By LOGIN_INPUT_LOCATOR = By.xpath("//*[contains(@name, 'Login')]"); - private static final By ENTER_PASSWORD_BUTTON = By.xpath("//button"); - private static final By PASSWORD_FIELD = By.xpath("//*[contains(@name, 'Password') ]"); - private static final By ENTER_BUTTON = By.xpath("//*[contains(@type, 'submit') ]"); - private static final By LOGOUT_LINK = By.xpath("//*[@id='PH_logoutLink']"); - private static final By LOGIN_LINK = By.xpath("//*[@id='PH_authLink']"); - private static final By LOGGED_USER_MAIL = By.xpath("//*[@id='PH_user-email']"); - private static final By LOGIN_ERROR_MESSAGE = By - .xpath("//*[@data-test-id='error-footer-text']"); - - public LoginPage(WebDriver driver) { - super(driver); - } - - //выполнит вход в майл по указанному логину и паролю - public void doLogin(String login, String password) { - //вызвали метод для ввода логина - enterLogin(login); - //вводим пароль - enterPassword(password); - waitVisible(LOGGED_USER_MAIL); - } - - public void enterPassword(String password) { - //вводим пароль - WebElement passwordField = getDriver().findElement(PASSWORD_FIELD); - passwordField.sendKeys(Keys.chord(Keys.CONTROL, "a", Keys.DELETE)); - - passwordField.sendKeys(password); - // ищем кнопку для входа на страницу и жмем ее - WebElement enterButton = getDriver().findElement(ENTER_BUTTON); - enterButton.click(); - - } - - public void enterLogin(String login) { - WebElement loginField = getDriver().findElement(LOGIN_INPUT_LOCATOR); - loginField.sendKeys(Keys.chord(Keys.CONTROL, "a", Keys.DELETE)); - loginField.sendKeys(login); - - // нажимаем по enter password кнопке - WebElement enterPasswordButton = getDriver().findElement(ENTER_PASSWORD_BUTTON); - enterPasswordButton.click(); - } - - public void doLogout() { - WebElement logoutButton = getDriver().findElement(LOGOUT_LINK); - logoutButton.click(); - waitVisible(LOGIN_LINK); - } - - // возвращает email залогиненного usera - public String getLoggedUserMail() { - WebElement loggedUserMail = getDriver().findElement(LOGGED_USER_MAIL); - return loggedUserMail.getText(); - } - - // возвращает ошибку не верного логина - public String getErrorLoginMessage() { - WebElement errorMessage = getDriver().findElement(LOGIN_ERROR_MESSAGE); - return errorMessage.getText(); - } - - -} diff --git a/src/main/java/Itacademy/Page/MailPage.java b/src/main/java/Itacademy/Page/MailPage.java deleted file mode 100644 index f39fbd9..0000000 --- a/src/main/java/Itacademy/Page/MailPage.java +++ /dev/null @@ -1,205 +0,0 @@ -package Itacademy.Page; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; - -public class MailPage extends BasePage { - - private static final By NEW_MAIL_BUTTON = By.xpath("//*[text()=\"Написать письмо\"]"); - private static final By ADDRES_FIELD = By - .xpath("//div[contains(@class, 'fields_container')]//input"); - private static final By TOPIC_FIELD = By - .xpath("//div[contains(@class, 'subject__wrapper')]//input"); - private static final By MAIL_TEXT_FIELD = By.xpath("//div[@role='textbox']"); - private static final By SEND_BUTTON = By.xpath("//span[text()=\"Отправить\"]"); - private static final By SENT_EMAILS_BUTTON = By.xpath("//a[@href=\"/sent/\"]"); - private static final By EMAIL_FROM = By - .xpath("//span[contains(@title, 'kalacheva.tamara@bk.ru')]"); - private static final By INBOX_EMAILS_BUTTON = By.xpath("//a[@href=\"/inbox/\"]"); - private static final By CLOSE_DIALOG_BUTTON = By.xpath("//span[@title='Закрыть']"); - private static final By SELECT_ALL_BUTTON = By.xpath("//span[@title='Выделить все']/parent::div"); - private static final By DELETE_EMAILS_BUTTON = By.xpath("//span[@title=\"Удалить\"]/parent::div"); - private static final String INBOX_URL = "https://e.mail.ru/inbox/"; - private static final By EMTY_FOLDER_MESSAGE = By.xpath("//div[@class='octopus__text']"); - private static final By CLEAR_EMAILS_ELEMENT = By - .xpath("//div[@class='layer__submit-button']//span[text()='Очистить']"); - private static final By ERROR_MESSAGE = By.xpath("//div[contains(@class, 'rowError')]"); - private static final By CLOSE_NEW_EMAIL_DIALOG = By - .xpath("//button[contains(@title, 'Закрыть')]"); - private static final By CANCEL_EMAEL = By.xpath("//span[text()='Отменить']"); - private static final By SAVE_DRAFT_EMAIL = By.xpath("//span[text()='Сохранить']"); - private static final By NOTIFY_MESSAGE_TEXT = By - .xpath("//span[@class='notify__message__text']"); - private static final By CLOSE_NOTIFY_MESSAGE = By - .xpath("//div[contains(@class,'notify__body')]//div[@class='notify__ico-close']"); - private static final By SEND_EMPTY_BOOTON = By.xpath( - "//div[@data-test-id='confirmation:empty-letter']//span[text()='Отправить']/parent::button"); - private static final By DRAFT_FOLDER = By.xpath("//a[@href='/drafts/']"); - private static final By TRASH_FOLDER = By.xpath("//a[@href='/trash/']"); - private static final String E_PREFIX = "//span[contains(@title, '"; - private static final String E_POSTFIX = "')]"; - private static final String TITLE = "title"; - - public MailPage(WebDriver driver) { - super(driver); - } - - //Создает и отправляет новое письмо - public void sendNewMail(String addres, String topic, String text) { - newMail(); - fillAddres(addres); - fillTopic(topic); - fillMailText(text); - sendMail(); - if (addres.trim().isEmpty()) { - return; - } - if (text.trim().isEmpty()) { - // подтверждаем отправку пустого письма - WebElement sendEmtyButton = waitVisible(SEND_EMPTY_BOOTON); - sendEmtyButton.click(); - } - - closeSentEmailDialog(); - } - - // создает и сохраняет черновик письма - public void createDraftMail(String addres, String topic, String text) { - newMail(); - fillAddres(addres); - fillTopic(topic); - fillMailText(text); - saveDraftEmail(); - } - - //написать письмо - public void newMail() { - waitVisible(NEW_MAIL_BUTTON).click(); - } - - //заполняет адрес письма "Кому"(адрес) - public void fillAddres(String addres) { - WebElement addresField = getDriver().findElement(ADDRES_FIELD); - addresField.sendKeys(addres); - } - - //заполняет тему письма - public void fillTopic(String topic) { - WebElement topicField = getDriver().findElement(TOPIC_FIELD); - topicField.sendKeys(topic); - } - - // заполняет тело письма - public void fillMailText(String text) { - WebElement mailText = getDriver().findElement(MAIL_TEXT_FIELD); - mailText.sendKeys(text); - } - - //отправляет письмо - public void sendMail() { - WebElement sendButton = getDriver().findElement(SEND_BUTTON); - sendButton.click(); - } - - // заходим в папку отправленные - public void goToSentEmails() { - WebElement sentEmailsButton = getDriver().findElement(SENT_EMAILS_BUTTON); - sentEmailsButton.click(); - } - - //заходим папку входящие - public void goToInboxEmails() { - WebElement InboxEmailsButton = getDriver().findElement(INBOX_EMAILS_BUTTON); - InboxEmailsButton.click(); - } - - //заходим папку Черновики - public void goToDraftEmails() { - getDriver().findElement(DRAFT_FOLDER).click(); - } - - //заходим папку Удаленные - public void goToTrashEmails() { - getDriver().findElement(TRASH_FOLDER).click(); - } - - //проверяем есть ли письмо от указанного адреса - public boolean isMailExist(String addres) { - boolean result = false; - try { - By by = By.xpath(E_PREFIX + addres + E_POSTFIX); - WebElement email = waitVisible(by); - if (email.getAttribute(TITLE).contains(addres)) { - result = true; - } - } catch (Exception e) { - e.printStackTrace(); - result = false; - } - return result; - } - - //закрываем диалоговое окно об отправке письма - public void closeSentEmailDialog() { - WebElement closeDialogButton = waitVisible(CLOSE_DIALOG_BUTTON); - closeDialogButton.click(); - } - - //удаление всех писем в текущей папке - public void deleteAllLetters() { - WebElement selectALL = waitVisible(SELECT_ALL_BUTTON); - selectALL.click(); - WebElement deleteElement = waitVisible(DELETE_EMAILS_BUTTON); - deleteElement.click(); - - //Кейс для папки ИНБОКС (нужно закрыть диалоговое окно и подтвердить удаление писем) - String url = getDriver().getCurrentUrl(); - if (url.equals(INBOX_URL)) { - try { - WebElement clearEmailsElement = waitVisible(CLEAR_EMAILS_ELEMENT); - clearEmailsElement.click(); - } catch (Exception e) { - e.printStackTrace(); - } - } - waitVisible(NOTIFY_MESSAGE_TEXT); - waitVisible(CLOSE_NOTIFY_MESSAGE).click(); - } - - // метод на проверку пустой папки - public boolean emptyFolder() { - return getDriver().findElement(EMTY_FOLDER_MESSAGE).isDisplayed(); - } - - //возвращает текст ошибки "Не указан адрес получателя" - public String getNoAddressErrorMessage() { - WebElement element = waitVisible(ERROR_MESSAGE); - return element.getText(); - } - - //закрывает окно нового письма - public void closeNewEmailDialog() { - getDriver().findElement(CLOSE_NEW_EMAIL_DIALOG).click(); - } - - // нажимает кнопку "Отменить" в новом письме - public void cancelEmail() { - getDriver().findElement(CANCEL_EMAEL).click(); - } - - // сохраняет письмо в черновики - public void saveDraftEmail() { - getDriver().findElement(SAVE_DRAFT_EMAIL).click(); - //ждем пока не появится сообщение "Сохранено в черновиках в 16:35" - waitVisible(NOTIFY_MESSAGE_TEXT); - //закрыть уведомление - waitVisible(CLOSE_NOTIFY_MESSAGE).click(); - - } - - // получает текст сообщения, что папка пуста - public String getEmtyFolderMessage() { - return getDriver().findElement(EMTY_FOLDER_MESSAGE).getText(); - } -} diff --git a/src/main/java/Itacademy/Test/BaseTest.java b/src/main/java/Itacademy/Test/BaseTest.java deleted file mode 100644 index 516a2e9..0000000 --- a/src/main/java/Itacademy/Test/BaseTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package Itacademy.Test; - -import java.util.concurrent.TimeUnit; -import org.openqa.selenium.UnexpectedAlertBehaviour; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.chrome.ChromeDriver; -import org.openqa.selenium.remote.CapabilityType; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.testng.annotations.AfterSuite; -import org.testng.annotations.BeforeSuite; - -public class BaseTest { - - public static final String LOGIN = "kalacheva.tamara@bk.ru"; - public static final String PASSWORD = "&YPviFA1zpu1"; - public static final String INVALID_LOGIN = "kalachevaaaa.tamara@bk.ru"; - public static final String INVALID_PASSWORD = "&YPviFA1zpu1po"; - public static final String LOGIN_URL = "https://account.mail.ru/login"; - - - public static WebDriver driver = null; - - - public WebDriver getDriver() { - return driver; - } - - @BeforeSuite(alwaysRun = true)//открывает браузер перед выполнением сценария suite - public void setup() { - System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe"); - - // from here: https://stackoverflow.com/questions/26772793/org-openqa-selenium-unhandledalertexception-unexpected-alert-open - DesiredCapabilities dc = new DesiredCapabilities(); - dc.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); - - driver = new ChromeDriver(dc); - driver.manage().window().maximize(); - driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); - - } - - @AfterSuite - public void tearDown() { - getDriver().quit(); - } - -} diff --git a/src/main/java/Itacademy/Test/LoginTest.java b/src/main/java/Itacademy/Test/LoginTest.java deleted file mode 100644 index 22e6435..0000000 --- a/src/main/java/Itacademy/Test/LoginTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package Itacademy.Test; - -import Itacademy.Page.LoginPage; -import org.testng.Assert; -import org.testng.annotations.Test; - -public class LoginTest extends BaseTest { - - - @Test(priority = 1) - public void loginToMailTest() { - getDriver().get(LOGIN_URL); - LoginPage loginPage = new LoginPage(getDriver()); - - loginPage.doLogin(LOGIN, PASSWORD); - - Assert.assertEquals(loginPage.getLoggedUserMail(), LOGIN, - "Testing of logging with valid data is failed"); - loginPage.doLogout(); - - } - - @Test(priority = 2) - public void negativeLoginToMailTest() { - getDriver().get("https://account.mail.ru/login"); - LoginPage loginPage = new LoginPage(getDriver()); -// проверяем неправильный логин - loginPage.enterLogin(INVALID_LOGIN); - Assert.assertEquals(loginPage.getErrorLoginMessage(), "Такой аккаунт не зарегистрирован", - "Invalid Error message"); - -// проверяем неправильный пароль - loginPage.enterLogin(LOGIN); - loginPage.enterPassword(INVALID_PASSWORD); - Assert.assertEquals(loginPage.getErrorLoginMessage(), "Неверный пароль, попробуйте ещё раз", - "Invalid Error message"); - } -} - diff --git a/src/main/java/by/academy/it/framework/Browser.java b/src/main/java/by/academy/it/framework/Browser.java new file mode 100644 index 0000000..bd9bc40 --- /dev/null +++ b/src/main/java/by/academy/it/framework/Browser.java @@ -0,0 +1,127 @@ +package by.academy.it.framework; + +import java.util.concurrent.TimeUnit; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.UnexpectedAlertBehaviour; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.internal.WrapsDriver; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Wait; +import org.openqa.selenium.support.ui.WebDriverWait; + +// класс отвечающий за настройку веб-дрфйвера +public class Browser implements WrapsDriver { + + //поле для хранения экземпляра Browser класса + private static Browser instance; + private static WebDriver driver; + private static Wait wait; + + // приватный конструктор, чтобы реализовать синглтон и не позволить создавать new Btowser() вне этого класса + //По примеру Степана + private Browser() { + System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe"); + // from here: https://stackoverflow.com/questions/26772793/org-openqa-selenium-unhandledalertexception-unexpected-alert-open + // ПОзволяет настроить поведение драйвера. В нашем случае он нажимает на кнопку "ПРИНЯТЬ" + // во всех АЛЕРТАХ которые будут показываться браузером + DesiredCapabilities dc = new DesiredCapabilities(); + dc.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); + driver = new ChromeDriver(dc); + // разворачиваем окно на весь экран + driver.manage().window().maximize(); + // неявное ожидание браузера в 30 секунд + driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); + // Создаем и настраиваем объект для ЯВНЫХ ожиданий. Ждет 10 секунд, опрашивая ДОМ каздые 0.5 секунд + wait = new WebDriverWait(driver, 10, 500) + .withMessage("Element was not found in X seconds"); + } + + //Метод, который надо вызывать вместо new Browser(), чтобы получить экземпляр синглтора + public static Browser getInstance() { + if (instance == null || driver == null) { + instance = new Browser(); + } + return instance; + } + + @Override + //Единственный метод интерфейса WrapsDriver который нужно реализовать (взято из примера Степана) + public WebDriver getWrappedDriver() { + return driver; + } + + public void stopBrowser() { + try { + getInstance().getWrappedDriver().quit(); + getInstance().driver = null; + instance = null; + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void open(String url) { + driver.get(url); + } + + public void refresh() { + driver.navigate().refresh(); + } + + // from here: https://stackoverflow.com/questions/10660291/highlight-elements-in-webdriver-during-runtime + // Подсвечиваем элемент красной рамкой + public WebElement highlightElement(WebElement element) { + if (driver instanceof JavascriptExecutor) { + ((JavascriptExecutor) driver) + .executeScript("arguments[0].style.border='3px solid red'", element); + } + return element; + } + + //клик правой кнопкой мыши по элементу + public void doRightMouseClick(String xPath) { + Actions builder = new Actions(driver); + WebElement element = driver.findElement(By.xpath(xPath)); + builder.contextClick(element).build().perform(); + } + + //ждет пока не произойдет StaleElementReferenceException у элемента (ждет пока элемент не удалиться со странички Жаваскриптом и не будет добавлен на нее снова) + public void waitStaleness(String xPath) { + wait.until(ExpectedConditions.stalenessOf(driver.findElement(By.xpath(xPath)))); + } + + // from here: https://stackoverflow.com/questions/15237129/webdriverwait-for-an-element-attribute-to-change + //ждет пока не появится атрибут + public boolean waiteForAttribute(final By by, final String atributeName) { + return wait.until(new ExpectedCondition() { + public Boolean apply(WebDriver driver) { + WebElement element = driver.findElement(by); + String attributeValue = element.getAttribute(atributeName); + if (attributeValue != null) { + return true; + } else { + return false; + } + } + }); + } + + // Ждет пока указанный элемент не появится на странице и не станет видимым (опрос элемента происходит в соответствии с настройками wait) + public WebElement waitVisible(String xpathLocator) { + //Ждем пока элемент не появится на странице (presenceOfElementLocated). + wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(xpathLocator))); + //Ждем пока элемент не станет видимым на странице. + WebElement el = wait + .until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xpathLocator))); + //Этот метод - единственное место через готорое мы обращаеся к элементам страницы. поэтому подсвечиваем только тут. + el = highlightElement(el); + return el; + } +} diff --git a/src/main/java/by/academy/it/framework/Log.java b/src/main/java/by/academy/it/framework/Log.java new file mode 100644 index 0000000..ab5a04a --- /dev/null +++ b/src/main/java/by/academy/it/framework/Log.java @@ -0,0 +1,70 @@ +package by.academy.it.framework; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; + +// Класс написан просто для примера. Целесообразнее вызывать логгер и его методы напрямую в классе. +public class Log { + + private static final Logger logger = Logger.getLogger("by.academy.it"); + + static { + PropertyConfigurator.configureAndWatch("log4j/log4j.properties"); + } + + public static void info(Logger log, Object message) { + log.info(message); + } + + public static void debug(Logger log, Object message) { + log.debug(message); + } + + public static void error(Logger log, Object message) { + log.error(message); + } + + public static void info(Object message) { + logger.info(message); + } + + public static void debug(Object message) { + logger.debug(message); + } + + public static void error(Object message) { + logger.error(message); + } + + + public static void debugStart(Logger log, Object... params) { + String message = getMethodName(27) + "()"; + if (params != null && params.length > 0) { + message = message + " PARAMS:" + params.toString(); + } + log.debug(message + " START"); + } + + public static void debugEnd(Logger log, Object returnObject) { + String message = getMethodName(27) + "()"; + if (returnObject != null) { + message = message + " RETURNS:" + returnObject.toString(); + } + log.debug(message + " END"); + } + + public static void debugEnd(Logger log) { + String message = getMethodName(27) + "()"; + log.debug(message + " END"); + } + + // from here: https://stackoverflow.com/questions/442747/getting-the-name-of-the-currently-executing-method + //Динамически достаем из стека ИМЯ МЕТОДА в котором вызывался лог, чтобы не писать его руками + private static String getMethodName(final int depth) { + final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); + // Arrays.asList(ste).stream().forEach(x->logg.debug(x.getClassName())); + //System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName()); + // return ste[ste.length - depth].getMethodName(); //Wrong, fails for depth = 0 + return ste[ste.length - 1 - depth].getMethodName(); //Thank you Tom Tresansky + } +} diff --git a/src/main/java/by/academy/it/framework/TestingListener.java b/src/main/java/by/academy/it/framework/TestingListener.java new file mode 100644 index 0000000..795cb37 --- /dev/null +++ b/src/main/java/by/academy/it/framework/TestingListener.java @@ -0,0 +1,54 @@ +package by.academy.it.framework; + +import org.testng.ITestContext; +import org.testng.ITestListener; +import org.testng.ITestResult; + +public class TestingListener implements ITestListener { + + private long methodStartTime; + + @Override + public void onStart(ITestContext iTestContext) { + Log.info("\n" + "[TEST STARTED]" + iTestContext.getName()); + } + + @Override + public void onFinish(ITestContext iTestContext) { + Log.info("[TEST ENDED]" + iTestContext.getName() + + "\n" + "PASSED: " + iTestContext.getPassedTests().size() + + "\n" + "SKIPPED: " + iTestContext.getSkippedTests().size() + + "\n" + "FAILED: " + iTestContext.getFailedTests().size()); + } + + @Override + public void onTestStart(ITestResult iTestResult) { + methodStartTime = iTestResult.getStartMillis(); + Log.info("[TEST METHOD STARTED]" + iTestResult.getName()); + } + + @Override + public void onTestSuccess(ITestResult iTestResult) { + Log.info("[TEST METHOD SUCCESSFULLY COMPLETED]" + iTestResult.getName() + " SPENT TIME(ms): " + + (iTestResult.getEndMillis() - methodStartTime)); + } + + @Override + public void onTestFailure(ITestResult iTestResult) { +// Log.error("[TEST METHOD FAILED]" + iTestResult.getName() + " SPENT TIME(ms): " +// + (iTestResult.getEndMillis() - methodStartTime), iTestResult.getThrowable()); +// Browser.getInstance().screenshot(); + } + + @Override + public void onTestSkipped(ITestResult iTestResult) { + Log.info("[TEST METHOD SKIPPED]" + iTestResult.getName()); + } + + @Override + public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { + Log.info("[TEST METHOD FAILED WITHIN SUCCESS PERCENTAGE]" + iTestResult.getName() + + " SPENT TIME(ms): " + + (iTestResult.getEndMillis() - methodStartTime)); + } +} diff --git a/src/main/java/by/academy/it/model/Letter.java b/src/main/java/by/academy/it/model/Letter.java new file mode 100644 index 0000000..2223f96 --- /dev/null +++ b/src/main/java/by/academy/it/model/Letter.java @@ -0,0 +1,32 @@ +package by.academy.it.model; + +public class Letter { + + private String address; + private String topic; + private String message; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/by/academy/it/model/User.java b/src/main/java/by/academy/it/model/User.java new file mode 100644 index 0000000..2c95573 --- /dev/null +++ b/src/main/java/by/academy/it/model/User.java @@ -0,0 +1,23 @@ +package by.academy.it.model; + +public class User { + + private String login; + private String password; + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/src/main/java/by/academy/it/page/BasePage.java b/src/main/java/by/academy/it/page/BasePage.java new file mode 100644 index 0000000..06f8235 --- /dev/null +++ b/src/main/java/by/academy/it/page/BasePage.java @@ -0,0 +1,39 @@ +package by.academy.it.page; + +import by.academy.it.framework.Browser; +import org.apache.log4j.Logger; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class BasePage { + + private static Logger logger = Logger.getLogger(BasePage.class); + private Browser browser; + + public BasePage() { + logger.debug("BasePage constructor start"); + browser = Browser.getInstance(); + logger.debug("BasePage constructor end"); + } + + public WebDriver getDriver() { + logger.debug("getDriver returns driver instance"); + return browser.getWrappedDriver(); + } + + // Ждет пока указанный элемент не появится на странице и не станет видимым (опрос элемента происходит в соответствии с настройками wait) + public WebElement waitVisible(String xpathLocator) { + logger.debug("waitVisible(" + xpathLocator + ") start"); + WebElement el = browser.waitVisible(xpathLocator); + logger.debug("waitVisible(" + xpathLocator + ") end. return:" + el.toString()); + return el; + } + + //ждет пока не произойдет StaleElementReferenceException у элемента + public void waitStaleness(String xPath) { + logger.debug("waitStaleness(" + xPath + ") start"); + browser.waitStaleness(xPath); + logger.debug("waitStaleness(" + xPath + ") end"); + } + +} diff --git a/src/main/java/by/academy/it/page/Constants.java b/src/main/java/by/academy/it/page/Constants.java new file mode 100644 index 0000000..a176bd8 --- /dev/null +++ b/src/main/java/by/academy/it/page/Constants.java @@ -0,0 +1,17 @@ +package by.academy.it.page; + +public class Constants { + + public static final String LOGIN = "kalacheva.tamara@bk.ru"; + public static final String PASSWORD = "&YPviFA1zpu1"; + public static final String INVALID_LOGIN = "kalachevaaaa.tamara@bk.ru"; + public static final String INVALID_PASSWORD = "&YPviFA1zpu1po"; + public static final String LOGIN_URL = "https://account.mail.ru/login"; + public static final String CLOUD_URL = "https://cloud.mail.ru"; + + public static final String TOPIC = "test letter"; + public static final String TEXT = "Some message "; + public static final String EMPTY = ""; + public static final String DRAFT_ADDRESS = "draft@mail.ru"; + +} diff --git a/src/main/java/by/academy/it/page/cloud/CloudPage.java b/src/main/java/by/academy/it/page/cloud/CloudPage.java new file mode 100644 index 0000000..d170669 --- /dev/null +++ b/src/main/java/by/academy/it/page/cloud/CloudPage.java @@ -0,0 +1,206 @@ +package by.academy.it.page.cloud; + +import by.academy.it.framework.Log; +import by.academy.it.page.BasePage; +import org.apache.log4j.Logger; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; + +public class CloudPage extends BasePage { + + private static final String CREATE = "//div[text()='Создать']"; + private static final String NEW_FOLDER = "//div[text()='Папку']"; + private static final String FOLDER_NAME = "//input[@placeholder='Введите имя папки']"; + private static final String CREATE_FOLDER_BUTTON = "//button[text()='Создать']"; + private static final String NEW_FOLDER_BREADCRUMB_PREFIX = "// div[@id='breadcrumbs']//span[text()='"; + private static final String NEW_FOLDER_BREADCRUMB_POSTFIX = "']"; + private static final String FOLDER_PATH_PREFIX = "//*[@data-id='/"; + private static final String FOLDER_PATH_POSTFIX = "']/parent::a"; + private static final String DELETE_FOLDER = "//div[text()='Удалить']"; + private static final String APPROVE_FOLDER_REMOVE = "//button[@data-name='remove']"; + private static final String REMOVE_MESSAGE = "//span[text()='Удалено: 1 папка']"; + private static final String CLOSE_DIALOG = "//div[@class='layer_trashbin-tutorial']//button[@data-name='close']"; + private static final String UPLOAD = "//div[contains(@class,'Toolbar__root')]//div[@data-name='upload']"; + private static final String FILE_PATH_INPUT = "//div[contains(@class,'layer_upload__controls__btn-wrapper')]//input[@type='file']"; + private static final String UPLOAD_MESSAGE = "//span[contains(text(),'Загрузка завершена')]"; + private static final String FILE_PATH_PREFIX = "//div[contains(@data-id,'"; + private static final String FILE_PATH_POSTFIX = "') and @data-name='link']"; + private static final String XPATH_PREFIX = "//div[contains(@data-id,'"; + private static final String XPATH_POSTFIX = "') and @data-name='link']"; + private static final String SELECT_FILE_CHECKBOX = "//div[@class='b-checkbox__box']"; + private static final String MOVE_CONFIRM_BUTTON = "// div[@class='layer_move-confirm']//button[@data-name='move']"; + private static final String FOLDER_NAME_PREFIX = "//div[@class='navmenu']//div[@data-id='/"; + private static final String FOLDER_NAME_POSTFIX = "']"; + private static final String ROOT_FOLDER = "//div[@class='navmenu']//a[@href='/home/']"; + private static final String ROOT_FOLDER_BREADCRUMBS = "// div[@id='breadcrumbs']//span[text()='Облако']"; + private static final String SHARE_PREFIX = "//div[contains(@data-id,'"; + private static final String SHARE_POSTFIX = "') and @data-name='link']"; + private static final String PUBLISH_BUTTON = "//button[@data-name='publish']"; + private static final String COPY_LINK = "//input[@title='Скопировать']"; + private static final String SHARED_FILE_PREFIX = "//div[text()='"; + private static final String SHARED_FILE_POSTFIX = "']"; + private static final String CLOSE_DIALOG_COMMERCIAL = "//div[contains(@class, 'Dialog__root_whiteCloseIcon')]/*[name()= 'svg']"; + private static final String EMPTY_FOLDER_MESSAGE = "//div[text()='В этой папке нет содержимого']"; + private static Logger logger = Logger.getLogger(CloudPage.class); + + public CloudPage() { + super(); + logger.debug("CloudPage constructor finished"); + } + + //создаем папку в облаке + public void createNewFolder(String name) { + logger.debug("createNewFolder()" + name +"start"); + + waitVisible(CREATE).click(); + waitVisible(NEW_FOLDER).click(); + waitVisible(FOLDER_NAME).sendKeys(name); + waitVisible(CREATE_FOLDER_BUTTON).click(); + logger.debug("PREFIX " + NEW_FOLDER_BREADCRUMB_PREFIX); + waitVisible(NEW_FOLDER_BREADCRUMB_PREFIX + name + NEW_FOLDER_BREADCRUMB_POSTFIX); + + logger.debug("createNewFolder()" + name +"end"); + } + + //проверяем, что папка создана + public boolean isFolderExist(String folderName) { + logger.debug("isFolderExist(" + folderName + ") start"); + boolean result = false; + try { + //генерим динамический xPath для переданного в параметре метода имени папки + String xpathString = FOLDER_PATH_PREFIX + folderName + FOLDER_PATH_POSTFIX; + waitVisible(xpathString); + result = true; + } catch (Exception e) { + e.printStackTrace(); + result = false; + } + logger.debug("isFolderExist(" + folderName + ") end. return:" + result); + return result; + } + + //удаляем папку + public void removeFolder(String name) { + logger.debug("removeFolder(" + name + ") start"); + String xpathString = FOLDER_PATH_PREFIX + name + FOLDER_PATH_POSTFIX; + waitVisible(xpathString).click(); + waitVisible(DELETE_FOLDER).click(); + waitVisible(APPROVE_FOLDER_REMOVE).click(); + waitVisible(REMOVE_MESSAGE); + //закрываем диалог + waitVisible(CLOSE_DIALOG).click(); + logger.debug("removeFolder(" + name + ") end"); + } + + // загрузить файл + public void uploadFile(String filePath) { + logger.debug("removeFolder(" + filePath + ") start"); + waitVisible(UPLOAD).click(); + getDriver().findElement(By.xpath(FILE_PATH_INPUT)).sendKeys(filePath); + //ждем пока закончится загрузка(10с) + waitVisible(UPLOAD_MESSAGE); + logger.debug("removeFolder(" + filePath + ") end"); + } + + //проверяем, что файл загружен + public boolean isFileUploaded(String fileName) { + logger.debug("isFileUploaded(" + fileName + ") start"); + boolean result = false; + try { + //генерим динамический xPath для переданного в параметре метода имени папки + String xpathString = FILE_PATH_PREFIX + fileName + FILE_PATH_POSTFIX; + waitVisible(xpathString); + result = true; + } catch (Exception e) { + e.printStackTrace(); + result = false; + } + logger.debug("isFileUploaded(" + fileName + ") end. return:" + result); + return result; + } + + // перетягивание файла в папку + public void moveFileToFolder(String folderName, String fileName) { + logger.debug("moveFileToFolder(" + folderName + ", " + fileName + ") start"); + WebElement file = waitVisible(XPATH_PREFIX + fileName + XPATH_POSTFIX); + WebElement folder = waitVisible(XPATH_PREFIX + folderName + XPATH_POSTFIX); + file.findElement(By.xpath(SELECT_FILE_CHECKBOX)).click(); + Actions builder = new Actions(getDriver()); + builder.clickAndHold(file) + .moveToElement(folder) + .moveByOffset(5, 5) + .release() + .build() + .perform(); + waitVisible(MOVE_CONFIRM_BUTTON).click(); + logger.debug("moveFileToFolder(" + folderName + ", " + fileName + ") end"); + } + + // переходим в указанную папку + public void goToFolder(String nameFolder) { + logger.debug("goToFolder(" + nameFolder + ") start"); + waitStaleness(FOLDER_NAME_PREFIX + nameFolder + FOLDER_NAME_POSTFIX); + waitVisible(FOLDER_NAME_PREFIX + nameFolder + FOLDER_NAME_POSTFIX).click(); + waitVisible(NEW_FOLDER_BREADCRUMB_PREFIX + nameFolder + NEW_FOLDER_BREADCRUMB_POSTFIX); + logger.debug("goToFolder(" + nameFolder + ") end"); + } + + // переходим в корневую папку + public void goToRootFolder() { + logger.debug("goToRootFolder() start"); + waitVisible(ROOT_FOLDER).click(); + waitVisible(ROOT_FOLDER_BREADCRUMBS); + logger.debug("goToRootFolder() start"); + } + + //возвращает URL на расшаренный файл + public String getShareLink(String fileName) { + logger.debug("getShareLink(" + fileName + ") start"); + WebElement file = waitVisible(SHARE_PREFIX + fileName + SHARE_POSTFIX); + file.findElement(By.xpath(SELECT_FILE_CHECKBOX)).click(); + file.findElement(By.xpath(PUBLISH_BUTTON)).click(); + String result = waitVisible(COPY_LINK).getAttribute("value"); + logger.debug("getShareLink(" + fileName + ") end. return:" + result); + return result; + } + + // проверяем есть ли ссылка на скачивание расшаренного файла + public boolean isSharedLinkExist(String fileName) { + logger.debug("isSharedLinkExist(" + fileName + ") start"); + boolean result = false; + try { + //генерим динамический xPath для переданного в параметре метода имени файла + String xpathString = SHARED_FILE_PREFIX + fileName + SHARED_FILE_POSTFIX; + waitVisible(xpathString); + result = true; + } catch (Exception e) { + e.printStackTrace(); + result = false; + } + logger.debug("isSharedLinkExist(" + fileName + ") end. return:" + result); + return result; + } + + //закрываем рекламный диалог + public void closeDialog() { + logger.debug("closeDialog() start"); + waitVisible(CLOSE_DIALOG_COMMERCIAL).click(); + logger.debug("closeDialog() end"); + } + + //проверям пустая ли папка + public boolean isFolderEmpty() { + logger.debug("isFolderEmpty() start"); + boolean result = false; + try { + waitVisible(EMPTY_FOLDER_MESSAGE); + result = true; + } catch (Exception e) { + e.printStackTrace(); + result = false; + } + logger.debug("isFolderEmpty() end. return:" + result); + return result; + } +} diff --git a/src/main/java/by/academy/it/page/mail/LoginPage.java b/src/main/java/by/academy/it/page/mail/LoginPage.java new file mode 100644 index 0000000..1a201d9 --- /dev/null +++ b/src/main/java/by/academy/it/page/mail/LoginPage.java @@ -0,0 +1,93 @@ +package by.academy.it.page.mail; + +import by.academy.it.model.User; +import by.academy.it.page.BasePage; +import org.apache.log4j.Logger; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; + +public class LoginPage extends BasePage { + + private static final String LOGIN_INPUT_LOCATOR = "//*[contains(@name,'Login')]"; + private static final String ENTER_PASSWORD_BUTTON = "//button "; + private static final String PASSWORD_FIELD = "//*[contains(@name,'Password')]"; + private static final String ENTER_BUTTON = "//*[contains(@type,'submit')]"; + private static final String LOGOUT_LINK = "//*[@id='PH_logoutLink']"; + private static final String LOGIN_LINK = "//*[@id='PH_authLink']"; + private static final String LOGGED_USER_MAIL = "//*[@id='PH_user-email']"; + private static final String LOGIN_ERROR_MESSAGE = "//*[@data-test-id='error-footer-text']"; + private static Logger logger = Logger.getLogger(LoginPage.class); + + public LoginPage() { + logger.debug("LoginPage constructor finished"); + } + + //выполнит вход в майл по указанному логину и паролю + public void doLogin(String login, String password) { + logger.debug("doLogin(" + login + ", " + password + ") start"); + //вызвали метод для ввода логина + enterLogin(login); + //вводим пароль + enterPassword(password); + waitVisible(LOGGED_USER_MAIL); + logger.debug("doLogin(" + login + ", " + password + ") end"); + } + + public void doLogin(User user) { + logger.info("doLogin(" + user.toString() + ") start"); + //вызвали метод для ввода логина + enterLogin(user.getLogin()); + //вводим пароль + enterPassword(user.getPassword()); + waitVisible(LOGGED_USER_MAIL); + logger.info("doLogin(" + user.toString() + ") end"); + } + + public void enterPassword(String password) { + logger.debug("enterPassword(" + password + ") start"); + //вводим пароль + WebElement passwordField = waitVisible(PASSWORD_FIELD); + passwordField.sendKeys(Keys.chord(Keys.CONTROL, "a", Keys.DELETE)); + passwordField.sendKeys(password); + // ищем кнопку для входа на страницу и жмем ее + WebElement enterButton = waitVisible(ENTER_BUTTON); + enterButton.click(); + logger.debug("enterPassword(" + password + ") end"); + } + + public void enterLogin(String login) { + logger.debug("enterLogin(" + login + ") start"); + WebElement loginField = waitVisible(LOGIN_INPUT_LOCATOR); + loginField.sendKeys(Keys.chord(Keys.CONTROL, "a", Keys.DELETE)); + loginField.sendKeys(login); + // нажимаем по enter password кнопке + WebElement enterPasswordButton = waitVisible(ENTER_PASSWORD_BUTTON); + enterPasswordButton.click(); + logger.debug("enterLogin(" + login + ") end"); + } + + // выходим из почты + public void doLogout() { + logger.debug("doLogout() start"); + WebElement logoutButton = waitVisible(LOGOUT_LINK); + logoutButton.click(); + waitVisible(LOGIN_LINK); + logger.debug("doLogout() end"); + } + + // возвращает email залогиненного usera + public String getLoggedUserMail() { + logger.debug("getLoggedUserMail() start"); + WebElement loggedUserMail = waitVisible(LOGGED_USER_MAIL); + logger.debug("getLoggedUserMail() end. return:" + loggedUserMail.getText()); + return loggedUserMail.getText(); + } + + // возвращает ошибку не верного логина + public String getErrorLoginMessage() { + logger.debug("getErrorMessage() start"); + WebElement errorMessage = waitVisible(LOGIN_ERROR_MESSAGE); + logger.debug("getErrorMessage() end. return:" + errorMessage.getText()); + return errorMessage.getText(); + } +} diff --git a/src/main/java/by/academy/it/page/mail/MailPage.java b/src/main/java/by/academy/it/page/mail/MailPage.java new file mode 100644 index 0000000..f1792f7 --- /dev/null +++ b/src/main/java/by/academy/it/page/mail/MailPage.java @@ -0,0 +1,260 @@ +package by.academy.it.page.mail; + +import by.academy.it.model.Letter; +import by.academy.it.page.BasePage; +import org.apache.log4j.Logger; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; + +public class MailPage extends BasePage { + + private static final String NEW_MAIL_BUTTON = "//*[text()=\"Написать письмо\"]"; + private static final String ADDRES_FIELD = "//div[contains(@class, 'fields_container')]//input"; + private static final String TOPIC_FIELD = "//div[contains(@class, 'subject__wrapper')]//input"; + private static final String MAIL_TEXT_FIELD = "//div[@role='textbox']"; + private static final String SEND_BUTTON = "//span[text()=\"Отправить\"]"; + private static final String SENT_EMAILS_BUTTON = "//a[@href=\"/sent/\"]"; + private static final String INBOX_EMAILS_BUTTON = "//a[@href=\"/inbox/\"]"; + private static final String CLOSE_DIALOG_BUTTON = "//span[@title='Закрыть']"; + private static final String SELECT_ALL_BUTTON = "//span[@title='Выделить все']/parent::div"; + private static final String DELETE_EMAILS_BUTTON = "//span[@title=\"Удалить\"]/parent::div"; + private static final String INBOX_URL = "https://e.mail.ru/inbox/"; + private static final String EMTY_FOLDER_MESSAGE = "//div[@class='octopus__text']"; + private static final String CLEAR_EMAILS_ELEMENT = "//div[@class='layer__submit-button']//span[text()='Очистить']"; + private static final String ERROR_MESSAGE = "//div[contains(@class, 'rowError')]"; + private static final String CLOSE_NEW_EMAIL_DIALOG = "//button[contains(@title, 'Закрыть')]"; + private static final String CANCEL_EMAEL = "//span[text()='Отменить']"; + private static final String SAVE_DRAFT_EMAIL = "//span[text()='Сохранить']"; + private static final String NOTIFY_MESSAGE_TEXT = "//span[@class='notify__message__text']"; + private static final String CLOSE_NOTIFY_MESSAGE = "//div[contains(@class,'notify__body')]//div[@class='notify__ico-close']"; + private static final String SEND_EMPTY_BOOTON = "//div[@data-test-id='confirmation:empty-letter']//span[text()='Отправить']/parent::button"; + private static final String DRAFT_FOLDER = "//a[@href='/drafts/']"; + private static final String TRASH_FOLDER = "//a[@href='/trash/']"; + private static final String E_PREFIX = "//span[contains(@title, '"; + private static final String E_POSTFIX = "')]"; + private static Logger logger = Logger.getLogger(MailPage.class); + + public MailPage() { + super(); + logger.debug("MailPage constructor finished"); + } + + //Создает и отправляет новое письмо + public void sendNewMail(String addres, String topic, String text) { + logger.debug("sendNewMail() start"); + newMail(); + fillAddres(addres); + fillTopic(topic); + fillMailText(text); + sendMail(); + if (addres.trim().isEmpty()) { + return; + } + if (text.trim().isEmpty()) { + // подтверждаем отправку пустого письма + WebElement sendEmtyButton = waitVisible(SEND_EMPTY_BOOTON); + sendEmtyButton.click(); + } + closeSentEmailDialog(); + logger.debug("sendNewMail() end"); + } + + // отправляет новое письмо + public void sendNewMail(Letter letter) { + logger.debug("sendNewMail() start"); + newMail(); + fillAddres(letter.getAddress()); + fillTopic(letter.getTopic()); + fillMailText(letter.getMessage()); + sendMail(); + if (letter.getAddress().trim().isEmpty()) { + return; + } + if (letter.getMessage().trim().isEmpty()) { + // подтверждаем отправку пустого письма + WebElement sendEmtyButton = waitVisible(SEND_EMPTY_BOOTON); + sendEmtyButton.click(); + } + closeSentEmailDialog(); + logger.debug("sendNewMail() end"); + } + + // создает и сохраняет черновик письма + public void createDraftMail(String addres, String topic, String text) { + logger.debug("createDraftMail() start"); + newMail(); + fillAddres(addres); + fillTopic(topic); + fillMailText(text); + saveDraftEmail(); + logger.debug("createDraftMail() end"); + } + + //написать письмо + public void newMail() { + logger.debug("newMail() start"); + waitVisible(NEW_MAIL_BUTTON).click(); + logger.debug("newMail() end"); + } + + //заполняет адрес письма "Кому"(адрес) + public void fillAddres(String addres) { + logger.debug("fillAddres() start"); + WebElement addresField = waitVisible(ADDRES_FIELD); + addresField.sendKeys(addres); + logger.debug("fillAddres() end"); + } + + //заполняет тему письма + public void fillTopic(String topic) { + logger.debug("fillTopic() start"); + WebElement topicField = waitVisible(TOPIC_FIELD); + topicField.sendKeys(topic); + logger.debug("fillTopic() end"); + } + + // заполняет тело письма + public void fillMailText(String text) { + logger.debug("fillMailText() start"); + WebElement mailText = waitVisible(MAIL_TEXT_FIELD); + mailText.sendKeys(text); + logger.debug("fillMailText() end"); + } + + //отправляет письмо + public void sendMail() { + logger.debug("sendMail() start"); + WebElement sendButton = waitVisible(SEND_BUTTON); + sendButton.click(); + logger.debug("sendMail() end"); + } + + // заходим в папку отправленные + public void goToSentEmails() { + logger.debug("goToSentEmails() start"); + WebElement sentEmailsButton = waitVisible(SENT_EMAILS_BUTTON); + Actions builder = new Actions(getDriver()); + builder.moveToElement(sentEmailsButton) + .click() + .pause(500) + .build() + .perform(); + // sentEmailsButton.click(); + logger.debug("goToSentEmails() end"); + } + + //заходим папку входящие + public void goToInboxEmails() { + logger.debug("goToInboxEmails() start"); + WebElement InboxEmailsButton = waitVisible(INBOX_EMAILS_BUTTON); + InboxEmailsButton.click(); + logger.debug("goToInboxEmails() end"); + } + + //заходим папку Черновики + public void goToDraftEmails() { + logger.debug("goToDraftEmails() start"); + waitVisible(DRAFT_FOLDER).click(); + logger.debug("goToDraftEmails() end"); + } + + //заходим папку Удаленные + public void goToTrashEmails() { + logger.debug("goToTrashEmails() start"); + waitVisible(TRASH_FOLDER).click(); + logger.debug("goToTrashEmails() end"); + } + + //проверяем есть ли письмо от указанного адреса + public boolean isMailExist(String addres) { + logger.debug("isMailExist() start"); + boolean result = false; + try { + String xpathString = E_PREFIX + addres + E_POSTFIX; + // waitStaleness(xpathString); + WebElement email = waitVisible(xpathString); + result = true; + } catch (Exception e) { + logger.error("Error while checking if mail exists", e); + e.printStackTrace(); + result = false; + } + logger.debug("isMailExist() end"); + return result; + } + + //закрываем диалоговое окно об отправке письма + public void closeSentEmailDialog() { + logger.debug("closeSentEmailDialog() start"); + WebElement closeDialogButton = waitVisible(CLOSE_DIALOG_BUTTON); + closeDialogButton.click(); + logger.debug("closeSentEmailDialog() start"); + } + + //удаление всех писем в текущей папке + public void deleteAllLetters() { + logger.debug("deleteAllLetters() start"); + WebElement selectALL = waitVisible(SELECT_ALL_BUTTON); + selectALL.click(); + WebElement deleteElement = waitVisible(DELETE_EMAILS_BUTTON); + deleteElement.click(); + //Кейс для папки ИНБОКС (нужно закрыть диалоговое окно и подтвердить удаление писем) + String url = getDriver().getCurrentUrl(); + if (url.equals(INBOX_URL)) { + try { + WebElement clearEmailsElement = waitVisible(CLEAR_EMAILS_ELEMENT); + clearEmailsElement.click(); + } catch (Exception e) { + e.printStackTrace(); + } + } + waitVisible(NOTIFY_MESSAGE_TEXT); + waitVisible(CLOSE_NOTIFY_MESSAGE).click(); + logger.debug("deleteAllLetters() end"); + } + + // метод на проверку пустой папки + public boolean emptyFolder() { + logger.debug("emptyFolder() check if folder is empty"); + return waitVisible(EMTY_FOLDER_MESSAGE).isDisplayed(); + } + + //возвращает текст ошибки "Не указан адрес получателя" + public String getNoAddressErrorMessage() { + logger.debug("getNoAddressErrorMessage() start"); + WebElement element = waitVisible(ERROR_MESSAGE); + logger.debug("getNoAddressErrorMessage() end"); + return element.getText(); + } + + //закрывает окно нового письма + public void closeNewEmailDialog() { + logger.debug("closeNewEmailDialog() start"); + waitVisible(CLOSE_NEW_EMAIL_DIALOG).click(); + logger.debug("closeNewEmailDialog() end"); + } + + // нажимает кнопку "Отменить" в новом письме + public void cancelEmail() { + logger.debug("cancelEmail() start"); + waitVisible(CANCEL_EMAEL).click(); + logger.debug("cancelEmail() end"); + } + + // сохраняет письмо в черновики + public void saveDraftEmail() { + logger.debug("saveDraftEmail() start"); + waitVisible(SAVE_DRAFT_EMAIL).click(); + //ждем пока не появится сообщение "Сохранено в черновиках в 16:35" + waitVisible(NOTIFY_MESSAGE_TEXT); + //закрыть уведомление + waitVisible(CLOSE_NOTIFY_MESSAGE).click(); + logger.debug("saveDraftEmail() end"); + } + + // получает текст сообщения, что папка пуста + public String getEmtyFolderMessage() { + logger.debug("getEmtyFolderMessage() returns message"); + return waitVisible(EMTY_FOLDER_MESSAGE).getText(); + } +} diff --git a/src/main/java/by/academy/it/runner/GlobalRunner.java b/src/main/java/by/academy/it/runner/GlobalRunner.java new file mode 100644 index 0000000..0b22b1a --- /dev/null +++ b/src/main/java/by/academy/it/runner/GlobalRunner.java @@ -0,0 +1,20 @@ +package by.academy.it.runner; + +import java.util.List; +import org.testng.TestNG; +import org.testng.collections.Lists; + +/** + * CommonRunner for all test siute files + */ +public class GlobalRunner { + + public static void main(String[] args) { + TestNG testng = new TestNG(); + List suites = Lists.newArrayList(); + suites.add("src/main/resources/mail/suite.xml"); + suites.add("src/main/resources/cloud/suite.xml"); + testng.setTestSuites(suites); + testng.run(); + } +} diff --git a/src/main/java/by/academy/it/runner/cloud/Runner.java b/src/main/java/by/academy/it/runner/cloud/Runner.java new file mode 100644 index 0000000..67f31d1 --- /dev/null +++ b/src/main/java/by/academy/it/runner/cloud/Runner.java @@ -0,0 +1,18 @@ +package by.academy.it.runner.cloud; + +import java.util.Arrays; +import java.util.List; +import org.testng.TestNG; + +/** + * CommonRunner for CLOUD tests + */ +public class Runner { + + public static void main(String[] args) { + TestNG testNG = new TestNG(); + List file = Arrays.asList("./src/main/resources/cloud/suite.xml"); + testNG.setTestSuites(file); + testNG.run(); + } +} diff --git a/src/main/java/Itacademy/Runner.java b/src/main/java/by/academy/it/runner/mail/Runner.java similarity index 67% rename from src/main/java/Itacademy/Runner.java rename to src/main/java/by/academy/it/runner/mail/Runner.java index 4759fee..5d579ff 100644 --- a/src/main/java/Itacademy/Runner.java +++ b/src/main/java/by/academy/it/runner/mail/Runner.java @@ -1,4 +1,4 @@ -package Itacademy; +package by.academy.it.runner.mail; import java.util.Arrays; import java.util.List; @@ -11,9 +11,8 @@ public class Runner { public static void main(String[] args) { TestNG testNG = new TestNG(); - List file = Arrays.asList("./src/main/resources/suite.xml"); + List file = Arrays.asList("./src/main/resources/mail/suite.xml"); testNG.setTestSuites(file); testNG.run(); - System.out.println("stop"); } } diff --git a/src/main/java/by/academy/it/service/cloud/CloudService.java b/src/main/java/by/academy/it/service/cloud/CloudService.java new file mode 100644 index 0000000..61f30c1 --- /dev/null +++ b/src/main/java/by/academy/it/service/cloud/CloudService.java @@ -0,0 +1,86 @@ +package by.academy.it.service.cloud; + +import static by.academy.it.page.Constants.CLOUD_URL; + +import by.academy.it.framework.Browser; +import by.academy.it.page.cloud.CloudPage; +import by.academy.it.service.mail.LoginService; + +public class CloudService { + + private LoginService loginService; + private Browser browser; + private CloudPage cloudPage; + + public CloudService() { + loginService = new LoginService(); + browser = Browser.getInstance(); + cloudPage = new CloudPage(); + } + + public void enterCloud() { + loginService.doLogin(); + browser.open(CLOUD_URL); + } + + public void openCloud() { + browser.open(CLOUD_URL); + } + + public void createNewFolder(String name) { + cloudPage.createNewFolder(name); + } + + public boolean isFolderExist(String folderName) { + return cloudPage.isFolderExist(folderName); + } + + public boolean isFolderEmpty() { + return cloudPage.isFolderEmpty(); + } + + //закрываем рекламный диалог + public void closeDialog() { + cloudPage.closeDialog(); + } + + //удаляем папку + public void removeFolder(String name) { + cloudPage.removeFolder(name); + } + + // переходим в корневую папку + public void goToRootFolder() { + cloudPage.goToRootFolder(); + } + + // загрузить файл + public void uploadFile(String filePath) { + cloudPage.uploadFile(filePath); + } + + //проверяем, что файл загружен + public boolean isFileUploaded(String fileName) { + return cloudPage.isFileUploaded(fileName); + } + + // перетягивание файла в папку + public void moveFileToFolder(String folderName, String fileName) { + cloudPage.moveFileToFolder(folderName, fileName); + } + + // переходим в указанную папку + public void goToFolder(String nameFolder) { + cloudPage.goToFolder(nameFolder); + } + + //возвращает URL на расшаренный файл + public String getShareLink(String fileName) { + return cloudPage.getShareLink(fileName); + } + + public boolean isSharedLinkExist(String fileName, String sharedFileURL) { + browser.open(sharedFileURL); + return cloudPage.isSharedLinkExist(fileName); + } +} diff --git a/src/main/java/by/academy/it/service/mail/LoginService.java b/src/main/java/by/academy/it/service/mail/LoginService.java new file mode 100644 index 0000000..32abb70 --- /dev/null +++ b/src/main/java/by/academy/it/service/mail/LoginService.java @@ -0,0 +1,91 @@ +package by.academy.it.service.mail; + +import static by.academy.it.page.Constants.INVALID_LOGIN; +import static by.academy.it.page.Constants.INVALID_PASSWORD; +import static by.academy.it.page.Constants.LOGIN; +import static by.academy.it.page.Constants.LOGIN_URL; +import static by.academy.it.page.Constants.PASSWORD; + +import by.academy.it.framework.Browser; +import by.academy.it.model.User; +import by.academy.it.page.mail.LoginPage; + +public class LoginService { + + private Browser browser; + private LoginPage loginPage; + private User validUser; + private User invalidUser; + + public LoginService() { + browser = Browser.getInstance(); + loginPage = new LoginPage(); + validUser = new User(); + validUser.setLogin(LOGIN); + validUser.setPassword(PASSWORD); + invalidUser = new User(); + invalidUser.setLogin(INVALID_LOGIN); + invalidUser.setPassword(INVALID_PASSWORD); + } + + public User getValidUser() { + return validUser; + } + + public User getInvalidUser() { + return invalidUser; + } + + public void doLogin(User user) { + //Браузером открываем страницу на которой можно залогиниться + browser.open(LOGIN_URL); + // Делегируем операцию Логина объекту loginPage + loginPage.doLogin(user); + } + + //логинемся валидным юзером + public void doLogin() { + doLogin(validUser); + } + + public String getLoggedUserMail() { + return loginPage.getLoggedUserMail(); + } + + public void doLogout() { + loginPage.doLogout(); + } + + public void enterLogin(String login) { + browser.open(LOGIN_URL); + loginPage.enterLogin(login); + } + + public void enterInvaildLogin() { + enterLogin(INVALID_LOGIN); + } + + public void enterVaildLogin() { + enterLogin(LOGIN); + } + + public String getErrorMessage() { + return loginPage.getErrorLoginMessage(); + } + + public String getIncorrectLoginExpectedMessage() { + return "Такой аккаунт не зарегистрирован"; + } + + public String getIncorrectPasswordExpectedMessage() { + return "Неверный пароль, попробуйте ещё раз"; + } + + public void enterPassword(String password) { + loginPage.enterPassword(password); + } + + public void enterInvalidPassword() { + loginPage.enterPassword(INVALID_PASSWORD); + } +} diff --git a/src/main/java/by/academy/it/service/mail/MailService.java b/src/main/java/by/academy/it/service/mail/MailService.java new file mode 100644 index 0000000..695fe56 --- /dev/null +++ b/src/main/java/by/academy/it/service/mail/MailService.java @@ -0,0 +1,109 @@ +package by.academy.it.service.mail; + +import static by.academy.it.page.Constants.DRAFT_ADDRESS; +import static by.academy.it.page.Constants.EMPTY; +import static by.academy.it.page.Constants.LOGIN; +import static by.academy.it.page.Constants.TEXT; +import static by.academy.it.page.Constants.TOPIC; + +import by.academy.it.model.Letter; +import by.academy.it.page.mail.MailPage; + +public class MailService { + + private MailPage mailPage; + private Letter validLetter; + private Letter noSubjectNoBodyLetter; + private Letter draftLetter; + private Letter noAddressLetter; + + public MailService() { + mailPage = new MailPage(); + + validLetter = new Letter(); + validLetter.setAddress(LOGIN); + validLetter.setTopic(TOPIC); + validLetter.setMessage(TEXT); + + noSubjectNoBodyLetter = new Letter(); + noSubjectNoBodyLetter.setAddress(LOGIN); + noSubjectNoBodyLetter.setTopic(EMPTY); + noSubjectNoBodyLetter.setMessage(EMPTY); + + draftLetter = new Letter(); + draftLetter.setAddress(DRAFT_ADDRESS); + draftLetter.setTopic(EMPTY); + draftLetter.setMessage(EMPTY); + + noAddressLetter = new Letter(); + noAddressLetter.setAddress(EMPTY); + noAddressLetter.setTopic(TOPIC); + noAddressLetter.setMessage(TEXT); + } + + public void sendNoAddressNewMail() { + mailPage.sendNewMail(noAddressLetter); + } + + public void sendNewNoSubjectNoBodyMail() { + mailPage.sendNewMail(noSubjectNoBodyLetter); + } + + public void sendNewValidMail() { + mailPage.sendNewMail(validLetter); + } + + public void goToSentEmails() { + mailPage.goToSentEmails(); + } + + //проверяем есть ли письмо от указанного адреса + public boolean isMailExist(String addres) { + return mailPage.isMailExist(addres); + } + + public void deleteAllLetters() { + mailPage.deleteAllLetters(); + } + + public void goToInboxEmails() { + mailPage.goToInboxEmails(); + } + + public void closeNewEmailDialog() { + mailPage.closeNewEmailDialog(); + } + + //заходим папку Черновики + public void goToDraftEmails() { + mailPage.goToDraftEmails(); + } + + //заходим папку Удаленные + public void goToTrashEmails() { + mailPage.goToTrashEmails(); + } + + // создает и сохраняет черновик письма + public void createDraftMail() { + mailPage.createDraftMail(draftLetter.getAddress(), draftLetter.getTopic(), + draftLetter.getMessage()); + closeNewEmailDialog(); + } + + public String getEmtyFolderMessage() { + return mailPage.getEmtyFolderMessage(); + } + + public String getExpectedEmtyFolderMessage() { + return "В корзине пусто"; + } + + public String getNoAddressErrorMessage() { + return mailPage.getNoAddressErrorMessage(); + } + + public String getExpectedNoAddressErrorMessage() { + return "Не указан адрес получателя"; + } +} diff --git a/src/main/java/by/academy/it/test/BaseTest.java b/src/main/java/by/academy/it/test/BaseTest.java new file mode 100644 index 0000000..eb00544 --- /dev/null +++ b/src/main/java/by/academy/it/test/BaseTest.java @@ -0,0 +1,20 @@ +package by.academy.it.test; + +import by.academy.it.framework.Browser; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeSuite; + +public class BaseTest { + + private Browser browser; + + @BeforeSuite(alwaysRun = true)//открывает браузер перед выполнением сценария suite + public void setup() { + browser = Browser.getInstance(); + } + + @AfterSuite + public void tearDown() { + browser.stopBrowser(); + } +} diff --git a/src/main/java/by/academy/it/test/cloud/CloudTest.java b/src/main/java/by/academy/it/test/cloud/CloudTest.java new file mode 100644 index 0000000..6244519 --- /dev/null +++ b/src/main/java/by/academy/it/test/cloud/CloudTest.java @@ -0,0 +1,56 @@ +package by.academy.it.test.cloud; + +import by.academy.it.service.cloud.CloudService; +import by.academy.it.test.BaseTest; +import java.io.File; +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +public class CloudTest extends BaseTest { + + private CloudService cloudService = new CloudService(); + + private String folderName = "new_folder"; + private File file = new File("src/main/resources/HelloWorld.txt"); + + @BeforeTest + public void beforeTest() { + cloudService.enterCloud(); + } + + @Test(priority = 1) + public void newFolderTest() { + cloudService.createNewFolder(folderName); + Assert.assertTrue(cloudService.isFolderExist(folderName)); + } + + @Test(dependsOnMethods = {"newFolderTest", "dragAndDropTest", "shareLinkTest"}) + public void removeFolderTest() { + cloudService.openCloud(); + cloudService.closeDialog(); + cloudService.removeFolder(folderName); + Assert.assertTrue(cloudService.isFolderEmpty()); + } + + @Test(priority = 3) + public void uploadFileTest() { + cloudService.goToRootFolder(); + cloudService.uploadFile(file.getAbsolutePath()); + Assert.assertTrue(cloudService.isFileUploaded(file.getName())); + } + + @Test(dependsOnMethods = {"newFolderTest", "uploadFileTest"}) + public void dragAndDropTest() { + cloudService.goToRootFolder(); + cloudService.moveFileToFolder(folderName, file.getName()); + cloudService.goToFolder(folderName); + Assert.assertTrue(cloudService.isFileUploaded(file.getName())); + } + + @Test(dependsOnMethods = {"dragAndDropTest"}) + public void shareLinkTest() { + String sharedFileURL = cloudService.getShareLink(file.getName()); + Assert.assertTrue(cloudService.isSharedLinkExist(file.getName(), sharedFileURL)); + } +} diff --git a/src/main/java/by/academy/it/test/mail/LoginTest.java b/src/main/java/by/academy/it/test/mail/LoginTest.java new file mode 100644 index 0000000..8d6aea1 --- /dev/null +++ b/src/main/java/by/academy/it/test/mail/LoginTest.java @@ -0,0 +1,39 @@ +package by.academy.it.test.mail; + +import by.academy.it.service.mail.LoginService; +import by.academy.it.test.BaseTest; +import org.testng.Assert; +import org.testng.annotations.Test; + +public class LoginTest extends BaseTest { + + private LoginService loginService = new LoginService(); + + @Test(priority = 1) + public void loginToMailTest() { + loginService.doLogin(); + Assert.assertEquals(loginService.getLoggedUserMail(), loginService.getValidUser().getLogin(), + "Testing of logging with valid data failed"); + loginService.doLogout(); + } + + @Test(priority = 2) + public void negativeLoginToMailTest() { + // проверяем неправильный логин + loginService.enterInvaildLogin(); + Assert.assertEquals(loginService.getErrorMessage(), + loginService.getIncorrectLoginExpectedMessage(), + "Invalid Error message"); + } + + @Test(dependsOnMethods = {"negativeLoginToMailTest"}) + public void negativePasswordTest() { + //Вводим правильный логин + loginService.enterVaildLogin(); + // проверяем неправильный пароль + loginService.enterInvalidPassword(); + Assert.assertEquals(loginService.getErrorMessage(), + loginService.getIncorrectPasswordExpectedMessage(), + "Invalid Error message"); + } +} diff --git a/src/main/java/Itacademy/Test/SendMailTest.java b/src/main/java/by/academy/it/test/mail/SendMailTest.java similarity index 51% rename from src/main/java/Itacademy/Test/SendMailTest.java rename to src/main/java/by/academy/it/test/mail/SendMailTest.java index 366bcd8..9fa2d30 100644 --- a/src/main/java/Itacademy/Test/SendMailTest.java +++ b/src/main/java/by/academy/it/test/mail/SendMailTest.java @@ -1,102 +1,94 @@ -package Itacademy.Test; +package by.academy.it.test.mail; -import Itacademy.Page.LoginPage; -import Itacademy.Page.MailPage; +import static by.academy.it.page.Constants.DRAFT_ADDRESS; +import static by.academy.it.page.Constants.LOGIN; + +import by.academy.it.service.mail.LoginService; +import by.academy.it.service.mail.MailService; +import by.academy.it.test.BaseTest; import org.testng.Assert; -import org.testng.annotations.AfterClass; import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class SendMailTest extends BaseTest { - public static final String TOPIC = "Test letter"; - public static final String TEXT = "Some message "; - public static final String EMPTY = ""; - public static final String DRAFT_ADDRESS = "draft@mail.ru"; - - private LoginPage loginPage; - private MailPage mailPage; + private LoginService loginService = new LoginService(); + private MailService mailService = new MailService(); @BeforeTest public void beforeTest() { - System.out.println("beforeClass"); - getDriver().get(LOGIN_URL); - loginPage = new LoginPage(getDriver()); - mailPage = new MailPage(getDriver()); - loginPage.doLogin(LOGIN, PASSWORD); + loginService.doLogin(); } @AfterTest public void afterTest() { - System.out.println("afterClass"); // выходим из почты - loginPage.doLogout(); + loginService.doLogout(); } @Test(priority = 3) - //отправка письма + //отправка письма на свой же адрес (сама себе) public void sendMailTest() { - mailPage.sendNewMail(LOGIN, TOPIC, TEXT); + mailService.sendNewValidMail(); //переходим в папку отправленные - mailPage.goToSentEmails(); + mailService.goToSentEmails(); //проверям есть ли письмо с указанным адресом в текущей папке - Assert.assertTrue(mailPage.isMailExist(LOGIN), "Check mail exists in SENT folder"); + Assert.assertTrue(mailService.isMailExist(LOGIN), "Check mail exists in SENT folder"); //удаляем все письма с текущей папки - mailPage.deleteAllLetters(); + mailService.deleteAllLetters(); //переходим папку входящие - mailPage.goToInboxEmails(); + mailService.goToInboxEmails(); // проверям есть ли письмо с указанным адресом в текущей папке - Assert.assertTrue(mailPage.isMailExist(LOGIN), "Check mail exists in INBOX folder"); - mailPage.deleteAllLetters(); + Assert.assertTrue(mailService.isMailExist(LOGIN), "Check mail exists in INBOX folder"); + mailService.deleteAllLetters(); } @Test(priority = 4) public void sendMainNoSubjectNoBodyTest() { - mailPage.sendNewMail(LOGIN, EMPTY, EMPTY); + mailService.sendNewNoSubjectNoBodyMail(); // заходим в папку отправленные - mailPage.goToSentEmails(); + mailService.goToSentEmails(); //проверям есть ли письмо с указанным адресом в текущей папке(Отправленные) - Assert.assertTrue(mailPage.isMailExist(LOGIN), "Check mail exists in SENT folder"); + Assert.assertTrue(mailService.isMailExist(LOGIN), "Check mail exists in SENT folder"); //удаляем все письма - mailPage.deleteAllLetters(); + mailService.deleteAllLetters(); //заходим в папку Входящие - mailPage.goToInboxEmails(); + mailService.goToInboxEmails(); //проверям есть ли письмо с указанным адресом в текущей папке(Входящие) - Assert.assertTrue(mailPage.isMailExist(LOGIN), "Check mail exists in INBOX folder"); - mailPage.deleteAllLetters(); + Assert.assertTrue(mailService.isMailExist(LOGIN), "Check mail exists in INBOX folder"); + mailService.deleteAllLetters(); } @Test(priority = 5) public void sendMailNoAddressTest() { //отправляем письмо без указания адреса - mailPage.sendNewMail(EMPTY, TOPIC, TEXT); + mailService.sendNoAddressNewMail(); //проверяем что появилось сообщение об ошибке(Не указан адрес получателя) - Assert.assertEquals(mailPage.getNoAddressErrorMessage(), "Не указан адрес получателя"); - mailPage.closeNewEmailDialog(); - + Assert.assertEquals(mailService.getNoAddressErrorMessage(), + mailService.getExpectedNoAddressErrorMessage()); + mailService.closeNewEmailDialog(); } @Test(priority = 6) - public void DraftMailTest() { + public void draftMailTest() { //создаем черновик письма и сохрняем его - mailPage.createDraftMail(DRAFT_ADDRESS, TOPIC, TEXT); - mailPage.closeNewEmailDialog(); + mailService.createDraftMail(); //заходим в папку Черновики - mailPage.goToDraftEmails(); + mailService.goToDraftEmails(); // проверяем есть ли письмо с таким адресом - Assert.assertTrue(mailPage.isMailExist(DRAFT_ADDRESS), "Check mail exists in DRAFTS folder"); + Assert.assertTrue(mailService.isMailExist(DRAFT_ADDRESS), "Check mail exists in DRAFTS folder"); //удаляем все письма из текущей папки - mailPage.deleteAllLetters(); + mailService.deleteAllLetters(); //захододим в паку Удаленные (Корзина) - mailPage.goToTrashEmails(); + mailService.goToTrashEmails(); //проверяем есть ли письмо с таким адресом - Assert.assertTrue(mailPage.isMailExist(LOGIN), "Check mail exists in TRASH folder"); + Assert.assertTrue(mailService.isMailExist(LOGIN), "Check mail exists in TRASH folder"); //удаляем все письма из папки, если есть письмо с таким адресом - mailPage.deleteAllLetters(); + mailService.deleteAllLetters(); //проверяем что текст сообщения = "В корзине пусто" - Assert.assertEquals(mailPage.getEmtyFolderMessage(), "В корзине пусто"); + Assert.assertEquals(mailService.getEmtyFolderMessage(), + mailService.getExpectedEmtyFolderMessage()); } } diff --git a/src/main/resources/HelloWorld.txt b/src/main/resources/HelloWorld.txt new file mode 100644 index 0000000..693cf43 --- /dev/null +++ b/src/main/resources/HelloWorld.txt @@ -0,0 +1 @@ +"Hello World!" \ No newline at end of file diff --git a/src/main/resources/Log4j.properties b/src/main/resources/Log4j.properties new file mode 100644 index 0000000..cdfafc9 --- /dev/null +++ b/src/main/resources/Log4j.properties @@ -0,0 +1,18 @@ +# Use two appenders, one to log to console, another to log to a file +#Set level +log4j.rootCategory=info, console, file + +# Appender which writes to console +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{MM-dd-yyyy HH:mm:ss} %F %-5p [%t] %c{2} %L - %m%n + +# Appender which writes to a file +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.File=log4j-application.log + +# Defining maximum size of a log file +log4j.appender.file.MaxFileSize=5mb +log4j.appender.file.MaxBackupIndex=5 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{ISO8601} %5p [%t] %c{1}:%L - %m%n \ No newline at end of file diff --git a/src/main/resources/cloud/suite.xml b/src/main/resources/cloud/suite.xml new file mode 100644 index 0000000..b35f3cb --- /dev/null +++ b/src/main/resources/cloud/suite.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/main/resources/suite.xml b/src/main/resources/mail/suite.xml similarity index 53% rename from src/main/resources/suite.xml rename to src/main/resources/mail/suite.xml index 5a27d1a..1cf2680 100644 --- a/src/main/resources/suite.xml +++ b/src/main/resources/mail/suite.xml @@ -1,21 +1,15 @@ - + - - - + - - - + - - diff --git a/test-output/My Selenium Test Suite/TestEmails.html b/test-output/My Selenium Test Suite/TestEmails.html deleted file mode 100644 index 1158aa3..0000000 --- a/test-output/My Selenium Test Suite/TestEmails.html +++ /dev/null @@ -1,109 +0,0 @@ - - -TestNG: TestEmails - - - - - - - - -

TestEmails

- - - - - - - - - - - -
Tests passed/Failed/Skipped:4/0/0
Started on:Sat Feb 01 17:16:47 MSK 2020
Total time:24 seconds (24259 ms)
Included groups:
Excluded groups:

-(Hover the method name to see the test class name)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PASSED TESTS
Test methodExceptionTime (seconds)Instance
DraftMailTest
Test class: Itacademy.Test.SendMailTest
4Itacademy.Test.SendMailTest@6fb554cc
loginToMailTest
Test class: Itacademy.Test.LoginTest
15Itacademy.Test.LoginTest@3498ed
negativeLoginToMailTest
Test class: Itacademy.Test.LoginTest
3Itacademy.Test.LoginTest@3498ed
sendMailNoAddressTest
Test class: Itacademy.Test.SendMailTest
0Itacademy.Test.SendMailTest@6fb554cc
sendMailTest
Test class: Itacademy.Test.SendMailTest
7Itacademy.Test.SendMailTest@6fb554cc
sendMainNoSubjectNoBodyTest
Test class: Itacademy.Test.SendMailTest
4Itacademy.Test.SendMailTest@6fb554cc

- - \ No newline at end of file diff --git a/test-output/My Selenium Test Suite/TestEmails.xml b/test-output/My Selenium Test Suite/TestEmails.xml deleted file mode 100644 index b0f2776..0000000 --- a/test-output/My Selenium Test Suite/TestEmails.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/test-output/My Selenium Test Suite/TestLogin.html b/test-output/My Selenium Test Suite/TestLogin.html deleted file mode 100644 index 5b12f7d..0000000 --- a/test-output/My Selenium Test Suite/TestLogin.html +++ /dev/null @@ -1,89 +0,0 @@ - - -TestNG: TestLogin - - - - - - - - -

TestLogin

- - - - - - - - - - - -
Tests passed/Failed/Skipped:2/0/0
Started on:Sat Feb 01 17:16:28 MSK 2020
Total time:18 seconds (18676 ms)
Included groups:
Excluded groups:

-(Hover the method name to see the test class name)

- - - - - - - - - - - - - - - - - -
PASSED TESTS
Test methodExceptionTime (seconds)Instance
loginToMailTest
Test class: Itacademy.Test.LoginTest
15Itacademy.Test.LoginTest@3498ed
negativeLoginToMailTest
Test class: Itacademy.Test.LoginTest
3Itacademy.Test.LoginTest@3498ed

- - \ No newline at end of file diff --git a/test-output/My Selenium Test Suite/TestLogin.xml b/test-output/My Selenium Test Suite/TestLogin.xml deleted file mode 100644 index 17ad372..0000000 --- a/test-output/My Selenium Test Suite/TestLogin.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/test-output/My Selenium Test Suite/testng-failed.xml b/test-output/My Selenium Test Suite/testng-failed.xml deleted file mode 100644 index 8777ab3..0000000 --- a/test-output/My Selenium Test Suite/testng-failed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/test-output/bullet_point.png b/test-output/bullet_point.png deleted file mode 100644 index 176e6d5..0000000 Binary files a/test-output/bullet_point.png and /dev/null differ diff --git a/test-output/collapseall.gif b/test-output/collapseall.gif deleted file mode 100644 index a2d80a9..0000000 Binary files a/test-output/collapseall.gif and /dev/null differ diff --git a/test-output/emailable-report.html b/test-output/emailable-report.html deleted file mode 100644 index 0237c2f..0000000 --- a/test-output/emailable-report.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -TestNG Report - - - - - - - - - -
Test# Passed# Skipped# Retried# FailedTime (ms)Included GroupsExcluded Groups
My Selenium Test Suite
TestLogin200018 676
TestEmails400024 259
Total600042 935
- - -
ClassMethodStartTime (ms)
My Selenium Test Suite
TestLogin — passed
Itacademy.Test.LoginTestloginToMailTest158056658885215209
negativeLoginToMailTest15805666040633432
TestEmails — passed
Itacademy.Test.SendMailTestDraftMailTest15805666252524304
sendMailNoAddressTest1580566624246995
sendMailTest15805666119187793
sendMainNoSubjectNoBodyTest15805666197124533
-

TestLogin

Itacademy.Test.LoginTest#loginToMailTest

back to summary

-

Itacademy.Test.LoginTest#negativeLoginToMailTest

back to summary

-

TestEmails

Itacademy.Test.SendMailTest#DraftMailTest

back to summary

-

Itacademy.Test.SendMailTest#sendMailNoAddressTest

back to summary

-

Itacademy.Test.SendMailTest#sendMailTest

back to summary

-

Itacademy.Test.SendMailTest#sendMainNoSubjectNoBodyTest

back to summary

- - diff --git a/test-output/failed.png b/test-output/failed.png deleted file mode 100644 index c117be5..0000000 Binary files a/test-output/failed.png and /dev/null differ diff --git a/test-output/index.html b/test-output/index.html deleted file mode 100644 index 6a27199..0000000 --- a/test-output/index.html +++ /dev/null @@ -1,370 +0,0 @@ - - - - - - TestNG reports - - - - - - - - - - -
- Test results -
- 1 suite -
- -
-
-
-
-
- - Itacademy.Test.SendMailTest -
-
-
-
- - - DraftMailTest -
-
-
-
- - - sendMailNoAddressTest -
-
-
-
- - - sendMailTest -
-
-
-
- - - sendMainNoSubjectNoBodyTest -
-
-
-
-
-
- - Itacademy.Test.LoginTest -
-
-
-
- - - loginToMailTest -
-
-
-
- - - negativeLoginToMailTest -
-
-
-
-
-
-
- D:\it_academy\WdFramework_hw\New\src\main\resources\suite.xml -
-
-
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
-<suite thread-count="1" guice-stage="DEVELOPMENT" verbose="2" name="My Selenium Test Suite">
-  <test thread-count="1" verbose="2" name="TestLogin">
-    <classes>
-      <class name="Itacademy.Test.LoginTest"/>
-    </classes>
-  </test> <!-- TestLogin -->
-  <test thread-count="1" verbose="2" name="TestEmails">
-    <classes>
-      <class name="Itacademy.Test.SendMailTest"/>
-    </classes>
-  </test> <!-- TestEmails -->
-</suite> <!-- My Selenium Test Suite -->
-            
-
-
-
-
- Tests for My Selenium Test Suite -
-
-
    -
  • - TestLogin (1 class) -
  • -
  • - TestEmails (1 class) -
  • -
-
-
-
-
- Groups for My Selenium Test Suite -
-
-
-
-
-
- Times for My Selenium Test Suite -
-
-
- - Total running time: 36 seconds -
-
-
-
-
-
-
- Reporter output for My Selenium Test Suite -
-
-
-
-
-
- 0 ignored methods -
-
-
-
-
-
- Methods in chronological order -
-
-
-
Itacademy.Test.SendMailTest
-
- setup - 0 ms -
-
-
-
Itacademy.Test.LoginTest
-
- loginToMailTest - 10872 ms -
-
- negativeLoginToMailTest - 26083 ms -
-
-
-
Itacademy.Test.SendMailTest
-
- beforeClass - 29562 ms -
-
- sendMailTest - 33938 ms -
-
- sendMainNoSubjectNoBodyTest - 41732 ms -
-
- sendMailNoAddressTest - 46266 ms -
-
- DraftMailTest - 47272 ms -
-
- afterClass - 51576 ms -
-
- tearDown - 53826 ms -
-
-
-
-
- - diff --git a/test-output/jquery-1.7.1.min.js b/test-output/jquery-1.7.1.min.js deleted file mode 100644 index 198b3ff..0000000 --- a/test-output/jquery-1.7.1.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7.1 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; -f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() -{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/test-output/junitreports/TEST-Itacademy.Test.LoginTest.xml b/test-output/junitreports/TEST-Itacademy.Test.LoginTest.xml deleted file mode 100644 index 77b00c7..0000000 --- a/test-output/junitreports/TEST-Itacademy.Test.LoginTest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/test-output/junitreports/TEST-Itacademy.Test.MyTest.xml b/test-output/junitreports/TEST-Itacademy.Test.MyTest.xml deleted file mode 100644 index 7f6c3cd..0000000 --- a/test-output/junitreports/TEST-Itacademy.Test.MyTest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/test-output/junitreports/TEST-Itacademy.Test.SendMailTest.xml b/test-output/junitreports/TEST-Itacademy.Test.SendMailTest.xml deleted file mode 100644 index c75ac50..0000000 --- a/test-output/junitreports/TEST-Itacademy.Test.SendMailTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/test-output/navigator-bullet.png b/test-output/navigator-bullet.png deleted file mode 100644 index 36d90d3..0000000 Binary files a/test-output/navigator-bullet.png and /dev/null differ diff --git a/test-output/old/My Selenium Test Suite/TestEmails.properties b/test-output/old/My Selenium Test Suite/TestEmails.properties deleted file mode 100644 index d35c6cd..0000000 --- a/test-output/old/My Selenium Test Suite/TestEmails.properties +++ /dev/null @@ -1 +0,0 @@ -[SuiteResult context=TestLogin][SuiteResult context=TestEmails] \ No newline at end of file diff --git a/test-output/old/My Selenium Test Suite/TestLogin.properties b/test-output/old/My Selenium Test Suite/TestLogin.properties deleted file mode 100644 index d35c6cd..0000000 --- a/test-output/old/My Selenium Test Suite/TestLogin.properties +++ /dev/null @@ -1 +0,0 @@ -[SuiteResult context=TestLogin][SuiteResult context=TestEmails] \ No newline at end of file diff --git a/test-output/old/My Selenium Test Suite/classes.html b/test-output/old/My Selenium Test Suite/classes.html deleted file mode 100644 index 7c67b06..0000000 --- a/test-output/old/My Selenium Test Suite/classes.html +++ /dev/null @@ -1,66 +0,0 @@ -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Class nameMethod nameGroups
Itacademy.Test.LoginTest  
@Test
 negativeLoginToMailTest 
 loginToMailTest 
@BeforeClass
@BeforeMethod
@AfterMethod
@AfterClass
Itacademy.Test.SendMailTest  
@Test
 sendMailNoAddressTest 
 sendMainNoSubjectNoBodyTest 
 DraftMailTest 
 sendMailTest 
@BeforeClass
@BeforeMethod
@AfterMethod
@AfterClass
diff --git a/test-output/old/My Selenium Test Suite/groups.html b/test-output/old/My Selenium Test Suite/groups.html deleted file mode 100644 index 199cb3f..0000000 --- a/test-output/old/My Selenium Test Suite/groups.html +++ /dev/null @@ -1 +0,0 @@ -

Groups used for this test run

\ No newline at end of file diff --git a/test-output/old/My Selenium Test Suite/index.html b/test-output/old/My Selenium Test Suite/index.html deleted file mode 100644 index 314a085..0000000 --- a/test-output/old/My Selenium Test Suite/index.html +++ /dev/null @@ -1,6 +0,0 @@ -Results for My Selenium Test Suite - - - - - diff --git a/test-output/old/My Selenium Test Suite/main.html b/test-output/old/My Selenium Test Suite/main.html deleted file mode 100644 index 7bd5c24..0000000 --- a/test-output/old/My Selenium Test Suite/main.html +++ /dev/null @@ -1,2 +0,0 @@ -Results for My Selenium Test Suite -Select a result on the left-hand pane. diff --git a/test-output/old/My Selenium Test Suite/methods-alphabetical.html b/test-output/old/My Selenium Test Suite/methods-alphabetical.html deleted file mode 100644 index 5b04392..0000000 --- a/test-output/old/My Selenium Test Suite/methods-alphabetical.html +++ /dev/null @@ -1,24 +0,0 @@ -

Methods run, sorted chronologically

>> means before, << means after


My Selenium Test Suite

(Hover the method name to see the test class name)

- - - - - - - - - - - - - - - - - - - - - - -
TimeDelta (ms)Suite
configuration
Test
configuration
Class
configuration
Groups
configuration
Method
configuration
Test
method
ThreadInstances
20/02/01 17:17:05 0      DraftMailTestmain@1018937824
20/02/01 17:17:09 4305  <<afterClass     main@1018937824
20/02/01 17:16:47 -17710  >>beforeClass     main@1018937824
20/02/01 17:16:28 -36400      loginToMailTestmain@1018937824
20/02/01 17:16:44 -21189      negativeLoginToMailTestmain@1018937824
20/02/01 17:17:04 -1006      sendMailNoAddressTestmain@1018937824
20/02/01 17:16:51 -13334      sendMailTestmain@1018937824
20/02/01 17:16:59 -5540      sendMainNoSubjectNoBodyTestmain@1018937824
20/02/01 17:16:17 -47262 >>setup      main@1018937824
20/02/01 17:17:11 6554 <<tearDown      main@1018937824
diff --git a/test-output/old/My Selenium Test Suite/methods-not-run.html b/test-output/old/My Selenium Test Suite/methods-not-run.html deleted file mode 100644 index 54b14cb..0000000 --- a/test-output/old/My Selenium Test Suite/methods-not-run.html +++ /dev/null @@ -1,2 +0,0 @@ -

Methods that were not run

-
\ No newline at end of file diff --git a/test-output/old/My Selenium Test Suite/methods.html b/test-output/old/My Selenium Test Suite/methods.html deleted file mode 100644 index 625802a..0000000 --- a/test-output/old/My Selenium Test Suite/methods.html +++ /dev/null @@ -1,24 +0,0 @@ -

Methods run, sorted chronologically

>> means before, << means after


My Selenium Test Suite

(Hover the method name to see the test class name)

- - - - - - - - - - - - - - - - - - - - - - -
TimeDelta (ms)Suite
configuration
Test
configuration
Class
configuration
Groups
configuration
Method
configuration
Test
method
ThreadInstances
20/02/01 17:16:17 0 >>setup      main@1018937824
20/02/01 17:16:28 10862      loginToMailTestmain@1018937824
20/02/01 17:16:44 26073      negativeLoginToMailTestmain@1018937824
20/02/01 17:16:47 29552  >>beforeClass     main@1018937824
20/02/01 17:16:51 33928      sendMailTestmain@1018937824
20/02/01 17:16:59 41722      sendMainNoSubjectNoBodyTestmain@1018937824
20/02/01 17:17:04 46256      sendMailNoAddressTestmain@1018937824
20/02/01 17:17:05 47262      DraftMailTestmain@1018937824
20/02/01 17:17:09 51567  <<afterClass     main@1018937824
20/02/01 17:17:11 53816 <<tearDown      main@1018937824
diff --git a/test-output/old/My Selenium Test Suite/reporter-output.html b/test-output/old/My Selenium Test Suite/reporter-output.html deleted file mode 100644 index 063bc2e..0000000 --- a/test-output/old/My Selenium Test Suite/reporter-output.html +++ /dev/null @@ -1 +0,0 @@ -

Reporter output

\ No newline at end of file diff --git a/test-output/old/My Selenium Test Suite/testng.xml.html b/test-output/old/My Selenium Test Suite/testng.xml.html deleted file mode 100644 index 4a65299..0000000 --- a/test-output/old/My Selenium Test Suite/testng.xml.html +++ /dev/null @@ -1 +0,0 @@ -testng.xml for My Selenium Test Suite<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite thread-count="1" guice-stage="DEVELOPMENT" verbose="2" name="My Selenium Test Suite">
  <test thread-count="1" verbose="2" name="TestLogin">
    <classes>
      <class name="Itacademy.Test.LoginTest"/>
    </classes>
  </test> <!-- TestLogin -->
  <test thread-count="1" verbose="2" name="TestEmails">
    <classes>
      <class name="Itacademy.Test.SendMailTest"/>
    </classes>
  </test> <!-- TestEmails -->
</suite> <!-- My Selenium Test Suite -->
\ No newline at end of file diff --git a/test-output/old/My Selenium Test Suite/toc.html b/test-output/old/My Selenium Test Suite/toc.html deleted file mode 100644 index 1bedf3b..0000000 --- a/test-output/old/My Selenium Test Suite/toc.html +++ /dev/null @@ -1,38 +0,0 @@ - - -Results for My Selenium Test Suite - - - - -

Results for
My Selenium Test Suite

- - - - - - - - - - -
2 tests2 classes6 methods:
-  chronological
-  alphabetical
-  not run (0)
0 groupreporter outputtestng.xml
- -

-

-
TestEmails (4/0/0) - Results -
-
- - -

-

-
TestLogin (2/0/0) - Results -
-
- \ No newline at end of file diff --git a/test-output/old/index.html b/test-output/old/index.html deleted file mode 100644 index abe7de8..0000000 --- a/test-output/old/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - -

Test results

- - - -
SuitePassedFailedSkippedtestng.xml
Total600 
My Selenium Test Suite600Link
diff --git a/test-output/passed.png b/test-output/passed.png deleted file mode 100644 index 45e85bb..0000000 Binary files a/test-output/passed.png and /dev/null differ diff --git a/test-output/skipped.png b/test-output/skipped.png deleted file mode 100644 index c36a324..0000000 Binary files a/test-output/skipped.png and /dev/null differ diff --git a/test-output/testng-failed.xml b/test-output/testng-failed.xml deleted file mode 100644 index 8777ab3..0000000 --- a/test-output/testng-failed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/test-output/testng-reports.css b/test-output/testng-reports.css deleted file mode 100644 index b49abf3..0000000 --- a/test-output/testng-reports.css +++ /dev/null @@ -1,309 +0,0 @@ -body { - margin: 0 0 5px 5px; -} - -ul { - margin: 0; -} - -li { - list-style-type: none; -} - -a { - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -.navigator-selected { - background: #ffa500; -} - -.wrapper { - position: absolute; - top: 60px; - bottom: 0; - left: 400px; - right: 0; - overflow: auto; -} - -.navigator-root { - position: absolute; - top: 60px; - bottom: 0; - left: 0; - width: 400px; - overflow-y: auto; -} - -.suite { - margin: 0 10px 10px 0; - background-color: #fff8dc; -} - -.suite-name { - padding-left: 10px; - font-size: 25px; - font-family: Times, sans-serif; -} - -.main-panel-header { - padding: 5px; - background-color: #9FB4D9; /*afeeee*/; - font-family: monospace; - font-size: 18px; -} - -.main-panel-content { - padding: 5px; - margin-bottom: 10px; - background-color: #DEE8FC; /*d0ffff*/; -} - -.rounded-window { - border-radius: 10px; - border-style: solid; - border-width: 1px; -} - -.rounded-window-top { - border-top-right-radius: 10px 10px; - border-top-left-radius: 10px 10px; - border-style: solid; - border-width: 1px; - overflow: auto; -} - -.light-rounded-window-top { - border-top-right-radius: 10px 10px; - border-top-left-radius: 10px 10px; -} - -.rounded-window-bottom { - border-style: solid; - border-width: 0 1px 1px 1px; - border-bottom-right-radius: 10px 10px; - border-bottom-left-radius: 10px 10px; - overflow: auto; -} - -.method-name { - font-size: 12px; - font-family: monospace; -} - -.method-content { - border-style: solid; - border-width: 0 0 1px 0; - margin-bottom: 10px; - padding-bottom: 5px; - width: 80%; -} - -.parameters { - font-size: 14px; - font-family: monospace; -} - -.stack-trace { - white-space: pre; - font-family: monospace; - font-size: 12px; - font-weight: bold; - margin-top: 0; - margin-left: 20px; -} - -.testng-xml { - font-family: monospace; -} - -.method-list-content { - margin-left: 10px; -} - -.navigator-suite-content { - margin-left: 10px; - font: 12px 'Lucida Grande'; -} - -.suite-section-title { - margin-top: 10px; - width: 80%; - border-style: solid; - border-width: 1px 0 0 0; - font-family: Times, sans-serif; - font-size: 18px; - font-weight: bold; -} - -.suite-section-content { - list-style-image: url(bullet_point.png); -} - -.top-banner-root { - position: absolute; - top: 0; - height: 45px; - left: 0; - right: 0; - padding: 5px; - margin: 0 0 5px 0; - background-color: #0066ff; - font-family: Times, sans-serif; - color: #fff; - text-align: center; -} - -.top-banner-title-font { - font-size: 25px; -} - -.test-name { - font-family: 'Lucida Grande', sans-serif; - font-size: 16px; -} - -.suite-icon { - padding: 5px; - float: right; - height: 20px; -} - -.test-group { - font: 20px 'Lucida Grande'; - margin: 5px 5px 10px 5px; - border-width: 0 0 1px 0; - border-style: solid; - padding: 5px; -} - -.test-group-name { - font-weight: bold; -} - -.method-in-group { - font-size: 16px; - margin-left: 80px; -} - -table.google-visualization-table-table { - width: 100%; -} - -.reporter-method-name { - font-size: 14px; - font-family: monospace; -} - -.reporter-method-output-div { - padding: 5px; - margin: 0 0 5px 20px; - font-size: 12px; - font-family: monospace; - border-width: 0 0 0 1px; - border-style: solid; -} - -.ignored-class-div { - font-size: 14px; - font-family: monospace; -} - -.ignored-methods-div { - padding: 5px; - margin: 0 0 5px 20px; - font-size: 12px; - font-family: monospace; - border-width: 0 0 0 1px; - border-style: solid; -} - -.border-failed { - border-top-left-radius: 10px 10px; - border-bottom-left-radius: 10px 10px; - border-style: solid; - border-width: 0 0 0 10px; - border-color: #f00; -} - -.border-skipped { - border-top-left-radius: 10px 10px; - border-bottom-left-radius: 10px 10px; - border-style: solid; - border-width: 0 0 0 10px; - border-color: #edc600; -} - -.border-passed { - border-top-left-radius: 10px 10px; - border-bottom-left-radius: 10px 10px; - border-style: solid; - border-width: 0 0 0 10px; - border-color: #19f52d; -} - -.times-div { - text-align: center; - padding: 5px; -} - -.suite-total-time { - font: 16px 'Lucida Grande'; -} - -.configuration-suite { - margin-left: 20px; -} - -.configuration-test { - margin-left: 40px; -} - -.configuration-class { - margin-left: 60px; -} - -.configuration-method { - margin-left: 80px; -} - -.test-method { - margin-left: 100px; -} - -.chronological-class { - background-color: skyblue; - border-style: solid; - border-width: 0 0 1px 1px; -} - -.method-start { - float: right; -} - -.chronological-class-name { - padding: 0 0 0 5px; - color: #008; -} - -.after, .before, .test-method { - font-family: monospace; - font-size: 14px; -} - -.navigator-suite-header { - font-size: 22px; - margin: 0 10px 5px 0; - background-color: #deb887; - text-align: center; -} - -.collapse-all-icon { - padding: 5px; - float: right; -} diff --git a/test-output/testng-reports.js b/test-output/testng-reports.js deleted file mode 100644 index 5159f81..0000000 --- a/test-output/testng-reports.js +++ /dev/null @@ -1,122 +0,0 @@ -$(document).ready(function() { - $('a.navigator-link').click(function() { - // Extract the panel for this link - var panel = getPanelName($(this)); - - // Mark this link as currently selected - $('.navigator-link').parent().removeClass('navigator-selected'); - $(this).parent().addClass('navigator-selected'); - - showPanel(panel); - }); - - installMethodHandlers('failed'); - installMethodHandlers('skipped'); - installMethodHandlers('passed', true); // hide passed methods by default - - $('a.method').click(function() { - showMethod($(this)); - return false; - }); - - // Hide all the panels and display the first one (do this last - // to make sure the click() will invoke the listeners) - $('.panel').hide(); - $('.navigator-link').first().click(); - - // Collapse/expand the suites - $('a.collapse-all-link').click(function() { - var contents = $('.navigator-suite-content'); - if (contents.css('display') == 'none') { - contents.show(); - } else { - contents.hide(); - } - }); -}); - -// The handlers that take care of showing/hiding the methods -function installMethodHandlers(name, hide) { - function getContent(t) { - return $('.method-list-content.' + name + "." + t.attr('panel-name')); - } - - function getHideLink(t, name) { - var s = 'a.hide-methods.' + name + "." + t.attr('panel-name'); - return $(s); - } - - function getShowLink(t, name) { - return $('a.show-methods.' + name + "." + t.attr('panel-name')); - } - - function getMethodPanelClassSel(element, name) { - var panelName = getPanelName(element); - var sel = '.' + panelName + "-class-" + name; - return $(sel); - } - - $('a.hide-methods.' + name).click(function() { - var w = getContent($(this)); - w.hide(); - getHideLink($(this), name).hide(); - getShowLink($(this), name).show(); - getMethodPanelClassSel($(this), name).hide(); - }); - - $('a.show-methods.' + name).click(function() { - var w = getContent($(this)); - w.show(); - getHideLink($(this), name).show(); - getShowLink($(this), name).hide(); - showPanel(getPanelName($(this))); - getMethodPanelClassSel($(this), name).show(); - }); - - if (hide) { - $('a.hide-methods.' + name).click(); - } else { - $('a.show-methods.' + name).click(); - } -} - -function getHashForMethod(element) { - return element.attr('hash-for-method'); -} - -function getPanelName(element) { - return element.attr('panel-name'); -} - -function showPanel(panelName) { - $('.panel').hide(); - var panel = $('.panel[panel-name="' + panelName + '"]'); - panel.show(); -} - -function showMethod(element) { - var hashTag = getHashForMethod(element); - var panelName = getPanelName(element); - showPanel(panelName); - var current = document.location.href; - var base = current.substring(0, current.indexOf('#')) - document.location.href = base + '#' + hashTag; - var newPosition = $(document).scrollTop() - 65; - $(document).scrollTop(newPosition); -} - -function drawTable() { - for (var i = 0; i < suiteTableInitFunctions.length; i++) { - window[suiteTableInitFunctions[i]](); - } - - for (var k in window.suiteTableData) { - var v = window.suiteTableData[k]; - var div = v.tableDiv; - var data = v.tableData - var table = new google.visualization.Table(document.getElementById(div)); - table.draw(data, { - showRowNumber : false - }); - } -} diff --git a/test-output/testng-results.xml b/test-output/testng-results.xml deleted file mode 100644 index cc2aa26..0000000 --- a/test-output/testng-results.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test-output/testng.css b/test-output/testng.css deleted file mode 100644 index 5124ba8..0000000 --- a/test-output/testng.css +++ /dev/null @@ -1,9 +0,0 @@ -.invocation-failed, .test-failed { background-color: #DD0000; } -.invocation-percent, .test-percent { background-color: #006600; } -.invocation-passed, .test-passed { background-color: #00AA00; } -.invocation-skipped, .test-skipped { background-color: #CCCC00; } - -.main-page { - font-size: x-large; -} -