Je suis nouveau sur le webdriver Selenium et je teste une application. Dans ma candidature, je dois tester la possibilité de lier un compte Facebook. Chaque fois que je clique sur le lien, la fenêtre contextuelle s’affiche où je dois saisir les informations d’identité. Je suis capable de lier parfois et parfois le test échoue. Je connais la raison parce que le chargement de la fenêtre contextuelle prend du temps et que la commande suivante est exécutée afin de ne pas pouvoir trouver l'élément. J'ai utilisé Thread.Sleep mais je souhaite utiliser l'attente implicite ou l'attente explicite, ce qui est toujours une bonne pratique plutôt que Thread.Sleep. Comment utiliser l'attente implicite et où utiliser cette commande exactement? S'il vous plaît des conseils. Merci.
public void SocialFaceBook()
{
string currentWindow = driver.CurrentWindowHandle;
PopupWindowFinder Finder = new PopupWindowFinder(driver);
string facebookWindow = Finder.Click(driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[3]/a")));
// Switch To FaceBook Window
driver.SwitchTo().Window(facebookWindow);
System.Threading.Thread.Sleep(3000);
// Link
// Email Address
IWebElement faceBookLinkEmail = driver.FindElement(By.Id("email"));
faceBookLinkEmail.SendKeys(SocialFaceBookEmail);
// Password
IWebElement faceBookLinkPass = driver.FindElement(By.Id("pass"));
faceBookLinkPass.SendKeys(SocialFaceBookPass);
// Log In Button
IWebElement faceBookLinkLogin = driver.FindElement(By.XPath("//input[@id='u_0_1']"));
faceBookLinkLogin.Click();
// Switch To Main Window
driver.SwitchTo().Window(currentWindow);
System.Threading.Thread.Sleep(3000);
// Sync
IWebElement faceBookSync = driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[2]/a"));
faceBookSync.Click();
// Unlink
IWebElement faceBookUnLink = driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[1]/a"));
faceBookUnLink.Click();
}
Parfois, il est impossible de trouver le journal dans les détails car la fenêtre contextuelle n'est pas chargée correctement et parfois, il est impossible de trouver le bouton de synchronisation, car la connexion d'un compte Facebook prend du temps. S'il vous plaît des conseils.
WebDriverWait wait = new WebDriverWait (pilote, 30); Wait.until (ExpectedConditions.visibilityOfElementLocated (By.id ("locator")));
Il attendra que l’élément soit localisé pendant au maximum 30 secondes si l’élément est trouvé avant de s’exécuter ....
J'ai dû changer quelques petites choses de la réponse de @ Vicky, mais c'est ce que j'ai comme méthode pour appeler.
public static void WaitForElementLoad(By by, int timeoutInSeconds)
{
if (timeoutInSeconds > 0)
{
WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(timeoutInSeconds));
wait.Until(ExpectedConditions.ElementIsVisible(by));
}
}
et je l'appelle comme ça:
MyClass.WaitForElementLoad(By.CssSelector("div#div1 div strong a"), 10);
J'avais l'habitude d'écrire une fonction pour détecter un élément existe chaque seconde. si trouver continue, sinon erreur de timeout jeté. mais dans cette fonction, j'utilise toujours Thread.Sleep.
Attendez-vous à une autre bonne solution.
J'utilise ExpectedCondition.visibilityOf (élément) au lieu de thread dort
A écrit une méthode pour un projet:
public static void WaitForElementPresentBy(By by)
{
try
{
Wait.Until(ExpectedConditions.ElementIsVisible(by));
}
catch (TimeoutException te)
{
Assert.Fail("The element with selector {0} didn't appear. The exception was:\n {1}", by, te.ToString());
}
}
Wait devrait déjà avoir été défini.
Attente implicite - temps d'attente maximal pour identifier l'objet, il l'identifiera toutes les 500 ms. s'il ne parvient pas à identifier l'objet dans le délai maximal, il lève une exception nosuchelement.
Attente explicite - utilisée pour les chargements de page ajax dans le même but.
le temps d'attente maximum est identique à thread.sleep