2010-09-22 4 views
3

J'utilise Selenium 2 (dernière version de Googlecode) et je l'ai enflammé Chrome et aller à une url.Selenium 2 WebDriver - Chrome - Obtenir la valeur d'une zone de texte qui est définie par JavaScript

Lorsque la page a été chargée, du code javascript est exécuté pour définir la valeur d'une zone de texte. Je lui dis de trouver une zone de texte par id qu'il fait mais il n'a pas la valeur dedans (si je code en dur une valeur il le trouve).

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

J'ai essayé d'utiliser.

driver.FindElement (By.Id (« txtBoxId ») pour obtenir l'élément et cela 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

+0

Il semble que les résultats soient vérifiés trop rapidement. Ajout de Thread.Sleep (300); signifiait que les résultats ont été récupérés (bien que je crois que c'est une meilleure méthode de sélénium qui peut être appelée pour dire attendre des résultats). –

Répondre

2

sélénium 2 ne fait pas t avoir des fonctions d'attente intégrées aux é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

1

J'utilise WebDriver par Ruby (concombre watir -webdriver, en fait), et je tendance à le faire:

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 

Ensuite, chaque fois que j'ai contenu apparaissant en raison de javascript écrit ou autre chose, je conclurai juste dans un retry_loop l ike donc:

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 (en vérifiant que quelque chose n'est pas là) aura toujours besoin d'atteindre le timeout, évidemment. J'aime la façon dont les détails sont emballés dans la méthode et le code de test propre.

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

4

Enfin j'ai trouvé 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

Questions connexes