Package Layout
- src
- log4j2.xml - log4j2 Configuration
- pom.xml - Maven Configuration
- testng.xml - TestNG Configuration
- com.us.test.selenium
- com.us.test.selenium.pageactions
- com.us.test.selenium.pageobjects
- com.us.test.selenium.tests
- com.us.test.selenium.tests.testdata
- com.us.test.selenium.util
- BrowserUtils
- Constant
- ElementUtils
- ExcelUtils
- LIstener
- Listeners
- TestLog
Classes
com.uc.test.selenium
Main
com.uc.test.selenium.pageobjects
PageBaseClass
package com.uc.test.selenium.pageobjects;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
public class PageBaseClass {
public static WebDriver driver;
public static boolean bResult;
public PageBaseClass(WebDriver driver){
PageBaseClass.driver = driver;
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
PageBaseClass.bResult = true;
}
}
Home_Page
package com.uc.test.selenium.pageobjects;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;
import com.uc.test.selenium.util.BrowserUtils;
//import utility.TestLog;
public class Home_Page extends PageBaseClass {
private static WebElement element = null;
public Home_Page(WebDriver driver){
super(driver);
}
public static WebElement link_Error() throws Exception{
try{
element = driver.findElement(By.xpath ("//a[contains(.,'Error')]"));
}catch (Exception e){
throw(e);
}
return element;
}
public static WebElement link_Home() throws Exception{
try{
element = driver.findElement(By.xpath("//a[contains(.,'Home')]"));
}catch (Exception e){
throw(e);
}
return element;
}
public static WebElement link_Music() throws Exception{
try{
element = driver.findElement(By.xpath ("//a[contains(.,'Music')]"));
}catch (Exception e){
throw(e);
}
return element;
}
public static WebElement txtbx_Search() throws Exception{
try{
element = driver.findElement(By.id("edit-keys"));
}catch (Exception e){
throw(e);
}
return element;
}
public static WebElement btn_Search() throws Exception{
try{
element = driver.findElement(By.id("edit-submit"));
}catch (Exception e){
throw(e);
}
return element;
}
public static WebElement link_CreateArtcle() throws Exception{
try {
element = driver.findElement(By.xpath("//a[@href='/uc/node/add/article']"));
} catch (Exception e) {
e.printStackTrace();
}
return element;
}
public static WebElement link_Computing() throws Exception{
try{
element = driver.findElement(By.xpath ("//a[@href='/uc/computing']"));
}catch (Exception e){
throw(e);
}
return element;
}
public static WebElement link_Login() throws Exception{
int timeoutSec = 15;
WebDriverWait wait = new WebDriverWait(driver, timeoutSec);
//wait.until((driver) -> driver.findElements(By.xpath("//a[@href='/uc/user/login']")).size()>0);
wait.until((driver) -> driver.findElement(By.xpath("//a[@href='/uc/user/login']")).isDisplayed());
//BrowserUtils.waitForElementToBeReady("xpath", "//a[@href='/uc/user/login']");
try {
element = driver.findElement(By.xpath("//a[@href='/uc/user/login']"));
} catch (Exception e) {
e.printStackTrace();
}
return element;
}
public static WebElement link_ShortcutsToggle() throws Exception{
try {
if ( !driver.findElement(By.xpath("//a[@href='/uc/node/add/article']")).isDisplayed() ) {
driver.findElement(By.id("toolbar-item-shortcuts")).click();
}
} catch (Exception e) {
e.printStackTrace();
}
return element;
}
}
com.uc.test.selenium.pageactions
Home_Actions
package com.uc.test.selenium.pageactions;
import com.uc.test.selenium.pageobjects.Home_Page;
public class Home_Actions {
public static void Execute(int iTestCaseRow) throws Exception{
// Here we are sending the UserName string to the UserName Textbox on the LogIN Page
// This is call Page Object Model (POM)
// For use of POM, please see http://www.toolsqa.com/page-object-model/
//Home_Page.txtbx_Username().sendKeys(sUserName);
Home_Page.link_Home().click();
Home_Page.link_Music().click();
}
}
com.uc.test.selenium.tests
Test_Login
package com.uc.test.selenium.tests;
//import org.apache.log4j.xml.DOMConfigurator;
//import org.apache.logging.log4j.core.config.xml.*;
import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.testng.asserts.*;
//import org.apache.log4j.xml.DOMConfigurator;
import com.uc.test.selenium.pageobjects.CreateArticle_Page;
import com.uc.test.selenium.pageobjects.Home_Page;
import com.uc.test.selenium.pageobjects.Login_Page;
import com.uc.test.selenium.pageobjects.PageBaseClass;
import com.uc.test.selenium.util.BrowserUtils;
import com.uc.test.selenium.util.Constant;
import com.uc.test.selenium.util.ExcelUtils;
import com.uc.test.selenium.util.TestLog;
//import com.uc.test.selenium.util.TestLog;
public class Test_Login {
public WebDriver driver;
@BeforeMethod
public void beforeMethod() throws Exception {
driver = BrowserUtils.OpenBrowser();
new PageBaseClass(driver);
}
@AfterMethod
public void afterMethod() throws Exception {
driver.quit();
}
@Test
public void test_1() throws Exception {
try {
//Logger Actions
//DOMConfigurator.configure("log4j2.xml");
//
// Excel Actions
ExcelUtils.setExcelFile("W:\\w\\svn\\java\\SeleniumFramework\\src\\com\\uc\\test\\selenium\\tests\\testdata\\TestData.xlsx", "Sheet1");
String sTestCaseName = "ECOIOT391";
int iTestCaseRow;
iTestCaseRow = ExcelUtils.getRowContains(sTestCaseName,Constant.DataSheet.Col_TestCaseName.ordinal());
String sUserName = ExcelUtils.getCellData(iTestCaseRow, Constant.DataSheet.Col_UserName.ordinal());
TestLog.startTestCase(sTestCaseName);
TestLog.info("TestCaseRow=" + String.valueOf(iTestCaseRow));
// WebDriver Actions
BrowserUtils.BrowserGet();
Home_Page.txtbx_Search().sendKeys("1234");
Thread.sleep(100);
Home_Page.btn_Search().click();
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
throw(e);
}
}
@Test
public void test_2() throws Exception {
try {
BrowserUtils.BrowserGet();
Thread.sleep(3000);
Home_Page.link_Computing().click();
Thread.sleep(3000);
} catch (Exception e) {
throw(e);
}
}
@Test
public void test_createArticle() throws Exception{
try {
BrowserUtils.BrowserGet();
//Thread.sleep(2000);
//BrowserUtils.waitForPageToBeReady();
Home_Page.link_Login().click();
Login_Page.txtbx_Username().sendKeys("UnityAdmin");
Login_Page.txtbx_Password().sendKeys("UnityAdmin@2017");
Login_Page.btn_Login().click();
Home_Page.link_ShortcutsToggle();
Home_Page.link_CreateArtcle().click();
CreateArticle_Page.txtbx_Title().sendKeys("ArticleTitle");
CreateArticle_Page.txtbx_Body().sendKeys("1234");
CreateArticle_Page.txtbx_Tags().sendKeys("_deleteme");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.assertEquals(false, true, "Test Failed");
}
}
@Test
public void test_3() throws Exception {
try {
BrowserUtils.BrowserGet();
Thread.sleep(3000);
Home_Page.link_Error().click();
Thread.sleep(3000);
} catch (Exception e) {
throw(e);
}
}
}
com.uc.test.selenium.tests.testdata
TestData.xls
com.uc.test.selenium.util
- following code excerpts are commented in various places as they are under active development, namely the log4j wiring/config
BrowserUtils
package com.uc.test.selenium.util;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
//import utility.TestLog;
//import utility.Constant;
//import utility.ExcelUtils;
//import utility.TestLog;
public class BrowserUtils {
// this instance is for building up 'driver' with properties before passing to
// PageBaseClass for use in tests
public static WebDriver driver = null;
private static WebElement element;
/**
* Returns a Webdriver object that has been pre-populated with applicable profile
* This WebDriver is statically declared/called but returns a 'driver' object
* that will be instantiated with new by the rest of the framework
* <p>
* The non-static PageBaseClass will accept this returned WebDriver object
* and then create another 'driver' object that can use used by NON-STATIC
* methods
*
* @return WebDriver Object, ready for Firefox
* @throws Exception if WebDriver can't be instantiated
* @see WebDriver
*
*/
// public static WebDriver OpenBrowser(int iTestCaseRow) throws Exception{
public static WebDriver OpenBrowser() throws Exception{
String sBrowserName, sPlatform;
try{
sBrowserName = "Mozilla";
sPlatform = "WINDOWS";
if(sBrowserName.equalsIgnoreCase("Mozilla")){
driver = CreateDriverFireFox(sPlatform);
} else if(sBrowserName.equalsIgnoreCase("Chrome")){
driver = CreateDriverFireFox(sPlatform);
}
} catch (Exception e) {
throw(e);
}
return driver;
} //end method
private static WebDriver CreateDriverFireFox(String sPlatform) {
// Configure Firefox for cookies acceptance
FirefoxProfile profile = new ProfilesIni().getProfile("default");
profile.setPreference("network.cookie.cookieBehavior", 0);
if (sPlatform.equals("WINDOWS")){
// Configure Firefox Gecko Driver
// 0.20.0
//System.setProperty("webdriver.gecko.driver","W:\\w\\Java\\lib\\Selenium.3.11.0\\SeleniumWebDrivers\\geckodriver\\geckodriver-v0.20.1-win64\\geckodriver.exe");
// 0.19.1
//System.setProperty("webdriver.gecko.driver","W:\\w\\tools\\SeleniumWebDrivers\\geckodriver\\geckodriver-v0.19.1-win64\\geckodriver.exe");
System.setProperty("webdriver.gecko.driver","res\\geckodriver\\geckodriver-v0.19.1-win64\\geckodriver.exe");
}
if (sPlatform.equalsIgnoreCase("LINUX")){
// Configure Firefox Gecko Driver
System.setProperty("webdriver.gecko.driver","res/geckodriver/geckodriver-v0.19.1-linux64/geckodriver.exe");
}
if (sPlatform.equalsIgnoreCase("MACOS")){
// Configure Firefox Gecko Driver
System.setProperty("webdriver.gecko.bin","/Applications/Firefox.app/Contents/MacOS/firefox-bin");
System.setProperty("webdriver.gecko.driver","geckodriver");
}
// Create web driver
driver = new FirefoxDriver();
// driver = new FirefoxDriver();
// TestLog.info("New driver instantiated");
driver.manage().deleteAllCookies();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(120, TimeUnit.SECONDS);
return driver;
}
private static WebDriver CreateDriverChrome(String sPlatform) {
//Configure Chrome for cookies acceptance
//ChromeProfile profile = new ProfilesIni().getProfile("default");
//profile.setPreference("network.cookie.cookieBehavior", 0);
if (sPlatform.equals("WINDOWS")){
System.setProperty("webdriver.chrome.driver","res\\chromedriver\\chromedriver-v2.40.0-win64\\chromedriver.exe");
}
if (sPlatform.equalsIgnoreCase("LINUX")){
// Configure Chrome Driver
System.setProperty("webdriver.chrome.driver","res/chromedriver/chromedriver-v2.40.0-linux64/chromedriver.exe");
}
if (sPlatform.equalsIgnoreCase("MACOS")){
// Configure Chrome Driver
//System.setProperty("webdriver.gecko.bin","/Applications/Firefox.app/Contents/MacOS/firefox-bin");
System.setProperty("webdriver.chrome.driver","chromedriver");
}
// Create web driver
driver = new ChromeDriver();
// TestLog.info("New driver instantiated");
driver.manage().deleteAllCookies();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(120, TimeUnit.SECONDS);
return driver;
}
public static void BrowserClose() {
driver.close();
driver.quit();
}
public static void BrowserGet() {
driver.get("http://www.unityconstruct.org");
}
public static void waitForElementToBeReady(String elType, String elTypeIdentifier) {
WebDriverWait wait = new WebDriverWait(driver, 10);
switch (elType) {
case "xpath":
element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(elTypeIdentifier)));
break;
case "id":
element = wait.until(ExpectedConditions.elementToBeClickable(By.id(elTypeIdentifier)));
break;
default:
break;
}
}
public static void waitForPageToBeReady()
{
JavascriptExecutor js = (JavascriptExecutor)driver;
//This loop will rotate for 100 times to check If page Is ready after every 1 second.
//You can replace your if you wants to Increase or decrease wait time.
for (int i=0; i<30; i++)
{
if (js.executeScript("return document.readyState").toString().equals("complete") ||
js.executeScript("return document.readyState").toString().equals("complete"))
{
// TestLog.info("waitForPageToBeReady - executeScript complete [or loaded]");
break;
}
try
{
// TestLog.info("waitForPageToBeReady: Add Sleep time 1000 ms");
Thread.sleep(1000);
}catch (InterruptedException e) {}
//To check page ready state.
}
}
}
Constant
package com.uc.test.selenium.util;
public class Constant {
public static final String URL = "https://www.unityconstruct.org";
public static final String Username = "super";
public static final String Password ="2wire";
//public static final String Path_TestData = ".//src//TestData/";
public static final String Path_TestData = ".//src//com//uc//test//selenium//tests//testdata//TestData.xlsx";
public static final String File_TestData = "TestData.xlsx";
public static final String Path_TestData2 = "W:\\w\\svn\\SeleniumFramework\\src\\com\\uc\\test\\selenium\\tests\\testdata\\TestData.xlsx";
//public static final String Path_log4j = ".//src//com//uc//test//selenium//tests//testdata//log4j2b.xml";
public static final String Path_log4j = ".//src//log4j2.xml";
// XPATH Library
public enum LoginPageElements {
LOGIN_TXT_USERNAME ("//id="),
LOGIN_TXT_PASSWORD ("//id="),
LOGIN_BTN_SUBMIT ("//id=");
private String value;
LoginPageElements(String value){
this.value = value;
}
public String getValue() {
return value;
}
}
public enum Wtf
{
one("a"),
two("b"),
three("c");
private final String letter;
Wtf(String letter){
this.letter = letter;
}
private String letter() {return letter; }
public String getLetter() {
return letter();
}
}
//Test Data Sheet Columns
// use .ordinal() to get its index for use as Col#
public enum DataSheet
{
Col_TestCaseName,
Col_URL,
Col_UserName,
Col_Password,
Col_Browser,
Col_Platform,
Col_DUTSN,
Col_TopMenu,
Col_SubMenu,
Col_Selection1,
Col_Selection2,
Col_Selection3,
Col_Selection4,
Col_DeviceSearch1,
Col_DeviceSearch2,
Col_DeviceSearch3,
Col_DeviceSearch4,
Col_DeviceSearch5,
Col_DeviceView1,
Col_DeviceView2,
Col_DeviceView3,
Col_DeviceView4,
Col_DataSet1 ,
Col_DataSet2,
Col_DataSet3,
Col_TopMenuVerify,
Col_SubMenuVerify,
Col_SectionNameVerify,
Col_TopMenuPrep,
Col_SubMenuPrep,
Col_Selectionprep1,
Col_Selectionprep2,
Col_Selectionprep3,
Col_APIPrep1,
Col_APIPrep2,
Col_APIPrep3,
Col_Result;
private int value;
public int getValue() {
return value;
}
}
public enum DBDataSheet
{
Col_TestCaseName,
Col_DUTSN,
Col_OUI,
Col_DBHostURL,
Col_DBUserName,
Col_DBPassword,
Col_DBService;
private int value;
public int getValue() {
return value;
}
}
public static final String Path_ScreenShot = "./src/Screenshots/";
}
ElementUtils
package com.uc.test.selenium.util;
public class ElementUtils {
}
ExcelUtils
package com.uc.test.selenium.util;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtils {
private static XSSFSheet ExcelWSheet;
private static XSSFWorkbook ExcelWBook;
private static XSSFCell Excelcell;
private static XSSFRow Excelrow;
// This method is to set the File path and to open the Excel file, Pass Excel
// Path and Sheetname as Arguments to this method
public static void setExcelFile(String Path, String SheetName) throws Exception {
try {
// Open the Excel file
FileInputStream ExcelFile = new FileInputStream(Path);
// Access the required test data sheet
ExcelWBook = new XSSFWorkbook(ExcelFile);
ExcelWSheet = ExcelWBook.getSheet(SheetName);
// TestLog.info("Excel sheet opened");
} catch (Exception e) {
throw (e);
}
}
// This method is to read the test data from the Excel cell, in this we are
// passing parameters as Row num and Col num
public static String getCellData(int RowNum, int ColNum) throws Exception {
try {
Excelcell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
String CellData = Excelcell.getStringCellValue();
return CellData;
} catch (Exception e) {
return "";
}
}
// This method is to write in the Excel cell, Row num and Col num are the
// parameters
@SuppressWarnings("static-access")
public static void setCellData(String Result, int RowNum, int ColNum) throws Exception {
try {
Excelrow = ExcelWSheet.getRow(RowNum);
Excelcell = Excelrow.getCell(ColNum, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
if (Excelcell == null) {
Excelcell = Excelrow.createCell(ColNum);
Excelcell.setCellValue(Result);
} else {
Excelcell.setCellValue(Result);
}
// Constant variables Test Data path and Test Data file name
FileOutputStream fileOut = new FileOutputStream(Constant.Path_TestData + Constant.File_TestData);
ExcelWBook.write(fileOut);
fileOut.flush();
fileOut.close();
} catch (Exception e) {
throw (e);
}
}
public static int getRowContains(String sTestCaseName, int colNum) throws Exception {
int i;
try {
int rowCount = ExcelUtils.getRowUsed();
for (i = 0; i < rowCount; i++) {
if (ExcelUtils.getCellData(i, colNum).equalsIgnoreCase(sTestCaseName)) {
break;
}
}
return i;
} catch (Exception e) {
// TestLog.error("Class ExcelUtil | Method getRowContains | Exception desc : " +
// e.getMessage());
throw (e);
}
}
public static int getRowUsed() throws Exception {
try {
int RowCount = ExcelWSheet.getLastRowNum();
// TestLog.info("Total number of Row used return as < " + RowCount + " >.");
return RowCount;
} catch (Exception e) {
// TestLog.error("Class ExcelUtil | Method getRowUsed | Exception desc : " + e.getMessage());
// System.out.println(e.getMessage());
throw (e);
}
}
}
Listener
package com.uc.test.selenium.util;
import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.Reporter;
public class Listener implements ITestListener, IInvokedMethodListener {
public void onFinish(ITestContext arg0) {
Reporter.log("Completed executing test " + arg0.getName(), true);
}
public void onStart(ITestContext arg0) {
Reporter.log("About to begin executing test " + arg0.getName(), true);
}
public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
}
public void onTestFailure(ITestResult arg0) {
printTestResults(arg0);
}
private void printTestResults(ITestResult result) {
Reporter.log("TestName = " + result.getTestName(), true);
Reporter.log("Test Method resides in " + result.getTestClass().getName(), true);
if (result.getParameters().length != 0) {
String params = null;
for (Object parameter : result.getParameters()) {
params += parameter.toString() + ",";
}
Reporter.log("Test Method had the following parameters : " + params, true);
}
String status = null;
switch (result.getStatus()) {
case ITestResult.SUCCESS:
status = "Pass";
break;
case ITestResult.FAILURE:
status = "Failed";
break;
case ITestResult.SKIP:
status = "Skipped";
}
Reporter.log("Test Status: " + status, true);
}
public void onTestSkipped(ITestResult arg0) {
printTestResults(arg0);
}
public void onTestStart(ITestResult arg0) {
}
public void onTestSuccess(ITestResult arg0) {
printTestResults(arg0);
}
public void afterInvocation(IInvokedMethod arg0, ITestResult arg1) {
String textMsg = "Completed executing " + returnMethodName(arg0.getTestMethod());
Reporter.log(textMsg, true);
}
public void beforeInvocation(IInvokedMethod arg0, ITestResult arg1) {
String textMsg = "About to begin executing " + returnMethodName(arg0.getTestMethod());
Reporter.log(textMsg, true);
}
private String returnMethodName(ITestNGMethod method) {
return method.getRealClass().getSimpleName() + "." + method.getMethodName();
}
}
Listeners
package com.uc.test.selenium.util;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.TestListenerAdapter;
public class Listeners extends TestListenerAdapter {
public void onTestFailure(ITestResult result) {
String rs = getMethodContext(result);
System.err.println(rs + " | FAILED");
Reporter.log(rs + " | FAILED");
}
@Override
public void onTestSkipped(ITestResult result) {
String rs = getMethodContext(result);
System.out.println(rs + " | SKIPPED");
Reporter.log(rs + " | SKIPPED");
}
@Override
public void onTestSuccess(ITestResult result) {
String rs = getMethodContext(result);
System.out.println(rs + " | PASSED");
Reporter.log(rs + " | PASSED");
}
private String getMethodContext(ITestResult result) {
// String browser = result.getTestContext().getCurrentXmlTest()
// .getParameter("browser");
String testClasss = result.getTestClass().getName();
String name = result.getName();
String rs = testClasss + " | " + name;
return rs;
}
}
TestLog
package com.uc.test.selenium.util;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class TestLog {
private static final Logger logCommon = LogManager.getLogger("commons-log");
private static final Logger logAnalytics = LogManager.getLogger("analytics-log");
static final Logger Log = LogManager.getLogger(TestLog.class.getName());
// Initialize Log4j logs
// private static Logger Log = Logger.getLogger(TestLog.class.getName());
// This is to print log for the beginning of the test case, as we usually run so many test cases as a test suite
public static void startTestCase(String sTestCaseName){
Log.info("****************************************************************************************");
Log.info("****************************************************************************************");
Log.info("$$$$$$$$$$$$$$$$$$$$$ "+sTestCaseName+ " $$$$$$$$$$$$$$$$$$$$$$$$$");
Log.info("****************************************************************************************");
Log.info("****************************************************************************************");
}
//This is to print log for the ending of the test case
public static void endTestCase(String sTestCaseName){
Log.info("XXXXXXXXXXXXXXXXXXXXXXX "+"-E---N---D-"+" XXXXXXXXXXXXXXXXXXXXXX");
Log.info("X");
Log.info("X");
Log.info("X");
Log.info("X");
}
// Need to create these methods, so that they can be called
public static void info(String message) {
Log.info(message);
}
public static void warn(String message) {
Log.warn(message);
}
public static void error(String message) {
Log.error(message);
}
public static void fatal(String message) {
Log.fatal(message);
}
public static void debug(String message) {
Log.debug(message);
}
}