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

Фотография

Проблема с ожиданием исчезновения элемента в WebDriver


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

#1 Kastet

Kastet

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

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

Отправлено 16 ноября 2011 - 13:20

Добрый день
Есть у меня следующая задача: необходимо дождаться исчезновения элемента типа "Ожидайте загрузку", и после этого уже анализировать полученный в виде таблицы результат.
Воспользовался примером ожидания появления элемента на странице

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
{
return d.FindElement(By.XPath("//table/tbody/tr/td/div[2]/div/div/div[3]/div[2]/div/table/tbody/tr/td[3]/div"));
});

но мне его надо переделать под то, что я ожидаю исчезновения элемента. Но вот не знаю, как это сделать. Использую WebDriver. Может кто-то знает как это сделать?
Заранее спасибо.
  • 0

#2 barancev

barancev

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

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


Отправлено 16 ноября 2011 - 13:54

Для Java есть ряд уже готовых условий, в том числе такое:
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(null));

Вот реализация этого условия, если в .Net нет аналога, переделайте самостоятельно:
/**
   * An Expectation for checking that an element is either invisible or not
   * present on the DOM.
   *
   * @param locator used to find the element
   */
  public static ExpectedCondition<Boolean> invisibilityOfElementLocated(
      final By locator) {
    return new ExpectedCondition<Boolean>() {
      public Boolean apply(WebDriver driver) {
        try {
          return !(findElement(locator, driver).isDisplayed());
        } catch (NoSuchElementException e) {
          // Returns true because the element is not present in DOM. The
          // try block checks if the element is present but is invisible.
          return true;
        } catch (StaleElementReferenceException e) {
          // Returns true because stale element reference implies that element
          // is no longer visible.
          return true;
        }
      }
    };
  }

  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#3 nstreltsov

nstreltsov

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

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


Отправлено 16 ноября 2011 - 15:00

вопрос к теме, если элемент не видим, то как в этом случае записать if, т.е. если элемент видим, то выполнить такое то действие, если не видим, то другое?
сейчас если элемент не видим, то тест останавливается, ошибка org.openqa.selenium.NoSuchElementException: Unable to locate element:

Что-то как - то я слишком много вопросов походу задаю, аж стыдно становится(
  • 0

#4 Demetri

Demetri

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

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


Отправлено 16 ноября 2011 - 17:24

вопрос к теме, если элемент не видим, то как в этом случае записать if, т.е. если элемент видим, то выполнить такое то действие, если не видим, то другое?
...

Метод для определения видимости элемента
if(!driver.findElements(By.locator).isEmpty()){ // Проверяем, что элемент присутствует на странице
	if(driver.findElement(By.locator).isDisplayed()){ // Проверяем видимость элемента
		return true;
	}
}
return false;

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

#5 barancev

barancev

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

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


Отправлено 16 ноября 2011 - 17:36

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

#6 Tan_Sid

Tan_Sid

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

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Сидорова Татьяна

Отправлено 08 декабря 2012 - 09:43

скажите пожалуйста, а как и где это применить

"Для Java есть ряд уже готовых условий, в том числе такое:
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(null));"

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

Страница не успевает загрузиться, как действия начинают выполнятся и тест валится.Я использовала Thread.sleep(); но их во многих местах приходится вставлять, что очень замедляет тесты.

заранее спасибо!
  • 0

#7 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 897 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 09 декабря 2012 - 08:49

скажите пожалуйста, а как и где это применить

"Для Java есть ряд уже готовых условий, в том числе такое:
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(null));"

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

Страница не успевает загрузиться, как действия начинают выполнятся и тест валится.Я использовала Thread.sleep(); но их во многих местах приходится вставлять, что очень замедляет тесты.

заранее спасибо!

в setUp стоит
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
???
  • 0

#8 Tan_Sid

Tan_Sid

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

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Сидорова Татьяна

Отправлено 10 декабря 2012 - 04:52

да, эта строчка прописана, но тестам все равно не хватает ожидания загрузки страницы...
  • 0

#9 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 897 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 10 декабря 2012 - 08:52

да, эта строчка прописана, но тестам все равно не хватает ожидания загрузки страницы...

Нужен код
WebDriver автоматически ждет загрузку страницы.
Поэтому 2 возможных варианта:
1)страница содержит аякс
2)Вы что-нибудь не так делаете

без кода сложно сказать
  • 0

#10 appmen

appmen

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

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

Отправлено 10 декабря 2012 - 15:46

я раньше делал просто,
если (текст сообщения.содержит("Ожидание загрузки")){
Ждать 1 секунду
}
иначе {
какой-то дод, хотя можно и без него
}

  • 0

#11 Tan_Sid

Tan_Sid

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

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Сидорова Татьяна

Отправлено 11 декабря 2012 - 07:46


да, эта строчка прописана, но тестам все равно не хватает ожидания загрузки страницы...

Нужен код
WebDriver автоматически ждет загрузку страницы.
Поэтому 2 возможных варианта:
1)страница содержит аякс
2)Вы что-нибудь не так делаете

без кода сложно сказать




вот код:

<div id="login-form">
<form id="login" class="form-block" method="post" action="">
<div id="message-block" class="message-block public-message message-info hidden">
<div class="message-inner">
</div>
<div>
<div class="form-one-line-block">
<label for="login_username">email</label>
<input id="login_username" class="require valid" type="text" value="" name="login_username">
</div>
<div class="form-one-line-block">
<div class="container">
<input id="login_password" class="require valid" type="password" name="login_password">
</div>
<div class="form-one-line-block">
<button id="btn" class="button" type="submit">
<span class="button-l"></span>
<span class="button-c">Войти</span>
<span class="button-r"></span>
</button>
</div>
</div>
</form>

вожу логин, пароль и валится на кнопки вход, если поставить sleep хотя бы на 2 сек, то кнопка нажимается и все ОК

делала так
public void setUp() throws Exception {

driver = new FirefoxDriver();


driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
baseUrl = "https://";



///
driver.findElement(By.id("login_username")).clear();
driver.findElement(By.id("login_username")).sendKeys("daniil-potapov@bk.ru");
driver.findElement(By.id("login_password")).clear();
driver.findElement(By.id("login_password")).sendKeys("123456789q");

waitAndClickBy("btn");
  • 0

#12 prostooleg1

prostooleg1

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

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 11 декабря 2012 - 20:11

скажите пожалуйста, а как и где это применить

"Для Java есть ряд уже готовых условий, в том числе такое:
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(null));"

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

Страница не успевает загрузиться, как действия начинают выполнятся и тест валится.Я использовала Thread.sleep(); но их во многих местах приходится вставлять, что очень замедляет тесты.

заранее спасибо!


import static org.openqa.selenium.support.ui.ExpectedConditions.*;

waitFor(invisibilityOfElementLocated(By.cssSelector("селектор элемента, который хотите дождаться чтобы стал невидимый")));
  • 0

#13 Tan_Sid

Tan_Sid

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

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Сидорова Татьяна

Отправлено 12 декабря 2012 - 08:50


скажите пожалуйста, а как и где это применить

"Для Java есть ряд уже готовых условий, в том числе такое:
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(null));"

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

Страница не успевает загрузиться, как действия начинают выполнятся и тест валится.Я использовала Thread.sleep(); но их во многих местах приходится вставлять, что очень замедляет тесты.

заранее спасибо!


import static org.openqa.selenium.support.ui.ExpectedConditions.*;

waitFor(invisibilityOfElementLocated(By.cssSelector("селектор элемента, который хотите дождаться чтобы стал невидимый")));



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

#14 prostooleg1

prostooleg1

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

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 15 декабря 2012 - 08:59



скажите пожалуйста, а как и где это применить

"Для Java есть ряд уже готовых условий, в том числе такое:
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(null));"

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

Страница не успевает загрузиться, как действия начинают выполнятся и тест валится.Я использовала Thread.sleep(); но их во многих местах приходится вставлять, что очень замедляет тесты.

заранее спасибо!


import static org.openqa.selenium.support.ui.ExpectedConditions.*;

waitFor(invisibilityOfElementLocated(By.cssSelector("селектор элемента, который хотите дождаться чтобы стал невидимый")));



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



Ну тогда
waitFor(presenceOfElementLocated(By.cssSelector("элемент которого хотите дождаться ")));
и потом выполняйте другие действия
  • 0


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

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