2013-10-24 5 views
1

Я запускаю тест с использованием Selenium WebDriver, и если у пользователя нет прав доступа, div не существует на странице. Я пытаюсь сделать так, чтобы, если элемент отображается, он возвращает true, но если он попадает в таймаут, он возвращает false.WebDriverПомогите подождать, пока элемент не существует или не существует?

public bool SummaryDisplayed() 
    { 
     var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(5)); 
     var myElement = wait.Until(x => x.FindElement(By.Id("summaryPage"))); 
     return myElement.Displayed; 
    } 

Я не хочу использовать Thread.Sleep, потому что если элемент есть через 2 секунды я хочу, чтобы продолжить. Но если элемент не существует через 5 секунд, он должен возвращать значение false. Я не хочу, чтобы он выдавал исключение, в некоторых тестовых случаях я ожидаю, что он не будет существовать. Есть ли способ подавить исключение и вернуть false после таймаута? Thanks

+0

Звучит так, как будто это должны быть два разных свойства/методы. Это прямо против того, что означает 'WebDriverWait', поэтому вы всегда можете вернуться к простому старому циклу while. Можете ли вы дать пример использования, когда он будет присутствовать, а когда этого не будет? – Arran

ответ

4

Это будет работать на вас, я думаю.

public bool SummaryDisplayed() 
{ 
    try 
    { 
     var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(5)); 
     var myElement = wait.Until(x => x.FindElement(By.Id("summaryPage"))); 
     return myElement.Displayed; 
    } 
    catch 
    { 
     return false; 
    } 
} 
+0

Это просто, мне это нравится. Я закончил создание метода расширения, который использует это, чтобы увидеть, существует ли этот элемент или нет. Если это возвращает true, я проверяю, отображается ли оно. – chill182

-1

Попробуйте использовать события автосекретаря в system.Threading.

public static AutoResetEvent messsageEvent= new AutoResetEvent(false); 
Public bool summaryDisplay() 
{ 
var value=SomemethodCall() 
messsageEvent.Reset()//This blocks the Thread 
if(value.Exists) 
{ 
messageEvent.Set();//This releases the Thread 
} 
} 

Это еще один метод messageEvent.WaitOne (миллисекунда, значение Bool);

Я думаю, что это Виль помочь вам

+0

Это похоже на решение о переполнении. Это как покупка девушки Bentley на первом свидании. Это будет работать? Я думаю да. Стоит ли оно того? Очевидно нет. –

4

Вы можете использовать общий метод расширения ждать элемента, чтобы быть видимым в течение определенного ожидания; а затем просто вызвать его из ваших методов, как показано ниже:

public bool SummaryDisplayed() 
{ 
    var summaryElement = driver.WaitGetElement(By.Id("summaryPage"), 5, true); 
    return (summaryElement !=null); 
} 

Метод расширения просто оборачивает WebDriverWait и ждет элемент существовать/отображаться, в зависимости от того, что вы просили. Если элемент не найден в течение указанного ожидания, он возвращает null. Я использую это расширение вместо FindElement() в своих фреймворках.

public static IWebElement WaitGetElement(this IWebDriver driver, By by, int timeoutInSeconds, bool checkIsVisible=false) 
{ 
IWebElement element; 
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)); 

try 
{ 
    if (checkIsVisible) 
    { 
     element = wait.Until(ExpectedConditions.ElementIsVisible(by)); 
    } 
    else 
    { 
     element = wait.Until(ExpectedConditions.ElementExists(by)); 
    } 
} 
catch (NoSuchElementException) { element = null; } 
catch (WebDriverTimeoutException) { element = null; } 
catch (TimeoutException) { element = null; } 

return element; 
} 
Смежные вопросы