2016-12-21 10 views
1

Я строю рамки тестирования для своего сайта Я хочу полностью отделить структуру от теста Проблема заключается в том, что когда я пишу тест, иногда для утверждения требуется время, пока оно не может быть истинным, например, если я на странице загрузки файла и при загрузке файла на веб-сайте должен отображаться файл, загруженный с успешной страницей, но для этого потребуется много времени, пока браузер не достигнет этой страницы.Selenium Waits Logic

Как заставить Assert ждать когда-нибудь, прежде чем он вернет результат?

некоторый код, который мог бы объяснить мой текущий способ работы:

Загрузить Страница Класс

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

Преуспевающий Загрузить Страница:

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

Метод испытания:

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

белый ru Я пишу свои тесты таким образом, что утверждение не ждет, несмотря на то, что IsAt() содержит неявный wait

P.S: Я не собираюсь использовать Thread.Sleep();

ответ

2

Метод bool IsAt() должен быть реализован как:

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

Или с помощью явного ожидания:

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

Update: Если вы хотите проверить на URL, то bool IsAt() должен выглядеть следующим образом:

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

Посмотрите на класс ExpectedConditions, чтобы найти подходящее для вас состояние

+0

спасибо Я попробую его и вернусь к вам, не могли бы вы немного осветить, как это решит проблему? –

+2

Во-первых, из вашего предоставленного кода для 'bool IsAt()', я не вижу никакой логики о том, что вы ожидаете от этого. Установка ImplicitWait будет влиять только на любую следующую команду, которую вы вызываете (например, 'driver.FindElement'). В двух примерах, которые я показал выше, четко говорится о том, какой метод 'IsAt()' должен делать, - проверить, отображается ли сообщение об успешном завершении. Я бы предпочел еще второй. –

+0

, но я написал в моем методе IsAt, что под имплицитной точкой есть условие, что метка может быть найдена –