В приведенном выше фрагменте ваше globalVariables.tableData_Dashboard.all(by.tagName("tr")).count()
возвращает обещание . Поэтому, когда вы добавляете их вместе, вы добавляете обещание для int и int. Следующая вещь, которая выглядит странно: var Button = 'globalVariables.Edit_Button_'+i;
Это не оценивается как elementFinder. Я согласен с комментарием Йонга выше, где вы должны использовать globalVariables['Edit_Button_'+i];
Так что я собираюсь ответить на этот вопрос с помощью async / await и поток управления отключен. Это с SELENIUM_PROMISE_MANAGER: false,
, установленным в вашем файле конфигурации.
it('should show the same data in both Page' , async () => {
const RowCount=
(await globalVariables.tableData_Dashboard.all(by.tagName("tr")).count()) - 1;
for (var i=1; i < RowCount; ++i){
const button = globalVariables['Edit_Button_'+i];
expect(await button.isDisplayed());
// do something
}
});
Проблема состоит в том, что Методы базового класса являются ее способом объявить ее интерфейс. Это, в сущности говоря, "Это вещи, которые можно сделать к объектам этого класса".
в Производном классе при создании чего-то, Основа объявила как частная общественность, Вы устраняете что-то. Теперь, даже при том, что Производный объект "-" Базовый объект, что-то, что необходимо смочь сделать к объекту Базового класса, который что Вы не можете сделать к объекту Производного класса, повредившись замена Prinicple
Liskov, это вызовет "техническую" проблему в Вашей программе? Возможно, нет. Но это будет, вероятно, означать, что объект Ваших классов не будет вести себя способом, Ваши пользователи ожидают, что они будут вести себя.
при нахождении в ситуации, где это - то, что Вы хотите (кроме случая устаревшего метода, упомянутого в другом ответе), возможности - Вы, имеют модель наследования, где наследование действительно не моделирует, "-", (например, Квадрат Scott Myers в качестве примера, наследовавшийся Прямоугольнику, но Вы не можете измениться, ширина Квадрата, независимая от ее высоты как Вы, может для прямоугольника), и Вы, возможно, должны пересмотреть свои отношения класса.
Вы действительно получаете неожиданный результат, что, если у Вас есть ребенок, Вы не можете назвать нечто, но можно бросить его к основе и затем назвать нечто.
child *c = new child();
c->foo; // compile error (can't access private member)
static_cast<base *>(c)->foo(); // this is fine, but still calls the implementation in child
я предполагаю, что Вы смогли изобретать пример, где Вы не хотите выставленной функции, кроме тех случаев, когда Вы рассматриваете его как экземпляр базового класса. Но самое то, что та ситуация открывается, предложило бы плохой дизайн OO где-нибудь вдоль строки, которая должна, вероятно, быть пересмотрена.
Нет никакой технической проблемы, но Вы закончите с ситуацией, где общедоступные функции будут зависеть от того, есть ли у Вас основа или полученный указатель.
Это, по-моему, было бы странно и сбивало бы с толку.
Может быть очень полезно, если Вы используете частное наследование - т.е. Вы хотите снова использовать (специализированную) функциональность базового класса, но не интерфейс.
Это может быть сделано и достаточно редко приведет к преимуществам. Например, в нашей кодовой базе, мы пользуемся библиотекой, которая содержит класс с государственной функцией, которую мы раньше использовали, но теперь препятствовали использованию должных к другим потенциальным проблемам (существуют более безопасные методы для вызова). Мы также, оказывается, получаем класс из того класса, который много нашего кода использует непосредственно. Так, мы сделали заданную функцию частной в производном классе, чтобы помочь всем не забыть не использовать его, если они могут помочь ему. Это не устраняет способность использовать его, но это поймает некоторое использование, когда код попытается скомпилировать, а не позже в обзорах кода.