2015-05-04 5 views
0

Как создать метод, который принимает общие параметры?Параметр общего типа для метода

Хорошо, вот точно, что я работаю над:

В 2 метода ниже отличаются только By.Id или By.LinkText

private IWebElement FindElementById(string id) 
    { 
     WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(40)); 
     IWebElement we = null; 

     wait.Until<bool>(x => 
     { 
      we = x.FindElement(By.Id(id)); 
      bool isFound = false; 

      try 
      { 
       if (we != null) 
        isFound = true; 
      } 
      catch (StaleElementReferenceException) 
      { 
       we = x.FindElement(By.Id(id)); 
      } 

      return isFound; 
     }); 

     return we; 
    } 

    private IWebElement FindElementByLinkText(string id) 
    { 
     WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(40)); 
     IWebElement we = null; 

     wait.Until<bool>(x => 
     { 
      we = x.FindElement(By.LinkText(id)); 
      bool isFound = false; 

      try 
      { 
       if (we != null) 
        isFound = true; 
      } 
      catch (StaleElementReferenceException) 
      { 
       we = x.FindElement(By.LinkText(id)); 
      } 

      return isFound; 
     }); 

     return we; 
    } 
+0

Можете ли вы уточнить ваш вопрос больше? Мне трудно понять, что вы пытаетесь сделать. – xxbbcc

+1

Общие сведения позволяют указать * тип * возвращаемых данных или передать метод во время выполнения. Это не похоже на то, что здесь, все, что вам нужно, это метод, который принимает «перечисление» и строку ... –

+2

Возможно, вы можете взглянуть на [Выражения] (https://msdn.microsoft.com /en-us/library/bb397951.aspx) - 'Выражение >'? –

ответ

6

Поскольку Selenium By функции статические функции-члены, соответствующие типу подпись Func<string, By>, вы можете легко изменить свой код следующим образом:

private IWebElement FindElementById(string id) 
{ 
    return FindElementBy(By.Id, id); 
} 

private IWebElement FindElementByLinkText(string linkText) 
{ 
    return FindElementBy(By.LinkText, linkText); 
} 

private IWebElement FindElementBy(Func<string, By> finder, string argument) 
{ 
    WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(40)); 
    IWebElement we = null; 

    wait.Until<bool>(x => 
    { 
     we = x.FindElement(finder(argument)); 
     bool isFound = false; 

     try 
     { 
      if (we != null) 
       isFound = true; 
     } 
     catch (StaleElementReferenceException) 
     { 
      we = x.FindElement(finder(argument)); 
     } 

     return isFound; 
    }); 

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