diff --git a/selcukes-core/pom.xml b/selcukes-core/pom.xml index aeadd372d..c23d0133f 100644 --- a/selcukes-core/pom.xml +++ b/selcukes-core/pom.xml @@ -41,7 +41,7 @@ io.github.selcukes - webdriver-binaries + selcukes-commons org.testng diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/AppiumManager.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/AppiumManager.java index 73eeb1f97..4797e96d2 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/AppiumManager.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/AppiumManager.java @@ -18,7 +18,6 @@ import io.appium.java_client.android.AndroidDriver; import io.github.selcukes.commons.config.ConfigFactory; -import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; import lombok.SneakyThrows; import org.openqa.selenium.Capabilities; @@ -62,7 +61,7 @@ public WebDriver createBrowserDriver(String browser) { Capabilities capabilities = AppiumOptions.getUserOptions(); if (capabilities == null) { String platform = ConfigFactory.getConfig().getMobile().getPlatform(); - capabilities = BrowserOptions.getBrowserOptions(DriverType.valueOf(browser), isCloudAppium(), platform); + capabilities = BrowserOptions.getBrowserOptions(BrowserOptions.valueOf(browser), platform); if (isCloudAppium()) { capabilities = capabilities.merge(CloudOptions.getBrowserStackOptions(false)); } diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/BrowserOptions.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/BrowserOptions.java index 463b05f1d..32b519589 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/BrowserOptions.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/BrowserOptions.java @@ -17,8 +17,6 @@ package io.github.selcukes.core.driver; import io.github.selcukes.databind.utils.StringHelper; -import io.github.selcukes.wdb.WebDriverBinary; -import io.github.selcukes.wdb.enums.DriverType; import lombok.experimental.UtilityClass; import org.openqa.selenium.Capabilities; import org.openqa.selenium.chrome.ChromeOptions; @@ -26,64 +24,63 @@ import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.ie.InternetExplorerDriver; import org.openqa.selenium.ie.InternetExplorerOptions; +import org.openqa.selenium.remote.Browser; + +import static org.openqa.selenium.remote.Browser.CHROME; +import static org.openqa.selenium.remote.Browser.EDGE; +import static org.openqa.selenium.remote.Browser.FIREFOX; +import static org.openqa.selenium.remote.Browser.IE; @UtilityClass public class BrowserOptions { - public Capabilities getBrowserOptions(DriverType driverType, boolean ignoreBinarySetup) { - return getBrowserOptions(driverType, ignoreBinarySetup, ""); - } + public static final String HEADLESS = "--headless"; - public static Capabilities getBrowserOptions(DriverType driverType, boolean ignoreBinarySetup, String platform) { - boolean headless = RunMode.isHeadless(); - if (!ignoreBinarySetup) { - setBinaries(driverType); + public static Capabilities getBrowserOptions(Browser browser, String platform) { + boolean isHeadless = RunMode.isHeadless(); + if (EDGE.equals(browser)) { + EdgeOptions edgeOptions = new EdgeOptions(); + if (isHeadless) { + edgeOptions.addArguments(HEADLESS); + } + if (!StringHelper.isNullOrEmpty(platform)) { + edgeOptions.setPlatformName(platform); + } + return edgeOptions; + } else if (FIREFOX.equals(browser)) { + FirefoxOptions firefoxOptions = new FirefoxOptions(); + if (isHeadless) { + firefoxOptions.addArguments(HEADLESS); + } + return firefoxOptions; + } else if (IE.equals(browser)) { + InternetExplorerOptions ieOptions = new InternetExplorerOptions().requireWindowFocus(); + ieOptions.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true); + ieOptions.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true); + ieOptions.setCapability("ignoreProtectedModeSettings", true); + ieOptions.setCapability("disable-popup-blocking", true); + ieOptions.setCapability("enablePersistentHover", true); + return ieOptions; } - - switch (driverType) { - case EDGE: - - EdgeOptions edgeOptions = new EdgeOptions(); - edgeOptions.setHeadless(headless); - if (!StringHelper.isNullOrEmpty(platform)) { - edgeOptions.setPlatformName(platform); - } - return edgeOptions; - case FIREFOX: - FirefoxOptions firefoxOptions = new FirefoxOptions(); - firefoxOptions.setHeadless(headless); - return firefoxOptions; - case IEXPLORER: - InternetExplorerOptions ieOptions = new InternetExplorerOptions().requireWindowFocus(); - ieOptions.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true); - ieOptions.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true); - ieOptions.setCapability("ignoreProtectedModeSettings", true); - ieOptions.setCapability("disable-popup-blocking", true); - ieOptions.setCapability("enablePersistentHover", true); - return ieOptions; - default: - ChromeOptions chromeOptions = new ChromeOptions(); - chromeOptions.setHeadless(headless); - if (!StringHelper.isNullOrEmpty(platform)) { - chromeOptions.setPlatformName(platform); - } - return chromeOptions; + ChromeOptions chromeOptions = new ChromeOptions(); + if (isHeadless) { + chromeOptions.addArguments(HEADLESS); + } + if (!StringHelper.isNullOrEmpty(platform)) { + chromeOptions.setPlatformName(platform); } + return chromeOptions; } - public static void setBinaries(DriverType driverType) { - switch (driverType) { - case EDGE: - WebDriverBinary.edgeDriver().setup(); - break; - case FIREFOX: - WebDriverBinary.firefoxDriver().setup(); - break; - case IEXPLORER: - WebDriverBinary.ieDriver().setup(); - break; - default: - WebDriverBinary.chromeDriver().setup(); + public Browser valueOf(String browserName) { + if (browserName.equalsIgnoreCase("Edge")) { + return EDGE; + } else if (browserName.equalsIgnoreCase("IE")) { + return IE; + } else if (browserName.equalsIgnoreCase("Firefox")) { + return FIREFOX; + } else { + return CHROME; } } } diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/GridRunner.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/GridRunner.java index 50a632e2f..517eb3c8f 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/GridRunner.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/GridRunner.java @@ -16,14 +16,11 @@ package io.github.selcukes.core.driver; -import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; import lombok.experimental.UtilityClass; import org.openqa.selenium.grid.Main; import org.openqa.selenium.net.PortProber; -import java.util.Arrays; - import static io.github.selcukes.core.driver.RunMode.isCloudAppium; import static io.github.selcukes.core.driver.RunMode.isCloudBrowser; import static io.github.selcukes.core.driver.RunMode.isLocalBrowser; @@ -34,10 +31,9 @@ public class GridRunner { static int hubPort; private static boolean isRunning = false; - public synchronized void startSelenium(DriverType... driverType) { + public synchronized void startSelenium() { if (!isCloudBrowser() || !isLocalBrowser()) { logger.info(() -> "Starting Selenium Server ..."); - Arrays.stream(driverType).distinct().forEach(BrowserOptions::setBinaries); hubPort = PortProber.findFreePort(); if (isSeleniumServerNotRunning()) { logger.debug(() -> "Using Free Hub Port: " + hubPort); diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/WebManager.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/WebManager.java index b47c94de4..70e0ec68c 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/WebManager.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/WebManager.java @@ -17,7 +17,6 @@ package io.github.selcukes.core.driver; import io.github.selcukes.commons.config.ConfigFactory; -import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; import lombok.SneakyThrows; import org.openqa.selenium.Capabilities; @@ -40,8 +39,7 @@ public synchronized WebDriver createDriver() { logger.debug(() -> "Initiating New Browser Session..."); Capabilities capabilities = AppiumOptions.getUserOptions(); if (capabilities == null) { - capabilities = BrowserOptions.getBrowserOptions(DriverType.valueOf(browser), - !(isLocalBrowser() || isCloudBrowser())); + capabilities = BrowserOptions.getBrowserOptions(BrowserOptions.valueOf(browser), ""); if (isCloudBrowser()) { capabilities = capabilities.merge(CloudOptions.getBrowserStackOptions(false)); } diff --git a/selcukes-core/src/test/java/io/github/selcukes/core/tests/unit/ShadowRootTest.java b/selcukes-core/src/test/java/io/github/selcukes/core/tests/unit/ShadowRootTest.java index 3340a5bef..0522810af 100644 --- a/selcukes-core/src/test/java/io/github/selcukes/core/tests/unit/ShadowRootTest.java +++ b/selcukes-core/src/test/java/io/github/selcukes/core/tests/unit/ShadowRootTest.java @@ -17,11 +17,11 @@ package io.github.selcukes.core.tests.unit; import io.github.selcukes.core.page.WebPage; -import io.github.selcukes.wdb.driver.LocalDriver; -import io.github.selcukes.wdb.enums.DriverType; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -32,7 +32,9 @@ public class ShadowRootTest { @BeforeMethod private void setup() { - driver = new LocalDriver().createWebDriver(DriverType.CHROME); + var options = new ChromeOptions(); + options.addArguments("--headless"); + driver = new ChromeDriver(options); page = new WebPage(driver); } diff --git a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/ClassicGridTest.java b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/ClassicGridTest.java index 4b40ec04b..ac8086d74 100644 --- a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/ClassicGridTest.java +++ b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/ClassicGridTest.java @@ -20,8 +20,8 @@ import io.github.selcukes.commons.config.ConfigFactory; import io.github.selcukes.core.driver.GridRunner; import io.github.selcukes.core.page.Pages; -import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; +import org.openqa.selenium.remote.Browser; import org.testng.annotations.BeforeSuite; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -31,19 +31,19 @@ public class ClassicGridTest { @BeforeSuite public static void beforeSuite() { - GridRunner.startSelenium(DriverType.CHROME, DriverType.EDGE); + GridRunner.startSelenium(); } @DataProvider(parallel = true) public Object[][] driverTypes() { - return new Object[][] { { DriverType.CHROME }, { DriverType.EDGE } + return new Object[][] { { Browser.CHROME }, { Browser.EDGE } }; } @Test(dataProvider = "driverTypes") - public void parallelBrowserTest(DriverType driverType) { - logger.debug(() -> "In Parallel Test for " + driverType.getName()); - ConfigFactory.getConfig().getWeb().setBrowser(driverType.getName()); + public void parallelBrowserTest(Browser driverType) { + logger.debug(() -> "In Parallel Test for " + driverType.browserName()); + ConfigFactory.getConfig().getWeb().setBrowser(driverType.browserName()); Pages.webPage().open("https://www.google.com/") .assertThat().title("Google"); } diff --git a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/EventDriverTest.java b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/EventDriverTest.java index 7244c32bf..22d31ba4d 100644 --- a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/EventDriverTest.java +++ b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/EventDriverTest.java @@ -19,14 +19,14 @@ import io.github.selcukes.commons.helper.FileHelper; import io.github.selcukes.core.page.WebPage; import io.github.selcukes.databind.utils.Clocks; -import io.github.selcukes.wdb.driver.LocalDriver; -import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; import lombok.SneakyThrows; import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -43,7 +43,9 @@ public class EventDriverTest { @BeforeMethod private void setup() { - driver = new LocalDriver().createWebDriver(DriverType.CHROME); + var options = new ChromeOptions(); + options.addArguments("--headless"); + driver = new ChromeDriver(options); page = new WebPage(driver); } diff --git a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/WebAuthTest.java b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/WebAuthTest.java index 193ee2c5a..f90fc15c0 100644 --- a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/WebAuthTest.java +++ b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/WebAuthTest.java @@ -18,11 +18,11 @@ import io.github.selcukes.core.page.WebPage; import io.github.selcukes.core.wait.WaitCondition; -import io.github.selcukes.wdb.driver.LocalDriver; -import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.support.ui.ExpectedConditions; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -37,7 +37,9 @@ public class WebAuthTest { @BeforeMethod private void setup() { - driver = new LocalDriver().createWebDriver(DriverType.CHROME); + var options = new ChromeOptions(); + options.addArguments("--headless"); + driver = new ChromeDriver(options); page = new WebPage(driver); } diff --git a/selcukes-databind/src/main/java/io/github/selcukes/databind/csv/CsvMapper.java b/selcukes-databind/src/main/java/io/github/selcukes/databind/csv/CsvMapper.java index 5c7cb5393..08817ec66 100644 --- a/selcukes-databind/src/main/java/io/github/selcukes/databind/csv/CsvMapper.java +++ b/selcukes-databind/src/main/java/io/github/selcukes/databind/csv/CsvMapper.java @@ -32,19 +32,18 @@ public class CsvMapper { /** - * It takes a CSV file, reads it line by line, splits each line by comma, removes the quotes, and returns a list of - * maps + * It takes a CSV file, reads it line by line, splits each line by comma, + * removes the quotes, and returns a list of maps * - * @param filePath The path to the file to be parsed. - * @return A list of maps. + * @param filePath The path to the file to be parsed. + * @return A list of maps. */ public List> parse(Path filePath) { try (var lines = Files.lines(filePath)) { return Streams.toListOfMap(lines.parallel() - .map(line -> - Pattern.compile(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)").splitAsStream(line) - .map(field -> field.replaceAll("^\"|\"$", "")) - .collect(Collectors.toCollection(LinkedList::new))) + .map(line -> Pattern.compile(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)").splitAsStream(line) + .map(field -> field.replaceAll("^\"|\"$", "")) + .collect(Collectors.toCollection(LinkedList::new))) .collect(Collectors.toCollection(LinkedList::new))); } catch (Exception e) { throw new DataMapperException("Failed parsing CSV File: ", e); diff --git a/selcukes-databind/src/main/java/io/github/selcukes/databind/excel/ExcelMapper.java b/selcukes-databind/src/main/java/io/github/selcukes/databind/excel/ExcelMapper.java index 7b2904fe1..e8b15479b 100644 --- a/selcukes-databind/src/main/java/io/github/selcukes/databind/excel/ExcelMapper.java +++ b/selcukes-databind/src/main/java/io/github/selcukes/databind/excel/ExcelMapper.java @@ -18,8 +18,21 @@ import io.github.selcukes.databind.exception.DataMapperException; import io.github.selcukes.databind.utils.DataFileHelper; +import io.github.selcukes.databind.utils.Streams; import lombok.experimental.UtilityClass; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.FormulaEvaluator; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import java.io.File; +import java.io.FileInputStream; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -28,6 +41,9 @@ */ @UtilityClass public class ExcelMapper { + private static final DataFormatter DATA_FORMATTER = new DataFormatter(); + private static FormulaEvaluator formulaEvaluator; + /** * Parses the Excel file to an Entity Class. It takes a class as input and * returns a stream of objects of that class @@ -48,4 +64,41 @@ public Stream parse(final Class entityClass) { ExcelParser excelMapper = new ExcelParser<>(entityClass); return excelMapper.parse(dataFile.getPath()); } + + /** + * It creates a workbook from the file, creates a formula evaluator, and + * then creates a map of sheet names to a list of maps of column names to + * cell values + * + * @param file The file to be parsed. + * @return A map of sheet names to a list of maps of column names to + * cell values. + */ + public static Map>> parse(File file) { + try (var workbook = WorkbookFactory.create(new FileInputStream(file))) { + formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); + return Streams.of(workbook.iterator()) + .collect(Collectors.toMap(Sheet::getSheetName, sheet -> Streams.of(sheet.iterator()) + .skip(1) + .map(ExcelMapper::readRow) + .collect(Collectors.toList()), + (k, v) -> k, LinkedHashMap::new)); + } catch (Exception e) { + throw new DataMapperException("Unable to parse Excel file " + file.getAbsolutePath(), e); + } + + } + + private static Map readRow(Row row) { + return Streams.of(row.iterator()) + .collect(Collectors.toMap(cell -> cell.getSheet().getRow(0) + .getCell(cell.getColumnIndex()).getStringCellValue(), + cell -> { + if (cell.getCellType().equals(CellType.FORMULA)) { + return DATA_FORMATTER.formatCellValue(cell, formulaEvaluator); + } else { + return DATA_FORMATTER.formatCellValue(cell); + } + }, (k, v) -> k, LinkedHashMap::new)); + } } diff --git a/selcukes-databind/src/test/java/io/github/selcukes/databind/tests/CsvTest.java b/selcukes-databind/src/test/java/io/github/selcukes/databind/tests/CsvTest.java index 3ec2a020f..4ef732b81 100644 --- a/selcukes-databind/src/test/java/io/github/selcukes/databind/tests/CsvTest.java +++ b/selcukes-databind/src/test/java/io/github/selcukes/databind/tests/CsvTest.java @@ -35,7 +35,7 @@ public void csvDataReaderTest() { String phone = map.get("Phone "); return map.get("Country").substring(0, 3).toUpperCase() + "_DDA_" + phone.substring(phone.length() - 4); })); - System.out.println(csvData); + csvData.forEach(System.out::println); } } diff --git a/selcukes-excel-runner/src/main/java/io/github/selcukes/excel/ExcelReader.java b/selcukes-excel-runner/src/main/java/io/github/selcukes/excel/ExcelReader.java deleted file mode 100644 index e8e851a68..000000000 --- a/selcukes-excel-runner/src/main/java/io/github/selcukes/excel/ExcelReader.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) Ramesh Babu Prudhvi. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.github.selcukes.excel; - -import io.github.selcukes.commons.config.ConfigFactory; -import io.github.selcukes.commons.exception.ExcelConfigException; -import io.github.selcukes.databind.utils.Streams; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.DataFormatter; -import org.apache.poi.ss.usermodel.FormulaEvaluator; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.ss.usermodel.WorkbookFactory; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class ExcelReader { - private final Workbook workbook; - - public ExcelReader(String fileName) { - this.workbook = getWorkBook(fileName); - } - - private Workbook getWorkBook(String fileName) { - try (Workbook wb = WorkbookFactory.create(Objects.requireNonNull(ConfigFactory.getStream(fileName)))) { - return wb; - } catch (Exception e) { - throw new ExcelConfigException("Failed reading excel file : " + fileName); - } - } - - public Stream getAllSheets() { - return Streams.of(workbook.iterator()); - } - - public Map>> getAllSheetsDataMap() { - return getAllSheets().collect(Collectors.toMap(Sheet::getSheetName, this::getSheetData)); - } - - public List> getSheetData(Sheet sheet) { - return Streams.of(sheet.iterator()) - .map(this::getRowData) - .collect(Collectors.toList()); - } - - private List getRowData(Row row) { - DataFormatter df = new DataFormatter(); - FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); - return Streams.of(row.iterator()) - .map(cell -> { - if (cell == null) { - return ""; - } else if (cell.getCellType().equals(CellType.FORMULA)) { - return df.formatCellValue(cell, formulaEvaluator); - } else { - return df.formatCellValue(cell); - } - }).collect(Collectors.toList()); - } - -} diff --git a/selcukes-excel-runner/src/main/java/io/github/selcukes/excel/ExcelUtils.java b/selcukes-excel-runner/src/main/java/io/github/selcukes/excel/ExcelUtils.java index 2340477ea..428ee5af6 100644 --- a/selcukes-excel-runner/src/main/java/io/github/selcukes/excel/ExcelUtils.java +++ b/selcukes-excel-runner/src/main/java/io/github/selcukes/excel/ExcelUtils.java @@ -18,6 +18,9 @@ import io.github.selcukes.commons.config.ConfigFactory; import io.github.selcukes.commons.exception.ExcelConfigException; +import io.github.selcukes.commons.helper.FileHelper; +import io.github.selcukes.databind.excel.ExcelMapper; +import io.github.selcukes.databind.utils.StringHelper; import lombok.CustomLog; import lombok.experimental.UtilityClass; @@ -28,129 +31,101 @@ import java.util.Map; import java.util.stream.Collectors; +import static java.util.Optional.ofNullable; + @UtilityClass @CustomLog public class ExcelUtils { static final String NAME_SEPARATOR = "::"; - static final List runScenarios = new ArrayList<>(); + static List runScenarios = new ArrayList<>(); + private static final String TEST = "Test"; private static final String RUN = "Run"; private static final String HYPHEN = " - "; private static final String EXAMPLE = " - Example"; - private static final Map>> allSheetsDataMap = new LinkedHashMap<>(); private static final String TEST_SUITE_RUNNER_SHEET = ConfigFactory.getConfig().getExcel().get("suiteName"); private static final List IGNORE_SHEETS = new ArrayList<>( Arrays.asList("Master", "Smoke", "Regression", "StaticData")); - private static Map>> allSheetsMap = new LinkedHashMap<>(); + private static Map>> excelData = new LinkedHashMap<>(); public static void initTestRunner() { - ExcelReader excelReader = new ExcelReader( - ConfigFactory.getConfig().getExcel().get("fileName")); - - // Store all sheets data - allSheetsMap = excelReader.getAllSheetsDataMap(); - - // Replace Empty test name with previous row test name and if it is - // examples test then add Example row - allSheetsMap.keySet().forEach(sheet -> allSheetsDataMap.put(sheet, modifySheetFirstColumn(sheet))); + var filePath = FileHelper.loadResource(ConfigFactory.getConfig().getExcel().get("fileName")); + excelData = ExcelMapper.parse(filePath); IGNORE_SHEETS.remove(TEST_SUITE_RUNNER_SHEET); - logger.debug(() -> "Using excel runner sheet : " + TEST_SUITE_RUNNER_SHEET); - // Filter runOnly Tests - Map>> allSheetsModifiedMap = allSheetsDataMap.keySet().stream() - .filter(s -> !IGNORE_SHEETS.contains(s)) - .collect(Collectors.toMap(sheet -> sheet, sheet -> allSheetsDataMap.get(sheet).stream().skip(1) - .filter(row -> { - int exeStatus = allSheetsDataMap.get(sheet).get(0).indexOf(RUN); - return row.get(exeStatus).equalsIgnoreCase("yes"); - }).collect(Collectors.toList()))); - - // Stores FeatureName::Tests from master sheet - List masterList = allSheetsModifiedMap.get(TEST_SUITE_RUNNER_SHEET).stream() - .map(row -> row.get(1) + NAME_SEPARATOR + row.get(2)).collect(Collectors.toList()); - - if (TEST_SUITE_RUNNER_SHEET.equalsIgnoreCase("Master")) { - allSheetsModifiedMap.keySet().stream().skip(1).forEach( - sheet -> allSheetsModifiedMap.get(sheet).stream().filter(row -> anyMatch(masterList, row.get(0))) - .forEach(row -> runScenarios.add(row.get(0)))); - } else { - runScenarios.addAll(masterList); - } + excelData.entrySet().stream() + .filter(entry -> !IGNORE_SHEETS.contains(entry.getKey())) + .forEach(entry -> modifyFirstColumnData(entry.getValue(), + entry.getKey().equals(TEST_SUITE_RUNNER_SHEET) ? "Screen" : TEST, + entry.getKey().equals(TEST_SUITE_RUNNER_SHEET) ? "" : "Example")); + runScenarios = getScenariosToRun(); } - public static Map getTestDataAsMap(String testName) { - logger.debug(() -> "TestName:" + testName); - String testSheetName = getTestSheetName(testName); - logger.debug(() -> "TestSheetName:" + testSheetName); - - List> listRow = allSheetsDataMap.get(testSheetName); - int testRowIndex = getColumnData(listRow, 0).indexOf(testName); - Map testDataRowMap = new LinkedHashMap<>(); - if (testRowIndex < 0) { - throw new ExcelConfigException("Unable to read Test Row for the test name:" + testName); - } - for (int i = 0; i < getRowData(listRow, 0).size(); i++) { - // Adding Key as Column Header and Value as Test Data Row value - testDataRowMap.put(getRowData(allSheetsDataMap.get(testSheetName), 0).get(i), - getRowData(listRow, testRowIndex).get(i)); - } - return testDataRowMap; - } + private static List getScenariosToRun() { + var masterList = new ArrayList(); + var dataList = new ArrayList(); + + excelData.forEach((key, value) -> { + if (!IGNORE_SHEETS.contains(key)) { + value.stream() + .filter(entry -> entry.get(RUN).equalsIgnoreCase("Yes")) + .forEach(entry -> { + var testName = entry.get(TEST); + if (key.equalsIgnoreCase(TEST_SUITE_RUNNER_SHEET)) { + masterList.add(entry.get("Feature") + NAME_SEPARATOR + testName); + } else { + dataList.add(testName); + } + }); + } + }); - private static List getRowData(List> rowList, int rowIndex) { - return new ArrayList<>(rowList.get(rowIndex)); + return dataList.stream() + .filter(name -> anyMatch(masterList, name)) + .collect(Collectors.toList()); } - private static String getTestSheetName(String testName) { - String tests = testName.split(NAME_SEPARATOR)[1]; + public Map getTestDataAsMap(String testName) { - List> masterSheetList = allSheetsDataMap.get(TEST_SUITE_RUNNER_SHEET); - int index = getColumnData(masterSheetList, 2).indexOf(tests); - if (index < 0) { - int i = tests.lastIndexOf(HYPHEN.trim()); - if (i > 0 && tests.substring(i).trim().startsWith(EXAMPLE.trim())) { - tests = tests.substring(0, i - 1); - } - index = getColumnData(masterSheetList, 2).indexOf(tests); - if (index < 0) { - throw new ExcelConfigException("Unable to read SheetName for the given testName:" + testName); - } + logger.debug(() -> "TestName:" + testName); + String testSheetName = testName.split(NAME_SEPARATOR)[0]; + logger.debug(() -> "TestSheetName:" + testSheetName); + var rowTestData = excelData.get(testSheetName).parallelStream() + .filter(row -> row.get(TEST).equalsIgnoreCase(testName)) + .findFirst(); + if (rowTestData.isPresent()) { + return rowTestData.get(); + } else { + throw new ExcelConfigException(String.format("Unable to read Test Data Row for [%s]", testName)); } - - return masterSheetList.get(index).get(0); - } - - private static List getColumnData(List> sheetDataList, int columnIndex) { - return sheetDataList.stream().map(row -> row.get(columnIndex)).collect(Collectors.toList()); } - private static boolean anyMatch(List masterList, String testName) { + private boolean anyMatch(List masterList, String testName) { return masterList.stream().anyMatch(name -> { String scenarioName = name + EXAMPLE; return testName.startsWith(scenarioName) || testName.equalsIgnoreCase(name); }); } - private List> modifySheetFirstColumn(String sheetName) { - List> sheetDataList = new ArrayList<>(allSheetsMap.get(sheetName)); + private void modifyFirstColumnData(List> sheetData, String firstColumn, String secondColumn) { String testName = ""; - for (int i = 0; i < sheetDataList.size(); i++) { - if (sheetDataList.get(i).get(0).isEmpty()) { + for (int i = 0; i < sheetData.size(); i++) { + if (StringHelper.isNullOrEmpty(sheetData.get(i).get(firstColumn))) { String newTestName; - if (!sheetName.equalsIgnoreCase(TEST_SUITE_RUNNER_SHEET)) { - if (!sheetDataList.get(i - 1).get(0).startsWith(testName + EXAMPLE)) { - sheetDataList.get(i - 1).set(0, testName + HYPHEN + sheetDataList.get(i - 1).get(1)); + if (!StringHelper.isNullOrEmpty(secondColumn)) { + if (!sheetData.get(i - 1).get(firstColumn).startsWith(testName + EXAMPLE)) { + sheetData.get(i - 1).put(firstColumn, + testName + HYPHEN + ofNullable(sheetData.get(i - 1).get(secondColumn)).orElse("")); } - newTestName = testName + HYPHEN + sheetDataList.get(i).get(1); + newTestName = testName + HYPHEN + ofNullable(sheetData.get(i).get(secondColumn)).orElse(""); } else { newTestName = testName; } - sheetDataList.get(i).set(0, newTestName); + sheetData.get(i).put(firstColumn, newTestName); } else { - testName = sheetDataList.get(i).get(0); + testName = sheetData.get(i).get(firstColumn); } } - return sheetDataList; } } diff --git a/selcukes-excel-runner/src/test/resources/TestData.xlsx b/selcukes-excel-runner/src/test/resources/TestData.xlsx index 574b8d208..a7a3ebb5e 100644 Binary files a/selcukes-excel-runner/src/test/resources/TestData.xlsx and b/selcukes-excel-runner/src/test/resources/TestData.xlsx differ diff --git a/selcukes-excel-runner/src/test/resources/features/Yahoo.feature b/selcukes-excel-runner/src/test/resources/features/Yahoo.feature index bf2dfec82..16889a779 100644 --- a/selcukes-excel-runner/src/test/resources/features/Yahoo.feature +++ b/selcukes-excel-runner/src/test/resources/features/Yahoo.feature @@ -7,7 +7,8 @@ Feature: Yahoo | Scenario | | Example 1 | | Example 2 | + | Example 2 | - Scenario: Different kind of opening + Scenario: Yahoo Home Given I kinda open Yahoo page - Then I am very happy \ No newline at end of file + Then I am very happy diff --git a/selcukes-snapshot/pom.xml b/selcukes-snapshot/pom.xml index 532018172..cff8833b3 100644 --- a/selcukes-snapshot/pom.xml +++ b/selcukes-snapshot/pom.xml @@ -29,11 +29,6 @@ io.github.selcukes selcukes-commons - - io.github.selcukes - webdriver-binaries - test - org.testng testng diff --git a/selcukes-snapshot/src/test/java/io/github/selcukes/snapshot/tests/NativeSnapshotTest.java b/selcukes-snapshot/src/test/java/io/github/selcukes/snapshot/tests/NativeSnapshotTest.java index 8f3c96217..64249b63e 100644 --- a/selcukes-snapshot/src/test/java/io/github/selcukes/snapshot/tests/NativeSnapshotTest.java +++ b/selcukes-snapshot/src/test/java/io/github/selcukes/snapshot/tests/NativeSnapshotTest.java @@ -17,28 +17,34 @@ package io.github.selcukes.snapshot.tests; import io.github.selcukes.commons.os.Platform; -import io.github.selcukes.wdb.driver.LocalDriver; -import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.edge.EdgeDriver; +import org.openqa.selenium.edge.EdgeOptions; +import org.openqa.selenium.remote.Browser; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import static org.openqa.selenium.remote.Browser.CHROME; +import static org.openqa.selenium.remote.Browser.EDGE; + @CustomLog public class NativeSnapshotTest { private static final ThreadLocal LOCAL_DRIVER = new InheritableThreadLocal<>(); @DataProvider public Object[][] driverTypes() { - return new Object[][] { { DriverType.CHROME }, { DriverType.EDGE } }; + return new Object[][] { { CHROME }, { EDGE } }; } @Test(dataProvider = "driverTypes") - public void browserTest(DriverType driverType) { - logger.debug(() -> "DriverType : " + driverType); - setDriver(driverType); + public void browserTest(Browser browser) { + logger.debug(() -> "Browser : " + browser); + setDriver(browser); new HomePage(getDriver()).navigateToHomePage(); } @@ -57,7 +63,23 @@ private WebDriver getDriver() { return LOCAL_DRIVER.get(); } - private void setDriver(DriverType driverType) { - LOCAL_DRIVER.set(new LocalDriver().createWebDriver(driverType, Platform.isLinux())); + private void setDriver(Browser browser) { + LOCAL_DRIVER.set(createWebDriver(browser, Platform.isLinux())); + } + + private WebDriver createWebDriver(Browser browser, boolean headless) { + if (browser.equals(EDGE)) { + EdgeOptions edgeOptions = new EdgeOptions(); + if (headless) { + edgeOptions.addArguments("--headless"); + } + return new EdgeDriver(edgeOptions); + } else { + ChromeOptions chromeOptions = new ChromeOptions(); + if (headless) { + chromeOptions.addArguments("--headless"); + } + return new ChromeDriver(chromeOptions); + } } } diff --git a/webdriver-binaries/src/test/java/io/github/selcukes/tests/WebDriverBinaryTest.java b/webdriver-binaries/src/test/java/io/github/selcukes/tests/WebDriverBinaryTest.java index ad0c4e577..fbcc8569d 100644 --- a/webdriver-binaries/src/test/java/io/github/selcukes/tests/WebDriverBinaryTest.java +++ b/webdriver-binaries/src/test/java/io/github/selcukes/tests/WebDriverBinaryTest.java @@ -52,7 +52,7 @@ public void ieDriverTest() { logger.debug(() -> "Binary path for { " + binProp + "} is {" + getProperty(binProp) + "}"); } - @Test + @Test(enabled = false) public void edgeDriverTest() { BinaryInfo binaryInfo = WebDriverBinary.edgeDriver().setup();