2016-12-21 10 views
1

Je construis un cadre de test pour mon site Web Je veux séparer complètement le cadre du test Le problème est que lorsque j'écris un test, parfois l'Assert a besoin de temps jusqu'à ce que cela puisse être vrai, par exemple si je suis sur Télécharger la page du fichier et quand le fichier est téléchargé le site Web devrait afficher la page Téléchargé avec succès le fichier mais il faudra beaucoup de temps jusqu'à ce que le navigateur atteigne cette pageSelenium Waits Logic

Comment est-ce que je devrais forcer le Assert à attendre quelque temps avant qu'il renvoie le résultat?

un code qui pourrait expliquer ma façon de travail actuel:

Télécharger la page Classe

Public class UploadPage 
{ 
[FindsBy(How = How.Name, Using = "upload-button")] 
public IWebElement BtnUpload { get; set; } 

    public UploadPage() 
    { 
    PageFactory.InitElements(Driver, this); 
    } 

public void UploadFile(string path) 
    { 
    //select file 
    BtnUpload.Click(); 
    } 
} 

Télécharger réussie Page:

Public class UploadSuccessfulPage 
    { 
    [FindsBy(How = How.Name, Using = "success-message")] 
    public IWebElement LblSuccessMessage{ get; set; } 

    public UploadSuccessfulPage() 
    { 
     PageFactory.InitElements(Driver, this); 
    } 
    public bool IsAt() 
    { 
     Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(60)) 
     return Driver.url==configurations.UploadSuccessfulPageURL; 
    } 
    } 

Méthode d'essai:

public void TestUpload() 
{ 
UploadPage uploadPage= new UploadPage(); 
uploadPage.UploadFile(path); 
UploadSuccessfulPage successPage= new UploadSuccessfulPage(); 
Assert.IsTrue(successPage.IsAt()); 
} 

wh fr J'écris mes tests de cette façon les assert n'attendent pas malgré le fait que IsAt() contient une attente implicite

P.S: Je n'ai pas l'intention d'utiliser Thread.Sleep();

Répondre

2

La méthode bool IsAt() devrait être mis en œuvre comme:

public bool IsAt() 
{ 
    Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(60)); 
    try { 
    return driver.FindElement(By.Name("success-message").Displayed; 
    } catch (WebDriverException e) { 
    return false; 
    } 
} 

ou en utilisant explicite attente:

public bool IsAt() 
{ 
    try { 
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60)); 
    wait.Until(ExpectedConditions.ElementIsVisible(By.Name("success-message"))); 
    return true; 
    } catch (TimeoutException e){ 
    return false; 
    } 
} 

Mise à jour: Si vous voulez vérifier par URL, le bool IsAt() devrait ressembler à:

public bool IsAt() 
    { 
     try { 
     WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60)); 
     wait.Until(ExpectedConditions.UrlToBe(configurations.UploadSuccessfulPageURL)); 
     return true; 
     } catch (TimeoutException e){ 
     return false; 
     } 
    } 

Regardez la classe ExpectedConditions pour trouver une condition appropriée à votre besoin

+0

merci je vais l'essayer et de revenir à vous, pouvez-vous s'il vous plaît éclairez un peu sur la façon dont cela va résoudre le problème? –

+2

Tout d'abord, à partir du code fourni pour 'bool IsAt()', je ne vois aucune logique sur ce que vous attendez de lui. La définition de ImplicitWait affectera uniquement les commandes suivantes que vous appelez (comme 'driver.FindElement'). Les deux exemples que j'ai montrés ci-dessus indiquent clairement quelle méthode 'IsAt()' devrait faire - c'est de vérifier si le message de succès est affiché ou non. Je préférerais la seconde plus cependant. –

+0

mais j'ai écrit dans ma méthode IsAt que sous l'implicitwait il y a une condition que l'étiquette puisse être trouvée –