Sélénium 2 WebDriver - Chrome - Obtenir la valeur à partir d'une zone de texte qui est réglé via JavaScript
-
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
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 ++?