Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static LazyElement $(By locator) {
- return new LazyWebDriverElement();
- }
- /*
- интересно)
- а как лейзи-элемент узнает - как искать вебэлемент
- мы локатор - не передали лейзи-элементу
- а чтоб передать - конструктор надо реализовать в классе LazyWebDriverElement
- также - и для $$ с лейзи-коллекцией
- */
- ******************************
- ListNthElementHasText...
- @Override
- public boolean check(List<WebElement> elements) {
- ...
- return (!actualText.contains(expectedText));
- }
- /*
- т е - нас устроит - когда текст элемента НЕ содержит текст ?
- check - должен вернуть true - если проверка прошла
- */
- *****************************************
- с ног уже сбилась в поисках - C:\testing\seleniumtest\src\main\java\core\WaitFor.java
- Error:(26, 43) java: incompatible types: java.lang.Object cannot be converted to T
- и всё тут
- /*
- я приведу подправленный код и прокомментирую
- ты - попробуй разобраться
- http://joxi.ru/Vrwqg81HKnEgB2 - Идея подцвечивает один generic type
- достаточно курсор переместить на этот тип - остальные его упоминатия подцветятся
- так можно себя контролировать)
- */
- public class WaitFor<T> {
- /*
- это уже следствие - что нам нужно объявить тип с <T>
- */
- private LazyEntity<T> entity;
- /*
- раз мы в Condition <T>
- объявили T apply(LazyEntity <T> entity);
- значит - и тут нам надо оперировать LazyEntity <T> для entity
- а раз так = надо тут объявить entity как LazyEntity <T>
- как следствие - и в параметре конструктора - тоже будем оперировать таким же типом
- как следствие - и класс так объявим
- еще - очень важно
- это - не статическое поле
- нам это не надо - мы же until - вызовем у объекта WaitFor, а не у класса
- */
- public WaitFor(LazyEntity<T> entity) {
- this.entity = entity;
- }
- /*
- подправили тип параметра
- */
- public static <T> WaitFor<T> waitFor(LazyEntity<T> entity) {
- return new WaitFor(entity);
- }
- /*
- для этого статического метода - мы объявляем другой <T>
- посмотри - что будет подцвечиваться для этого <T>
- т к этот метод мы вызываем и создаем объект типа WaitFor<T>
- то тут - мы как раз в описании оттталкиваемся от ноъявления <T> для метода
- говорим =
- <T> = метод оперирует дженерик-типом <T>
- WaitFor<T> = возвращает он значение типа WaitFor<T>
- (LazyEntity<T> entity) = оперируя параметром типа LazyEntity<T>
- такой метод мог бы быть реализован и вне класса WaitFor
- и в реализации этого метода - мы оперируем другим <T> (не тем, который объявлен при объявлении класса)
- другим - в том смысле - что не <T> из объявления класса нам объясняет логику использования дженерика в методе
- а наоборот - <T> из объявления метода - объясняет логику использования дженерика в методе
- да - этот метод - статический
- цель - вызвать его для создания объекта (чуть экономим - waitFor(...) вместо new WaitFor(...))
- */
- public T until(Condition <T> condition, long timeout) {
- /*
- а вот этот метод - не статический
- т к мы вызываем его у объекта типа waitFor
- waitFor(...) - вернул нам объект
- waitFor(...).until - вызвали метод у объекта
- */
- Throwable lastError = null;
- long startTime = System.currentTimeMillis();
- do {
- try {
- T result = condition.apply(entity);
- /*
- и тогда тут тоже проблем не возникнет
- */
- ...
- public T until(Condition<T> condition) {
- /*
- тоже - метод не статический
- */
- private void sleep(long milliseconds) {
- /*
- да и этому - теперь незачем быть статическим
- */
- /*
- думаю, такая версия - лучшая
- можно было конечно на уровне Condition <T>
- объявить T apply(LazyEntity entity);
- и потом приводить результат вызова apply к нужному типу..
- в твоем варианте - получится все однозначнее
- это всегда лучше
- */
- /*
- глубже не копала еще
- только самый минимум
- */
Advertisement
Add Comment
Please, Sign In to add comment