Sélénium 2 WebDriver - Chrome - Obtenir la valeur à partir d'une zone de texte qui est réglé via JavaScript

StackOverflow https://stackoverflow.com/questions/3767217

  •  04-10-2019
  •  | 
  •  

Question

J'utilise Sélénium 2 (dernière version de googlecode) et je l'ai mise à feu en Chrome et aller à une URL.

Lorsque la page a chargé certains javascript exécute pour définir la valeur d'une zone de texte.

Je le dis de trouver une zone de texte par identifiant ce qu'il fait, mais il n'a pas la valeur au sein (si je hardcode une valeur qu'il trouve).

En regardant le texte source, par exemple Console.WriteLine (driver.PageSource); montre le code html et la zone de texte est vide.

J'ai essayé d'utiliser:

driver.FindElement (By.Id ( "txtBoxId") pour obtenir l'élément et qui ne va pas chercher trop la valeur.

J'ai aussi essayé ChromeWebElement CWE = new ChromeWebElement (pilote, "txtBoxId"); (Qui se plaint de données Stale).

Toutes les pensées?

John

Était-ce utile?

La solution

Selenium 2 n'a pas de fonctions d'attente intégré pour les éléments du DOM. Ce fut la même chose que dans Sélénium 1.

Si vous devez attendre quelque chose que vous pourriez faire comme

  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;
  }

Ou quelque chose le long de ces lignes

Autres conseils

Enfin, je trouve la réponse! Ceci est le code qui fonctionne pour moi

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);

Voici ma source! http://code.google.com/p/selenium/issues/detail ? id = 1142

J'utilise WebDriver par Ruby (concombre watir-WebDriver, en fait), et je tends à faire ceci:

  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

Alors chaque fois que j'ai contenu apparaissant en raison de javascript ou écrit que ce soit, j'envelopper juste dans un retry_loop comme ceci:

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

Comme vous le remarquerez qu'il n'y a pas de pénalité de performance si elle est déjà là. Le cas inverse (vérifier que quelque chose n'est pas là) aura toujours besoin d'atteindre le délai d'attente, évidemment. Je aime la façon qui maintient les détails rangea dans la méthode et le code de test propre.

Peut-être que vous pouvez utiliser quelque chose de similaire en C ++?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top