Ожтдание элемента
#1
Отправлено 19 февраля 2013 - 14:18
Использую Джаву и ВебДрайвер. Есть ли аналог для presenceOfElementLocatedBy(locator) только, чтобы вместо локатора был веб элемент. Типа такого presenceOfElement(WebElement). Просто странно как-то. Ждать по локатору можно, а по элементу - нет
#2
Отправлено 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()); } }
#3
Отправлено 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()); } }
#4
Отправлено 20 февраля 2013 - 06:31
Приведите пример строчки к которой вы хотите обратиться.
#5
Отправлено 20 февраля 2013 - 07:22
presenceOfElementLocatedBy ожидает появления элемента в DOM. То есть его ещё нет. Как можно передать в качестве параметра ссылку на элемент, которого ещё нет?Добрый день
Использую Джаву и ВебДрайвер. Есть ли аналог для presenceOfElementLocatedBy(locator) только, чтобы вместо локатора был веб элемент. Типа такого presenceOfElement(WebElement). Просто странно как-то. Ждать по локатору можно, а по элементу - нет
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#6
Отправлено 20 февраля 2013 - 09:49
public WebElement myButton() { return driver.findElement(By.linkText("Test")); }а потом в коде к нему обращаюсь myButton().click();
Алексей, я не знаю, что вам ответить
#7
Отправлено 21 февраля 2013 - 10:13
public WebElement myButton() { return driver.findElement(By.linkText("Test")); }а потом в коде к нему обращаюсь myButton().click();
Алексей, я не знаю, что вам ответить />/>
Концепция видимо у селена2 другая...
Могу посоветовать не таскать за собой WebElement, а таскать то, с помощью чего вы его ищите, а именно (как один из вариантов): объект By. Правда тогда при каждом обращении вам придется искать его findElement(by), но зато будет гарантия, что вы имеете элемент в актуальном состоянии.
P.S. Лично я в своих тестах использую, вообще, третий подход :) оставшийся в наследство от старого фреймворка. Пейджи изолированы от инструмента и его объектов, они хранят только критерии поиска элементов и все. А связь инструмента и так называемого "браузера" реализована в отдельном слое. В моем случае только благодая этому мы удачно (с минимальными изменениями кода) мигрировались с WATIJ на Селен1 и с Селен1 на Селен2.
Про Тестинг
#8
Отправлено 21 февраля 2013 - 12:18
#9
Отправлено 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();
Т.е. последовательность кликов которая должна быть не сохраняется. Теряется стабильность.
#10
Отправлено 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"));
}
#11
Отправлено 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
#12
Отправлено 19 июня 2013 - 13:54
0 - неверный локатор элемента (возможно он меняется?)
1 - тут я пас (баг веб-драйвера?)
2 и более - возможно первые элементы в DOM'е невидимые, из-за них могут быть проблемы при работе методов visibilityOfElementLocated и click.
Важно анализировать именно ту страницу, на которой упал тест, а не точно такую же в соседнем браузере, т.к. могут быть нюансы.
#13
Отправлено 19 июня 2013 - 14:07
Попробуйте на странице, после того как произошёл "затык", поискать элемент по локатору с помощью плагина FirePath к FireFox (его нужно заблаговременно подключить к браузеру в автотесте). И посмотрите, сколько элементов по данному локатору будет найдено:
0 - неверный локатор элемента (возможно он меняется?)
1 - тут я пас (баг веб-драйвера?)
2 и более - возможно первые элементы в DOM'е невидимые, из-за них могут быть проблемы при работе методов visibilityOfElementLocated и click.
Важно анализировать именно ту страницу, на которой упал тест, а не точно такую же в соседнем браузере, т.к. могут быть нюансы.
я задал уникальный локатор, других таких на страце впринципе нет, и он не меняется. Самое обидное, что тоже самое в IDE бегает безошибочно.
#14
Отправлено 19 июня 2013 - 14:23
(new WebDriverWait(driver, 20)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("span.k-font-icon.icon-plus-3")));
#15
Отправлено 19 июня 2013 - 14:28
Я бы тогда искал разницу в окружении: версии браузера, веб-драйвера и т.д.тоже самое в IDE бегает безошибочно.
#16
Отправлено 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
#17
Отправлено 19 июня 2013 - 16:12
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS)
из инициализации, включил позже, а перед поиском того самого долбанного элемента выставил Thread.sleep(3000);
Непонятно вобщем.
#18
Отправлено 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);) уже помогает - все работает.
#19
Отправлено 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
#20
Отправлено 20 июня 2013 - 11:37
И еще не понимаю - как вообще возможно, что есть что-то поверх нужного элемента что-то? Вот если бы было два локатора по id=globalCreateButton, то тогда понятно - первым прогрузился не тот, что нужен, тыкнули в него.
Сообщение отредактировал lokofc: 21 июня 2013 - 05:22
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных