Selenium 2 WebDriver - Chrome - получение значения из текстового поля, заданного с помощью JavaScript - PullRequest
3 голосов
/ 22 сентября 2010

Я использую Selenium 2 (последний выпуск от Googlecode), и я запускаю Chrome и перехожу на URL.

Когда страница загружена, выполняется некоторый javascript для установки значения текстового поля.

Я говорю ему найти текстовое поле по идентификатору, который он делает, но у него нет значения внутри него (если я жестко кодирую значение, оно его находит).

Глядя на PageSource, например. ЕЫпе (driver.PageSource); показывает HTML и текстовое поле пусто.

Я пытался использовать:

driver.FindElement (By.Id ("txtBoxId") для получения элемента, который тоже не получает значение.

Я также пробовал ChromeWebElement cwe = новый ChromeWebElement (драйвер, "txtBoxId"); (который жалуется на устаревшие данные).

Есть мысли?

John

Ответы [ 3 ]

4 голосов
/ 04 мая 2011

Наконец я нашел ответ! Это код, который работает для меня

WebDriverWait wait = new WebDriverWait(_driver, new TimeSpan(0,0,60));
wait.Until(driver1 => _driver.FindElement(By.Id("ctl00_Content_txtAdminFind")));
Assert.AreEqual("Home - My Housing Account", _driver.Title);

Вот мой источник! http://code.google.com/p/selenium/issues/detail?id=1142

2 голосов
/ 24 сентября 2010

Selenium 2 не имеет встроенных функций ожидания для элементов в DOM.Это было то же самое, что и в Selenium 1.

Если вам нужно что-то ждать, вы можете сделать это как

  public string TextInABox(By by)
  {
    string valueInBox = string.Empty;
    for (int second = 0;; second++) {
      if (second >= 60) Assert.Fail("timeout");
      try
      {
        valueInBox = driver.FindElement(by).value;
        if (string.IsNullOrEmpty(valueInBox) break;
      }
      catch (WebDriverException)
      {}
      Thread.Sleep(1000);
    }
    return valueInBox;
  }

или что-то в этом роде

1 голос
/ 15 октября 2010

Я использую webdriver через ruby ​​(фактически, cucumber watir-webdriver), и я склонен делать это:

  def retry_loop(interval = 0.2, times_to_try = 4, &block)
    begin
      return yield
    rescue
      sleep(interval)
      if (times_to_try -= 1) > 0
        retry
      end
    end
    yield
  end

Тогда всякий раз, когда у меня появляется контент из-за записи javascript или чего-то еще, я просто оборачиваю его в retry_loop следующим образом:

    retry_loop do #account for that javascript might fill out values
      assert_contain text, element
    end

Как вы заметите, нет снижения производительности, если оно уже есть. Очевидно, обратный случай (проверка того, что чего-то там нет) всегда должен достигать времени ожидания. Мне нравится, как детали хранятся в методе и тестовом коде в чистоте.

Возможно, вы могли бы использовать нечто подобное в C ++?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...