Selenium 2 и isTextPresent
#1
Отправлено 27 октября 2011 - 08:48
Начал переводить тесты с selenium RC на selenium 2.
Столкнулся со следующей проблемой, в тестах у меня есть несколько проверок на текст вида:
if (selenium.isTextPresent("Личная информация")) {
while (selenium.isTextPresent("Удалено") == false) {
Click.link(driver, DelApps);
}
}
В selenium 2 я что-то не нашел проверок текста, пробовал решить эту проблему так:
if (isElementPresent(By.cssSelector("div.app_name"))) {
while (isElementPresent(By.cssSelector("div.app_del"))) == false) {
Click.link(driver, DelApps);
}
}
Selenium 2 останавливается, если не находит div.app_name ошибка:
org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"css selector","selector":"div.app_name"}; duration or timeout: 10.05 seconds
Можете подсказать какое-нибудь решение данной проблемы?
#2
Отправлено 27 октября 2011 - 10:04
В WebDriver проверку isTextPresent можно заменить чем-то вроде
driver.getPageSource().contains("Some Text");или
driver.findElement(By.xpath("//html")).getText().contains("Some Text");
2)
Как реализована проверка isElementPresent?
#3
Отправлено 27 октября 2011 - 10:28
а такое нельзя использовать ?
//*[text()='some text']
#4
Отправлено 27 октября 2011 - 10:43
Selenium.prototype.isTextPresent = function(pattern) { /** * Verifies that the specified text pattern appears somewhere on the rendered page shown to the user. * @param pattern a <a href="#patterns">pattern</a> to match with the text of the page * @return boolean true if the pattern matches the text, false otherwise */ var allText = this.browserbot.bodyText(); var patternMatcher = new PatternMatcher(pattern); if (patternMatcher.strategy == PatternMatcher.strategies.glob) { if (pattern.indexOf("glob:")==0) { pattern = pattern.substring("glob:".length); // strip off "glob:" } patternMatcher.matcher = new PatternMatcher.strategies.globContains(pattern); } else if (patternMatcher.strategy == PatternMatcher.strategies.exact) { pattern = pattern.substring("exact:".length); // strip off "exact:" return allText.indexOf(pattern) != -1; } return patternMatcher.matches(allText); };
#5
Отправлено 27 октября 2011 - 10:53
Катит сильно не везде. У нас на gwt не катит.driver.getPageSource().contains("Some Text");
А это должно катить.driver.findElement(By.xpath("//html")).getText().contains("Some Text");
Я бы попробовал так, ну, чтоб скучно не было:
driver.findElements(By.xpath("//*[text()='Я ищу этот текст']")).isEmpty();
#6
Отправлено 27 октября 2011 - 10:56
Первым - да, вторым - нет, т.к. getText берет только видимый пользователю текстDemetri, таким методом вы можете найти текст в атрибуте html тега. например в alt у img
...
Нет, это поиск элемента по содержащемуся в нем тексту, а не определение присутствия текста на странице - разницу чувствуете? :)...
а такое нельзя использовать ?//*[text()='some text']
#7
Отправлено 27 октября 2011 - 10:57
Тогда уж так:...
Я бы попробовал так, ну, чтоб скучно не было:driver.findElements(By.xpath("//*[text()='Я ищу этот текст']")).isEmpty();
driver.findElements(By.xpath("//*[contains(text(),'Я ищу этот текст')]")).isEmpty();
#8
Отправлено 27 октября 2011 - 12:48
Тогда уж так:
driver.findElements(By.xpath("//*[contains(text(),'Я ищу этот текст')]")).isEmpty();
Дада, запамятовал =)
#9
Отправлено 27 октября 2011 - 14:21
Тогда уж так:driver.findElements(By.xpath("//*[contains(text(),'Я ищу этот текст')]")).isEmpty();
Дада, запамятовал =)
Разве тест не оставится, если "Текст1" не будет найден?
if(driver.findElements(By.xpath("//*[contains(text(),'Текст1')]")).isEmpty();){
//какие -то действя
}
//какие - то действия
#10
Отправлено 27 октября 2011 - 14:34
#11
Отправлено 28 октября 2011 - 07:46
#12
Отправлено 28 октября 2011 - 12:00
#13
Отправлено 28 октября 2011 - 12:37
:-) искал-искал .isEmpty() и понять не могу где вы её нашли. предположил что вы на другом языке пишите.
в java есть.
#14
Отправлено 31 октября 2011 - 11:02
при выполнении этого кода он проверяет текст на страница, на которой находится кнопка по которой происходит click:
driver.findElement(By.cssSelector("span.ncc > a")).click();
if (driver.findElements(By.xpath("//*[contains(text(),'GameNet')]")).isEmpty()) {
в этом случае
driver.findElements(By.xpath("//*[contains(text(),'GameNet')]")).isEmpty() = true
При выполнении этого кода проверяется текст на той странице, которая открывается после click:
driver.findElement(By.cssSelector("span.ncc > a")).click();
TimerHelper timerHelper = new TimerHelper();
timerHelper.Timer(10000);
if (driver.findElements(By.xpath("//*[contains(text(),'GameNet')]")).isEmpty()) {
в этом случае
driver.findElements(By.xpath("//*[contains(text(),'GameNet')]")).isEmpty() = false
Подскажите как дожидаться загрузки страницы, а только потом искать текст?
#15
Отправлено 31 октября 2011 - 12:07
небольшая проблема возникла, селениум не хочет ждать загрузки страницы
Подскажите как дожидаться загрузки страницы, а только потом искать текст?
Тайм-ауты не используй друг, на темную сторону силы ведут они.
1. Использовать можешь ты мечом световым владения навыки:
public boolean waitPresentOrAbsentElement(final By by, long maxTimeOutInSeconds, final boolean presentOrAbsent) { WebDriverWait wait = new WebDriverWait(_driver, maxTimeOutInSeconds); boolean result; try { wait.until(new Function<WebDriver, Boolean>() { @Override public Boolean apply(WebDriver driver) { // ^ - Сложение по модулю 2 // Таблица истиности и описание. // true^true = false - Ожидаем элемент, но элемент отсутствует - ждем далее. // true^false = true - Ожидаем элемент, элемент присутствует - завершаем ожидание. // false^true = true - Ожидаем исчезновение элемента, элемент отсутствует - завершаем ожидание. // false^false = false - Ожидаем исчезновение элемента, но элемент присутствует - ждем далее. return Boolean.valueOf(presentOrAbsent ^ driver.findElements(by).isEmpty()); } }); result = true; } catch (TimeoutException exc) { result = false; } return result; }
2. Или же познать глубинную суть силы можешь ты:
@Override public WebElement findElement(By by) { waitForAsyncCall(); return getWebDriver().findElement(by); }
Где waitForAsyncCall - функция, которая ждет, пока обнулится счетчик асинхронных запросов к серверу, который мы попросили вывести программистов в виде невидимого элемента страницы. Грубо говоря - индикатор загрузки для асинхронного интерфейса.
З.Ы. Это то, что нужно?
#16
Отправлено 31 октября 2011 - 12:17
#17
Отправлено 31 октября 2011 - 12:42
думал есть что-то попроще, аналогичное waitForPageToLoad("")
Мы не нашли. Сдается мне, потому, что у динамического html событие загрузки страницы отсутствует, в любой момент может идти обмен данными.
Ну или мы не там искали, да.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных