2017-02-04 6 views
2

я получил свой код, чтобы ждать, пока управление не найденоКак работать с WebElement, который изменяется во время выполнения?

WebDriverWait wait = new WebDriverWait(Browser, TimeSpan.FromSeconds(20)); 
var ok = wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("(//button[@id='btnOkDialog'])[" + buttonOccuranceNo + "]"))); 

Я использую это, когда некоторый контроль происходит в йоте после любого события.

Теперь, если я уменьшу область поиска на странице [Как взять div внутри WebDriver, который является WebElement], то как мне искать какой-либо элемент управления в пределах этой области действия до тех пор, пока не будет найден ее или тайм-аут?

ответ

1

Вам нужно настроить различные ожидания, используя DefaultWait класс:

var waitInnerScope = new DefaultWait<IWebElement>(divInsideWebDriver); 
waitInnerScope.Timeout = TimeSpan.FromSeconds(timeout); 
waitInnerScope.IgnoreExceptionTypes(typeof(NoSuchElementException)); 

Затем использовать с wait.Until:

var ok = waitInnerScope.Until(PresenceOfAllElementsLocatedBy(By.XPath("(//button[@id='btnOkDialog'])[" + buttonOccuranceNo + "]"))); 

EDIT: Поскольку ExpectedConditions состоит из статических методов, реализующих Func<IWebDriver, ...> для использование с WebDriverWait, вам придется использовать свой собственный метод, который принимает IWebElement:

public static Func<IWebElement, ReadOnlyCollection<IWebElement>> PresenceOfAllElementsLocatedBy(By locator) 
{ 
    return (element) => 
    { 
     try 
     { 
      var elements = element.FindElements(locator); 
      return elements.Any() ? elements : null; 
     } 
     catch (StaleElementReferenceException) 
     { 
      return null; 
     } 
    }; 
} 

Или вы можете использовать лямбда-выражения для анонимного метода следующим образом:

waitInnerScope.Until<ReadOnlyCollection<IWebElement>>((element) => 
{ 
    try 
    { 
     var elements = element.FindElements(By.XPath("(//button[@id='btnOkDialog'])[" + buttonOccuranceNo + "]")); 
     return elements.Any() ? elements : null; 
    } 
    catch (StaleElementReferenceException) 
    { 
     return null; 
    } 
}); 
+0

ExpectedConditions содержат весь метод с Func или BOOL> Возврат Тая функции. Таким образом, его порождающая ошибка. Есть ли класс, у которого есть метод return Func или bool>? – rana

+0

Извините, не могу понять, что вы просили, попробуйте уточнить – Moshisho

+0

Я пробую ваше предложение и получил ошибку в классе ExpectedConditions. Когда я перехожу внутрь этого класса, я обнаружил, что все методы объявляют в этом классе Func ) или Func rana

Смежные вопросы