Перейти к содержимому

Фотография

Ожтдание элемента


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 30

#1 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 19 февраля 2013 - 14:18

Добрый день
Использую Джаву и ВебДрайвер. Есть ли аналог для presenceOfElementLocatedBy(locator) только, чтобы вместо локатора был веб элемент. Типа такого presenceOfElement(WebElement). Просто странно как-то. Ждать по локатору можно, а по элементу - нет
  • 1

#2 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 19 февраля 2013 - 14:47

примерно что-то подобное?
    public boolean isListElementsPresentByXpath(String xpath) {
        return getListElementsByXPath(xpath).size() > 0;
    }

    public List<WebElement> getListElementsByXPath(final String xpath) {
        try {
            return driver.findElements(By.xpath(xpath));
        } catch (Exception e) {
            throw new UnsupportedOperationException("Неудалось получить список элементов!\nxpath: [" + xpath + "]\n"
                    + e.getMessage());
        }
    }

  • 0

#3 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 19 февраля 2013 - 14:58

примерно что-то подобное?

    public boolean isListElementsPresentByXpath(String xpath) {
        return getListElementsByXPath(xpath).size() > 0;
    }

    public List<WebElement> getListElementsByXPath(final String xpath) {
        try {
            return driver.findElements(By.xpath(xpath));
        } catch (Exception e) {
            throw new UnsupportedOperationException("Неудалось получить список элементов!\nxpath: [" + xpath + "]\n"
                    + e.getMessage());
        }
    }

нет. Тут выищите по Хпасу. У меня же есть страничка с вебЭлементами и я получаю их в свой тест и с ними работаю. Не хотелось придумывать велосипед, думал, что уже есть готовое решение
  • 0

#4 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 20 февраля 2013 - 06:31

Что значит вэбЭлементы?!?!?!?
Приведите пример строчки к которой вы хотите обратиться.
  • 0

#5 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 871 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 20 февраля 2013 - 07:22

Добрый день
Использую Джаву и ВебДрайвер. Есть ли аналог для presenceOfElementLocatedBy(locator) только, чтобы вместо локатора был веб элемент. Типа такого presenceOfElement(WebElement). Просто странно как-то. Ждать по локатору можно, а по элементу - нет

presenceOfElementLocatedBy ожидает появления элемента в DOM. То есть его ещё нет. Как можно передать в качестве параметра ссылку на элемент, которого ещё нет?
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#6 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 20 февраля 2013 - 09:49

public WebElement myButton() {
		return driver.findElement(By.linkText("Test"));
	}
а потом в коде к нему обращаюсь myButton().click();

Алексей, я не знаю, что вам ответить :unknw:
  • 0

#7 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 21 февраля 2013 - 10:13

public WebElement myButton() {
		return driver.findElement(By.linkText("Test"));
	}
а потом в коде к нему обращаюсь myButton().click();

Алексей, я не знаю, что вам ответить :unknw:/>/>


Концепция видимо у селена2 другая...

Могу посоветовать не таскать за собой WebElement, а таскать то, с помощью чего вы его ищите, а именно (как один из вариантов): объект By. Правда тогда при каждом обращении вам придется искать его findElement(by), но зато будет гарантия, что вы имеете элемент в актуальном состоянии.

P.S. Лично я в своих тестах использую, вообще, третий подход :) оставшийся в наследство от старого фреймворка. Пейджи изолированы от инструмента и его объектов, они хранят только критерии поиска элементов и все. А связь инструмента и так называемого "браузера" реализована в отдельном слое. В моем случае только благодая этому мы удачно (с минимальными изменениями кода) мигрировались с WATIJ на Селен1 и с Селен1 на Селен2.
  • 0
Алексей Булат
Про Тестинг

#8 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 21 февраля 2013 - 12:18

спасибо за совет. Пока останусь с тем, что есть.
  • 0

#9 Wrestler

Wrestler

    Новый участник

  • Members
  • Pip
  • 6 сообщений

Отправлено 26 февраля 2013 - 14:35

Всем,Привет)
Хотелось бы обратиться с вопросом.
Не могу добиться стабильности работы ожидания. Использую C# и webdriver.

Нарушается последовательность кликов.
Должен:

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link"))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link1))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link2))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

А он проходит рандомно:

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link"))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link9))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

Т.е. последовательность кликов которая должна быть не сохраняется. Теряется стабильность.
  • 0

#10 Nwd

Nwd

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 19 июня 2013 - 11:28

Такой вариант устроит:

List<WebElement> buttons = driver.findElements(By.linkText("Test"));
while (buttons.size() == 0) try {System.out.println(" Кнопки еще нет, ждем 20000 ms и перегружаем страницу");
Thread.sleep(20000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
driver.get("");//тут надо перегрузить нужную страницу
buttons = driver.findElements(By.linkText("Test"));
}
  • 0

#11 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 19 июня 2013 - 12:56

Затыкается тест при поиске одного элемента, ничего не помогает, все равно то проходит, то затыкается. Причем другие элементы ищутся нормально, а с одним только беда

Вот код:
При инициализации

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

Так

(new WebDriverWait(driver, 20)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("span.k-font-icon.icon-plus-3")));
    
    driver.findElement(By.cssSelector("span.k-font-icon.icon-plus-3")).click();

или

for (int second = 0;; second++) {
    	if (second >= 60) fail("timeout");
    	try { if (isElementPresent(By.cssSelector("span.k-font-icon.icon-plus-3"))) break; } catch (Exception e) {}
    	Thread.sleep(1000);
    }
    driver.findElement(By.cssSelector("span.k-font-icon.icon-plus-3")).click()

Даже просто Thread.sleep(1000) не помогает - все равно затыкается, хотя ничего собенного в элементе нет, в примере я ищу его по css, но и пробовал по id все равно затупливает иногда


В чем может быть проблема?

Сообщение отредактировал lokofc: 19 июня 2013 - 13:00

  • 0

#12 Rara

Rara

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • ФИО:Кондрашов Юрий Алексеевич
  • Город:Минск, Беларусь


Отправлено 19 июня 2013 - 13:54

Попробуйте на странице, после того как произошёл "затык", поискать элемент по локатору с помощью плагина FirePath к FireFox (его нужно заблаговременно подключить к браузеру в автотесте). И посмотрите, сколько элементов по данному локатору будет найдено:
0 - неверный локатор элемента (возможно он меняется?)
1 - тут я пас (баг веб-драйвера?)
2 и более - возможно первые элементы в DOM'е невидимые, из-за них могут быть проблемы при работе методов visibilityOfElementLocated и click.

Важно анализировать именно ту страницу, на которой упал тест, а не точно такую же в соседнем браузере, т.к. могут быть нюансы.
  • 0
Я бы переписал жизнь, но Бог не дает мне исходники

#13 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 19 июня 2013 - 14:07

Попробуйте на странице, после того как произошёл "затык", поискать элемент по локатору с помощью плагина FirePath к FireFox (его нужно заблаговременно подключить к браузеру в автотесте). И посмотрите, сколько элементов по данному локатору будет найдено:
0 - неверный локатор элемента (возможно он меняется?)
1 - тут я пас (баг веб-драйвера?)
2 и более - возможно первые элементы в DOM'е невидимые, из-за них могут быть проблемы при работе методов visibilityOfElementLocated и click.

Важно анализировать именно ту страницу, на которой упал тест, а не точно такую же в соседнем браузере, т.к. могут быть нюансы.


я задал уникальный локатор, других таких на страце впринципе нет, и он не меняется. Самое обидное, что тоже самое в IDE бегает безошибочно.
  • 0

#14 Keiga

Keiga

    Постоянный участник

  • Members
  • PipPipPip
  • 174 сообщений
  • ФИО:Евгений
  • Город:Москва


Отправлено 19 июня 2013 - 14:23

Попробуйте с инициализацией, но без
(new WebDriverWait(driver, 20)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("span.k-font-icon.icon-plus-3")));

  • 0

#15 Rara

Rara

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • ФИО:Кондрашов Юрий Алексеевич
  • Город:Минск, Беларусь


Отправлено 19 июня 2013 - 14:28

Тогда попробуйте посмотреть консоль ошибок в браузере (Ctrl+Shift+J в FireFox'е).

тоже самое в IDE бегает безошибочно.

Я бы тогда искал разницу в окружении: версии браузера, веб-драйвера и т.д.
  • 0
Я бы переписал жизнь, но Бог не дает мне исходники

#16 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 19 июня 2013 - 15:53

Тогда попробуйте посмотреть консоль ошибок в браузере (Ctrl+Shift+J в FireFox'е).

тоже самое в IDE бегает безошибочно.

Я бы тогда искал разницу в окружении: версии браузера, веб-драйвера и т.д.



Пробовал через Chrome, в нем тест валится каждый раз и выдает ошибку

message": "unknown error: Element is not clickable at point (553, 44). Other element would receive the click: \u003Cdiv class=\"k-loading-image\"\u003E\u003C/div\u003E\n (Session info: chrome=27.0.1453.110)\n (Driver info: chromed..."


Причем локатор поменял вообще на беспроигрышный id
  • 0

#17 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 19 июня 2013 - 16:12

Каким-то невероятным образом все заработало в Chrome после того, как я убрал

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS)

из инициализации, включил позже, а перед поиском того самого долбанного элемента выставил Thread.sleep(3000);

Непонятно вобщем.
  • 0

#18 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 20 июня 2013 - 04:02

Кажется я понял в чем дело, может кому пригодится.

Суть проблемы в том, что элемент загружается и становится видимым и проходит условие

(new WebDriverWait(driver, 20))
         .until(ExpectedConditions.visibilityOfElementLocated(By.id("globalCreateButton")));


однако в этот момент он еще не готов к нажатию(если можно так выразиться) и если сразу после этого ожидания идет команда .click(), то тест валится и в логах я вижу ошибку "element is not clickable".

Поэтому я закоментил команду click() и увидел, что ожидание элемента все-таки происходит(пока элемента нет в логах четко видно ожидание), и казалось бы решением бы этой проблемы должно стать это

(new WebDriverWait(driver, 20))
         .until(ExpectedConditions.elementToBeClickable(By.id("globalCreateButton")));

но к сожалению это тоже не помогло, а вот маленькая задержка после неявного ожидания буквально в 500мс(Thread.sleep(500);) уже помогает - все работает.
  • 1

#19 Rara

Rara

    Активный участник

  • Members
  • PipPip
  • 83 сообщений
  • ФИО:Кондрашов Юрий Алексеевич
  • Город:Минск, Беларусь


Отправлено 20 июня 2013 - 07:52

message": "unknown error: Element is not clickable at point (553, 44). Other element would receive the click: \u003Cdiv class=\"k-loading-image\"\u003E\u003C/div\u003E\n (Session info: chrome=27.0.1453.110)\n (Driver info: chromed..."

Судя по этому сообщению клик по факту попадает в какой-то другой элемент (который, видимо, находится поверх нужного нам). Можно попробовать ждать пропадания элемента
div class="k-loading-image"
и лишь затем кликать.

беспроигрышный id

В общем случае, id - не беспроигрышный вариант, так как веб-разработчики могут отходить от стандартов (а иногда просто ошибаться).
  • 0
Я бы переписал жизнь, но Бог не дает мне исходники

#20 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 20 июня 2013 - 11:37

Идея хорошая, я уже начал ее реализовывать, но у меня на этой странице нет ни одного элемента .k-loading-image, вообще не понимаю откуда он и как в него клик попадает.
И еще не понимаю - как вообще возможно, что есть что-то поверх нужного элемента что-то? Вот если бы было два локатора по id=globalCreateButton, то тогда понятно - первым прогрузился не тот, что нужен, тыкнули в него.

Сообщение отредактировал lokofc: 21 июня 2013 - 05:22

  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных