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

Фотография

Selenium 2 и isTextPresent


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

#1 nstreltsov

nstreltsov

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

  • Members
  • PipPip
  • 116 сообщений
  • ФИО:Стрельцов Николай Игоревич
  • Город:Москва


Отправлено 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

Можете подсказать какое-нибудь решение данной проблемы?
  • 0

#2 Demetri

Demetri

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

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 27 октября 2011 - 10:04

1)
В WebDriver проверку isTextPresent можно заменить чем-то вроде
driver.getPageSource().contains("Some Text");
или
driver.findElement(By.xpath("//html")).getText().contains("Some Text");

2)
Как реализована проверка isElementPresent?
  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#3 popo_kid

popo_kid

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

  • Members
  • PipPip
  • 79 сообщений

Отправлено 27 октября 2011 - 10:28

Demetri, таким методом вы можете найти текст в атрибуте html тега. например в alt у img

а такое нельзя использовать ?
//*[text()='some text']

  • 0

#4 popo_kid

popo_kid

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

  • Members
  • PipPip
  • 79 сообщений

Отправлено 27 октября 2011 - 10:43

специально залез в исходники RC, он делает точно как предложил Demetri
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);
};

  • 0

#5 Wolonter

Wolonter

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

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


Отправлено 27 октября 2011 - 10:53

driver.getPageSource().contains("Some Text");

Катит сильно не везде. У нас на gwt не катит.

driver.findElement(By.xpath("//html")).getText().contains("Some Text");

А это должно катить.

Я бы попробовал так, ну, чтоб скучно не было:
driver.findElements(By.xpath("//*[text()='Я ищу этот текст']")).isEmpty();

  • 0

#6 Demetri

Demetri

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

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 27 октября 2011 - 10:56

Demetri, таким методом вы можете найти текст в атрибуте html тега. например в alt у img
...

Первым - да, вторым - нет, т.к. getText берет только видимый пользователю текст

...
а такое нельзя использовать ?

//*[text()='some text']

Нет, это поиск элемента по содержащемуся в нем тексту, а не определение присутствия текста на странице - разницу чувствуете? :)
  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#7 Demetri

Demetri

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

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 27 октября 2011 - 10:57

...
Я бы попробовал так, ну, чтоб скучно не было:

driver.findElements(By.xpath("//*[text()='Я ищу этот текст']")).isEmpty();

Тогда уж так:
driver.findElements(By.xpath("//*[contains(text(),'Я ищу этот текст')]")).isEmpty();

  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#8 Wolonter

Wolonter

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

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


Отправлено 27 октября 2011 - 12:48

Тогда уж так:

driver.findElements(By.xpath("//*[contains(text(),'Я ищу этот текст')]")).isEmpty();


Дада, запамятовал =)
  • 0

#9 nstreltsov

nstreltsov

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

  • Members
  • PipPip
  • 116 сообщений
  • ФИО:Стрельцов Николай Игоревич
  • Город:Москва


Отправлено 27 октября 2011 - 14:21


Тогда уж так:

driver.findElements(By.xpath("//*[contains(text(),'Я ищу этот текст')]")).isEmpty();


Дада, запамятовал =)


Разве тест не оставится, если "Текст1" не будет найден?
if(driver.findElements(By.xpath("//*[contains(text(),'Текст1')]")).isEmpty();){
//какие -то действя

}
//какие - то действия
  • 0

#10 Demetri

Demetri

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

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 27 октября 2011 - 14:34

Нет, findElementS возвращается список элементов, удовлетворяющих локатору. Если ни одного элемента найдено не будет, то вернется просто пустой список.
  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#11 nstreltsov

nstreltsov

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

  • Members
  • PipPip
  • 116 сообщений
  • ФИО:Стрельцов Николай Игоревич
  • Город:Москва


Отправлено 28 октября 2011 - 07:46

спасибо большое, буду пробовать)
  • 0

#12 baieritrin

baieritrin

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

  • Members
  • Pip
  • 6 сообщений
  • ФИО:Лежалкин Руслан


Отправлено 28 октября 2011 - 12:00

:-) искал-искал .isEmpty() и понять не могу где вы её нашли. предположил что вы на другом языке пишите.
  • 0

#13 Leoxa

Leoxa

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

  • Members
  • Pip
  • 59 сообщений
  • ФИО:Алексей

Отправлено 28 октября 2011 - 12:37

:-) искал-искал .isEmpty() и понять не могу где вы её нашли. предположил что вы на другом языке пишите.


в java есть. :wink:
  • 0

#14 nstreltsov

nstreltsov

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

  • Members
  • PipPip
  • 116 сообщений
  • ФИО:Стрельцов Николай Игоревич
  • Город:Москва


Отправлено 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

Подскажите как дожидаться загрузки страницы, а только потом искать текст?
  • 0

#15 Wolonter

Wolonter

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

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


Отправлено 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 - функция, которая ждет, пока обнулится счетчик асинхронных запросов к серверу, который мы попросили вывести программистов в виде невидимого элемента страницы. Грубо говоря - индикатор загрузки для асинхронного интерфейса.

З.Ы. Это то, что нужно?
  • 1

#16 nstreltsov

nstreltsov

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

  • Members
  • PipPip
  • 116 сообщений
  • ФИО:Стрельцов Николай Игоревич
  • Город:Москва


Отправлено 31 октября 2011 - 12:17

думал есть что-то попроще, аналогичное waitForPageToLoad("")
  • 0

#17 Wolonter

Wolonter

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

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


Отправлено 31 октября 2011 - 12:42

думал есть что-то попроще, аналогичное waitForPageToLoad("")


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


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

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