Failed to create new instance of class ru.hpsm.selenide_elements.element_imp.table.ResTable. Не удается создать новый экземпляр класса
Почему появляется такая ошибка?
java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at cucumber.runtime.java.DefaultJavaObjectFactory.cacheNewInstance(DefaultJavaObjectFactory.java:41)
at cucumber.runtime.java.DefaultJavaObjectFactory.getInstance(DefaultJavaObjectFactory.java:33)
at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:37)
at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:40)
at cucumber.api.TestStep.executeStep(TestStep.java:102)
at cucumber.api.TestStep.run(TestStep.java:83)
at cucumber.api.TestCase.run(TestCase.java:58)
at cucumber.runner.Runner.runPickle(Runner.java:80)
at cucumber.runtime.Runtime.runFeature(Runtime.java:119)
at cucumber.runtime.Runtime.run(Runtime.java:104)
at cucumber.api.cli.Main.run(Main.java:36)
at cucumber.api.cli.Main.main(Main.java:18)
at ✽.PageAllConfigurationItems > проверить значения в таблице конфигурационных единиц, в строке под номером 1(C:/Users/Семён/IdeaProjects/Hspm/hpsm_em/src/test/java/ru/hpsm/features/stand4me/2036037 Сохранение числа КЕ по фильтру.feature:26)
Caused by: java.lang.RuntimeException: Failed to create new instance of class ru.hpsm.selenide_elements.element_imp.table.ResTable
at com.codeborne.selenide.Selenide.page(Selenide.java:634)
at ru.hpsm.steps.AtomicSteps.Checks.table.CheckTableRes.<clinit>(CheckTableRes.java:20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at cucumber.runtime.java.DefaultJavaObjectFactory.cacheNewInstance(DefaultJavaObjectFactory.java:41)
at cucumber.runtime.java.DefaultJavaObjectFactory.getInstance(DefaultJavaObjectFactory.java:33)
at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:37)
at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:40)
at cucumber.api.TestStep.executeStep(TestStep.java:102)
at cucumber.api.TestStep.run(TestStep.java:83)
at cucumber.api.TestCase.run(TestCase.java:58)
at cucumber.runner.Runner.runPickle(Runner.java:80)
at cucumber.runtime.Runtime.runFeature(Runtime.java:119)
at cucumber.runtime.Runtime.run(Runtime.java:104)
at cucumber.api.cli.Main.run(Main.java:36)
at cucumber.api.cli.Main.main(Main.java:18)
Caused by: java.lang.NoSuchMethodException: ru.hpsm.selenide_elements.element_imp.table.ResTable.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at com.codeborne.selenide.Selenide.page(Selenide.java:630)
... 17 more
Вот метод для шага:
package ru.hpsm.steps.AtomicSteps.Checks.table;
import cucumber.api.java.ru.Тогда;
import org.junit.Assert;
import ru.hpsm.selenide_elements.element_imp.table.ResTable;
import ru.hpsm.steps.AbstractSteps;
import ru.hpsm.steps.OldSteps.utils.Time;
import ru.hpsm.utils.Storage;
import java.util.Map;
import static com.codeborne.selenide.Selenide.*;
import static ru.hpsm.steps.AtomicSteps.Storage.StorageUtils.getStorageData;
import static ru.hpsm.steps.OldSteps.TestData.getTestData;
public class CheckTableRes extends AbstractSteps {
static ResTable tableResult = page(ResTable.class);
@Тогда(value = "^(.+) > проверить значения в таблице конфигурационных единиц, в строке под номером ()(\\d+)$", timeout = defaultStepTimeout)
public void проверитьЗначенияТаблицеРезультатов(String page, String text, Integer i, Map<String, String> args) {
ResTable.Row row = null;
if (i == null) {
text = getStorageData(text);
row = new ResTable(page, true).getRow(text, true);
} else {
row = new ResTable(page, true).getRow(i, true);
}
printCheckStepDescription("В строке Таблицы результатов с текстом \"" + row.getElementName() + "\" проверить" +
"присутствие значений: " + args);
for (Map.Entry entry : args.entrySet()) {
String headerColumnName = entry.getKey().toString(), //Получаем ключ = Имя колонки таблицы
expectedCellValue = getStorageData(entry.getValue().toString()); // Получаем Значение = Ожидаемое значение колонки в строки
String cellValue = row.getCell(headerColumnName, true).getText();
//TODO Переделать условие в if после создания класса DataTime!!!
if (entry.getValue().toString().toLowerCase().startsWith("время") && Storage.get(entry.getValue().toString()) != null) //Если значение начинается с "Время" и есть в Хранилище,
// то проверяем время с учетом дельты
Time.checkDeltaTime(expectedCellValue, cellValue, getTestData().delta);
else { // иначе сравниваем значения как текст
Assert.assertEquals("Ошибка. В строке Таблицы Результатов \"" + row.getElementName() + "\" в колонке \"" + headerColumnName + "\" не содержится ожидаемое значение \""
+ expectedCellValue + "\", а содержится \"" + cellValue + "\"", expectedCellValue.trim(), cellValue.trim());
System.out.println("в строке в колонке \"" + headerColumnName + " присутствует ожидаемое значение \"" + expectedCellValue + "\"");
}
}
printStepResilt("В строке Таблицы результатов с текстом \"" + row.getElementName() + "\"" +
"содержатся значения: " + args);
}
}
И сам класс ResTable:
package ru.hpsm.selenide_elements.element_imp.table;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.SelenideElement;
import org.openqa.selenium.By;
import ru.hpsm.selenide_elements.element_imp.CommonElementsCollection;
import ru.hpsm.selenide_elements.element_imp.ElementImpl;
import ru.hpsm.utils.Storage;
import java.util.ArrayList;
import java.util.List;
import static com.codeborne.selenide.Selenide.page;
import static org.junit.Assert.assertTrue;
import static ru.hpsm.page_objects.NamedElementsContainer.pageFactory;
import static ru.hpsm.steps.AtomicSteps.Checks.Utils.CheckUtils.checkAlertDoesNotExist;
import static ru.hpsm.steps.AtomicSteps.Storage.StorageUtils.getStorageData;
import static ru.hpsm.steps.WaiterUtils.ожидатьЗагрузкуСтраницыИпроверитьОтсутствиеКрасныхАлертов;
import static ru.hpsm.utils.StringUtils.getRandomValueFromList;
public class ResTable {
private final ru.hpsm.page_objects.pages.stand4me.PageAllConfigurationItems resPage = page(ru.hpsm.page_objects.pages.stand4me.PageAllConfigurationItems.class);
private String context;
public ResTable(String context, boolean проверитьЧтоТаблицаРезультатовКЕОтображается) {
this.context = context;
waitForPageIsUnAvailable();
if (проверитьЧтоТаблицаРезультатовКЕОтображается) {
assertTrue("Ошибка. На текущей странице отсутствует Таблица результатов.", isPresent());
}
}
public boolean isPresent() {
if (resPage.getCollection("Коллекция строк Результаты поиска").get(0).exists())
return true;
else
return false;
}
public Row getRow(String value, boolean проверитьЧтоОтображается) { // Конструирование ожидаемого элемента
/** getValueFromStorage */ // TODO Костыль по работе с данными
if (value.equalsIgnoreCase("случайное значение")) {
List<String> valuesList = getAllClickableLinks().texts();
value = getRandomValueFromList(valuesList);
int tryCount = 0;
while (value.equals("...") && tryCount < 20) {
tryCount++;
System.out.println("Ошибка! Таблица не прогрузилась: " + value);
value = getRandomValueFromList(getAllClickableLinks().texts());
}
Storage.put("случайное значение", value);
// LogManager.getLogger().info("Выбрано случайное значение \"" + value + "\" из списка значений: \n " + valuesList);
System.out.println("Выбрано случайное значение \"" + value + "\" из списка значений: \n " + valuesList);
}
if (Storage.get(value) != null) {
if (Storage.get(value).equalsIgnoreCase("случайное значение")) {
List<String> valuesList = getAllClickableLinks().texts();
int tryCount = 0;
String temp = getRandomValueFromList(valuesList);
while (temp.equals("...") && tryCount < 20) {
tryCount++;
System.out.println("Ошибка! Таблица не прогрузилась: " + temp);
temp = getRandomValueFromList(getAllClickableLinks().texts());
}
Storage.put(value, temp);
// LogManager.getLogger().info("Выбрано случайное значение \"" + value + "\" из списка значений: \n " + valuesList);
System.out.println("Выбрано случайное значение \"" + value + "\" из списка значений: \n " + valuesList);
}
value = Storage.get(value);
} else {
value = getStorageData(value);
}
return new Row(value, проверитьЧтоОтображается);
}
CommonElementsCollection getAllClickableLinks() {
return new CommonElementsCollection(resPage.getAllClickableLinks(), "Кликабельные ячейки", false);
}
public Row getRow(int i, boolean проверитьЧтоОтображается) {
return new Row(i, проверитьЧтоОтображается);
}
public void waitForPageIsUnAvailable() {
ожидатьЗагрузкуСтраницыИпроверитьОтсутствиеКрасныхАлертов(); //1. Ожидаем прогрузку страницы
ожидатьЗагрузкуСтраницыИпроверитьОтсутствиеКрасныхАлертов();
checkAlertDoesNotExist(); //2. Проверяем отсутствие Алерта
try { //3. Выбираем котекст: если страница не существует, то переключаемся на общий контекст
pageFactory.getPage(context);
} catch (RuntimeException e) {
pageFactory.getPage("ОбщиеЭлементыСтраниц");
}
}
public class Rows {
public ArrayList<Row> selenideElementsToRows(ElementsCollection sElemlist) {
ArrayList<Row> list = new ArrayList<>();
sElemlist.stream().forEach(e -> list.add(new Row(e, "Строка таблицы результатов", false)));
return list;
}
}
public class Row extends ElementImpl {
public Row(SelenideElement element, String elementName, boolean проверитьЧтоЭлементОтображается) {
super(element, elementName, проверитьЧтоЭлементОтображается, проверитьЧтоЭлементОтображается);
}
public Row(int i, boolean проверитьЧтоОтображается) {
super(resPage.getValueByRowNumber(i), "Строка Таблицы результатов под номером \"" + i + "\"", проверитьЧтоОтображается, false);
}
public Row(String text, boolean проверитьЧтоОтображается) {
super(resPage.getRowByValue(text), "Строка Таблицы результатов с текстом \"" + text + "\"", проверитьЧтоОтображается, false);
}
public Cell getCell(String columnName, boolean проверитьЧтоОтображается) {
return new Cell(resPage.получитьЯчейкуВСтрокеКЕ(this.getWrappedElement(), columnName),
"Ячейка Таблицы результатов \"" + columnName + "\"",
проверитьЧтоОтображается, false);
}
public ArrayList<Cell> getCells() {
ArrayList<Cell> listCell = new ArrayList<Cell>();
this.findAll(By.xpath("./td")).stream().forEach(selenideElement -> listCell.add(new Cell(selenideElement, "Ячейка", true, false)));
return listCell;
}
}
public class Cell extends ElementImpl {
public Cell(String page, String elementName, boolean проверитьЧтоЭлементОтображается, boolean проверитьЧтоЭлементДоступен) {
super(page, elementName, проверитьЧтоЭлементОтображается, проверитьЧтоЭлементДоступен);
}
public Cell(SelenideElement element, String name, boolean проверитьЧтоЭлементОтображается, boolean проверитьЧтоЭлементДоступен) {
super(element, name, проверитьЧтоЭлементОтображается, проверитьЧтоЭлементДоступен);
}
}
}
Ответы (1 шт):
Автор решения: woesss
→ Ссылка
Метод com.codeborne.selenide.Selenide.page():
static ResTable tableResult = page(ResTable.class);
видимо должен создать экземпляр класса, но принимает только его тип - а значит он не может знать и не имеет аргументов для конструктора этого класса, отличного от конструктора без параметров, которого нет у вашего класса ResTable.
Соответственно нужно либо добавить такой конструктор, либо использовать метод с параметрами (если таковой существует, конечно)