Пара направляющих линий для лучшего Сформированный код:
- Перерыв код в методы, которые только делают одну вещь каждый. Таким образом, проще управлять и красиво разделять, а также вы не входите в аденирующий ад с таким встроенным циклом, а если структура такая, как у вас здесь.
- Используйте переменные класса для таких вещей, как экземпляр
WebDriver
, так что вы можете его инициализировать один раз и продолжать называть его позже.
- Не вставляйте текст в приложение, используйте константы. Затем вам нужно только один раз определить текст и обратиться к нему несколько раз. Делает код намного проще в обслуживании и изменении, когда вам не нужно искать и заменять весь класс после изменения некоторых деталей (например, пути к файлу).
Кроме того, я предполагаю, что вы имели в виду, чтобы сделать следующее:
- петля строки в
objectRepository
в к-петле, вместо зацикливания строки в testSuite
снова.
- получить клетки от
objectRepository
, а не из testScenarios
при чтении клеток из objectRepository
Пример:
public class MainClass {
private static final String BROWSER_PATH = "D:\\softs\\FF installed\\FF18\\firefox.exe";
private static final String TEST_SUITE_PATH = "D:\\GmailTestSuite.xls";
private static final String OBJECT_REPOSITORY_PATH = "D:\\objectrepository.xls";
private static final String ADDRESS_TO_TEST = "https://www.gmail.com";
private static final By EMAIL_INPUT = By.id("Email");
// other constants
private WebDriver driver;
private Properties properties;
public MainClass() {
File file = new File(BROWSER_PATH);
FirefoxBinary fb = new FirefoxBinary(file);
driver = new FirefoxDriver(fb, new FirefoxProfile());
driver.get(ADDRESS_TO_TEST);
}
public static void main(String[] args) throws IOException, BiffException {
MainClass main = new MainClass();
main.handleTestSuite();
}
private void handleTestSuite() {
ReadPropertyFile readConfigFile = new ReadPropertyFile();
properties = readConfigFile.loadPropertiess();
ExcelHandler testSuite = new ExcelHandler(TEST_SUITE_PATH, "Suite");
testSuite.columnData();
int rowCount = testSuite.rowCount();
System.out.println("Total Rows=" + rowCount);
for (int i = 1; i < rowCount; i++) {
String executable = testSuite.readCell(testSuite.getCell("Executable"), i);
System.out.println("Executable=" + executable);
if (executable.equalsIgnoreCase("y")) {
// exe. the process
String scenarioName = testSuite.readCell(testSuite.getCell("TestScenario"), i);
System.out.println("Scenario Name=" + scenarioName);
handleScenario(scenarioName);
}
}
}
private void handleScenario(String scenarioName) {
ExcelHandler testScenarios = new ExcelHandler(TEST_SUITE_PATH, scenarioName);
int rowWorkBook1 = testScenarios.rowCount();
for (int j = 1; j < rowWorkBook1; j++) {
String framWork = testScenarios.readCell(testScenarios.getCell("FrameworkName"), j);
String operation = testScenarios.readCell(testScenarios.getCell("Operation"), j); // SendKey
String value = testScenarios.readCell(testScenarios.getCell("Value"), j);
System.out.println("FRMName=" + framWork + ",Operation=" + operation +
",Value=" + value);
handleObjects(operation);
}
}
private void handleObjects(String operation) {
ExcelHandler objectRepository = new ExcelHandler(OBJECT_REPOSITORY_PATH, "OR");
objectRepository.columnData();
int rowCount = objectRepository.rowCount();
System.out.println("Total Rows=" + rowCount);
for (int k = 1; k < rowCount; k++) {
String frameWorkName = objectRepository.readCell(objectRepository.getCell("Executable"), k);
String ObjectName = objectRepository.readCell(objectRepository.getCell("ObjectName"), k);
String Locator = objectRepository.readCell(objectRepository.getCell("Locator"), k); // SendKey
System.out.println("FrameWorkName=" + frameWorkName +
",ObjectName=" + ObjectName + ",Locator=" + Locator);
operateWebDriver(operation);
}
}
private void operateWebDriver(String operation) {
WebElement we = driver.findElement(EMAIL_INPUT);
if (operation.equalsIgnoreCase("SendKey")) {
we.sendKeys("[email protected]");
we.sendKeys("[email protected]");
} else if (operation.equalsIgnoreCase("Click")) {
we.click();
}
}
}
Если ExcelHandler
является вашей собственной реализации, вы действительно должны переместить getCell(String s)
метод внутри метода readCell()
для изменения шаблона вызова от handler.readCell(handler.getCell("foo"), i)
до handler.readCell("foo", i)
.Если это библиотека вы используете, вы всегда можете сделать вспомогательный метод:
private static String readCell(ExcelHandler handler, String cellName, int row) {
return handler.readCell(handler.getCell(cellName), row);
}
EDIT
Поскольку у вас возникли проблемы с получением WebDriver
на работу, упростить вещи и принять все остальное из уравнения на данный момент. Для этого давайте проигнорируем все данные чтения из .xls-файлов. Здесь различные методы для разных вещей заставляют ваш дизайн сиять, поскольку вы можете просто прокомментировать один вызов метода вместо того, чтобы прокомментировать 50 строк кода из вашего одного мега-метода.
Измененный выше код немного (просто комментировал вызов с другими методами, и опустить их из фрагмента, переместили линию открытия нужной страницы в конструктор и переписал operateWebDriver()
метод чуть позже):
public class MainClass {
private static final String ADDRESS_TO_TEST = "https://www.gmail.com";
private static final By EMAIL_INPUT = By.id("Email");
private static final By PASSWORD_INPUT = By.id("Passwd");
private static final By SIGN_IN_BUTTON = By.id("signIn");
private static final String EMAIL = "[email protected]";
private static final String PASSWORD = "test123";
private WebDriver driver;
public MainClass() {
File file = new File(BROWSER_PATH);
FirefoxBinary fb = new FirefoxBinary(file);
driver = new FirefoxDriver(fb, new FirefoxProfile());
driver.get(ADDRESS_TO_TEST);
}
public static void main(String[] args) throws IOException, BiffException {
MainClass main = new MainClass();
//main.handleTestSuite();
main.operateWebDriver("Click", EMAIL_INPUT);
main.operateWebDriver("SendKey", EMAIL_INPUT, EMAIL);
main.operateWebDriver("Click", PASSWORD_INPUT);
main.operateWebDriver("SendKey", PASSWORD_INPUT, PASSWORD);
main.operateWebDriver("Click", SIGN_IN_BUTTON);
}
private void operateWebDriver(String operation, By element) {
operateWebDriver(operation, element, null);
}
private void operateWebDriver(String operation, By element, String keys) {
WebElement we = driver.findElement(element);
if (operation.equalsIgnoreCase("SendKey")) {
we.sendKeys(keys);
} else if (operation.equalsIgnoreCase("Click")) {
we.click();
}
}
}
Затем, как только вы получите WebDriver
, вы можете начать считывать данные из файлов и использовать его для работы WebDriver
.
Нет времени, чтобы написать правильный ответ, но очевидным является то, что вы создаете экземпляр «WebDriver» внутри цикла, поэтому вы в конечном итоге открываете газильон. Если вы создадите его только один раз за пределами циклов, а затем вызовите его в цикле, вероятно, это будет то, что вы ищете в этом случае. – t0mppa
@ t0mppa Можете ли вы привести мне пример этого, я знаю его глупый вопрос, но если вы дадите, тогда это будет полезно для меня :) – user2092132