2014-01-24 5 views
10

Я пытаюсь написать свои собственные ExpectedConditions для Selenium, но я не знаю, как добавить новый. У кого-нибудь есть пример? Я не могу найти учебники для этого онлайн.Как добавить пользовательские ожидаемые условия для селена?

В моем текущем случае я хочу подождать, пока элемент не будет, он виден, включен И не имеет attr "aria-disabled". Я знаю, что этот код не работает:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(seconds)); 
return wait.Until<IWebElement>((d) => 
    { 
     return ExpectedConditions.ElementExists(locator) 
     && ExpectedConditions.ElementIsVisible 
     && d.FindElement(locator).Enabled 
     && !d.FindElement(locator).GetAttribute("aria-disabled") 
    } 

EDIT: Немного дополнительная информация: проблема я бег в с закладками JQuery. У меня есть форма на вкладке disabled, и она начнет заполнять поля на этой вкладке до того, как вкладка станет активной.

ответ

27

«ожидаемое состояние» не более, чем анонимный метод с использованием выражения лямбда. Они стали основным продуктом разработки .NET с .NET 3.0, особенно с выпуском LINQ. Поскольку подавляющее большинство разработчиков .NET удобны с синтаксисом C# лямбда, реализация WebDriver .NET bindings ExpectedConditions имеет несколько методов.

Создание ждать, как вы просите будет выглядеть примерно так:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
wait.Until<IWebElement>((d) => 
{ 
    IWebElement element = d.FindElement(By.Id("myid")); 
    if (element.Displayed && 
     element.Enabled && 
     element.GetAttribute("aria-disabled") == null) 
    { 
     return element; 
    } 

    return null; 
}); 

Если вы не сталкивались с этой конструкцией, я рекомендовал бы стать таким. Он скорее всего будет более распространен в будущих версиях .NET.

+0

Не должно быть ? – chill182

+0

Конечно. Отредактировано для исправления. Спасибо, что указали это. – JimEvans

+1

Поскольку этот ответ был связан пару раз в IRC, я также укажу, что он должен использовать d.FindElement, поскольку это переменная лямбда для драйвера –

2

Я понимаю теорию за ExpectedConditions (я думаю), но я часто нахожу их громоздкими и трудными в использовании на практике.

Я бы с таким родом подход:

public void WaitForElementPresentAndEnabled(By locator, int secondsToWait = 30) 
{ 
    new WebDriverWait(driver, new TimeSpan(0, 0, secondsToWait)) 
     .Until(d => d.FindElement(locator).Enabled 
      && d.FindElement(locator).Displayed 
      && d.FindElement(locator).GetAttribute("aria-disabled") == null 
    ); 
} 

Я буду рад узнать из ответа, который использует все ExpectedConditions здесь :)

+0

так этим путем, мы можем назвать этот метод везде, где это необходимо? Потому что в другом подходе мы должны ставить это как выражение во всех местах, где нам нужно. Исправьте меня, если я ошибаюсь. – user1925406

+0

Это правильно @ user1925406 –

0

Я преобразовал пример WebDriverWait и ExpectedCondition/s с Java на C#.

Java Версия:

WebElement table = (new WebDriverWait(driver, 20)) 
.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("table#tabletable"))); 

C# версии:

IWebElement table = new WebDriverWait(driver, TimeSpan.FromMilliseconds(20000)) 
.Until(ExpectedConditions.ElementExists(By.CssSelector("table#tabletable"))); 
Смежные вопросы