2017-04-13 95 views
0

泛型方法所以我創造了這個通用尋找元素功能:爲硒FindElement功能

public static IWebElement FindElement(IWebDriver driver, Func<IWebDriver, IWebElement> expectedCondtions, int timeoutInSeconds) 
    { 
     WebDriverWait webDriverWait = CreateWebDriverWait(driver, finder,timeoutInSeconds); 
     webDriverWait.IgnoreExceptionTypes(typeof(NoSuchElementException)); 
     return webDriverWait.Until(expectedCondtions); 
    } 

    public static ReadOnlyCollection<IWebElement> FindElements(IWebDriver driver, Func<IWebDriver, ReadOnlyCollection<IWebElement>> expectedCondtions, int timeoutInSeconds) 
    {   
     WebDriverWait webDriverWait = CreateWebDriverWait(driver, finder, timeoutInSeconds); 
     webDriverWait.IgnoreExceptionTypes(typeof(NoSuchElementException));    
     return webDriverWait.Until(expectedCondtions); 
    } 

    private static WebDriverWait CreateWebDriverWait(IWebDriver driver, IWebElement finder, int timeoutInSeconds) 
    { 
     WebDriverWait webDriverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)); 
     webDriverWait.IgnoreExceptionTypes(typeof(NoSuchElementException)); 
     return webDriverWait; 
    } 

用法:

 IWebElement element= 
      WaitAndFindElement(
      driver, 
      ExpectedConditions.ElementIsVisible(By.CssSelector("...")), 
      120); 

現在我萬特添加到找到element也沒有使用driver的選項。 例如,而不是driver.FindElement我想從另一個element搜索元素:

IWebElemen element = ... 
element.FindElement... 

所以我想從改變我的函數簽名:

IWebElement FindElement(IWebDriver driver,Func<IWebDriver, IWebElement> expectedCondtions, int timeoutInSeconds) 

要:

IWebElement FindElement(IWebDriver driver, IWebElement finder, Func<IWebDriver, IWebElement> expectedCondtions, int timeoutInSeconds) 

如果finder爲空我想用driver.FindElement進行搜索。 否則:finder.FindElement

所以我的問題是如何做到這一點?

+0

你需要驅動程序的第二個場景?聽起來像是這樣或那樣,這是正確的嗎? – Delta

+0

爲什麼要爲簡單的Selenium函數創建一個包裝?這完成了什麼?無論如何,你可以在一兩行中完成大部分工作。每次調用函數時,即使它使用相同的超時值,也會創建一個新的'WebDriverWait'實例。 – JeffC

回答

0
Class WebElementFinder 
{ 
    public static IWebElement FindElement(ISearchContext sc, By locator, Func<IWebElement, bool> elementCondition = null, int timeOutInceconds = 20) 
     { 
      DefaultWait<ISearchContext> wait = new DefaultWait<ISearchContext>(sc); 
      wait.Timeout = TimeSpan.FromSeconds(timeOutInceconds); 
      wait.PollingInterval = TimeSpan.FromSeconds(3); 
      wait.IgnoreExceptionTypes(typeof(NoSuchElementException)); 

      return wait.Until(x => GetElement(x, locator, elementCondition)); 
     } 

     private static IWebElement GetElement(ISearchContext sc, By locator, Func<IWebElement, bool> elementCondition = null) 
     { 
      IWebElement webElement = sc.FindElement(locator); 
      if(elementCondition != null) 
      { 
       if (elementCondition(webElement)) 
        return webElement; 
       else 
        return null; 
      } 
      else 
      { 
       return webElement; 
      } 
     } 
} 

用法:

Func<IWebElement, bool> isElementVisible = (webElement) => webElement.Displayed; 
      var element = FindElement(driver, By.Id("name_10"), isElementVisible); 
+0

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/SearchContext.html –

0

這是一件好事:我在工作中有類似的情況,這就是我在C#中做的:

IWebElement FindElement(IWebDriver driver, Func<IWebDriver, IWebElement> expectedCondtions, int timeoutInSeconds, IWebElement finder = null) 

這意味着,「發現者」的默認值是空的,你可以調用你的功能有沒有指定它。 (您可以將此參數與默認值一起添加到您的所有方法中)

然後,您可以在函數中簡單地做一個簡單的if語句以確定如何找到該元素。

if(finder != null) 
{ 
    //use finder instead of driver and return 
} 
//Otherwise use driver 
+0

是的,但我怎樣才能使用這個發現者,而不是我的功能內的驅動程序?我可以有代碼示例嗎? – user979033

+0

我問它,因爲我沒有看到任何提及driver.FindElement在我的函數 – user979033

0

我想你不需要使它變得複雜,如果你想使它通用。 這裏是一個能解決問題

Class WebElementFinder 
{ 
private static IWebElement FindElement(ISearchContext sc, By locator, int timeOutInceconds = 20) 
     { 
      DefaultWait<ISearchContext> wait = new DefaultWait<ISearchContext>(sc); 
      wait.Timeout = TimeSpan.FromSeconds(timeOutInceconds); 
      wait.IgnoreExceptionTypes(typeof(NoSuchElementException)); 
      return wait.Until(x => GetElement(x, locator)); 
     } 

     private static IWebElement GetElement(ISearchContext sc, By locator) 
     { 
      return sc.FindElement(locator); 
     } 
} 

讓我解釋一下這段代碼,這將幫助你瞭解你提到的代碼問題的某些部分的代碼。

  1. 如果您使用webdriver等待,那麼它從DefaultWait類驅動,它將IWebDriver轉換爲泛型類型。因此,直到方法將有使用驅動程序對象的限制。
  2. 如果您在方法中使用Func,則每個調用方法都需要爲find元素創建函數。但是,您可以將其用作可選參數。

現在回到我的代碼片段。 我已經使用DefaultWait可以用於WebDriver以及IWebElement。兩者都來自ISearchContext。 定位器將幫助查找網頁元素上的驅動器/ IWebElement對象爲您在您的文章問

+0

那麼使用expectedCondtions怎麼樣? – user979033

+0

,因爲我在每個web元素上尋找不同的expectedCondtions(可點擊,存在......) – user979033

+0

您可以使用一個多個參數編寫修改方法.. private static IWebElement FindElement(ISearchContext sc,By locator,Func elementCondition = null,int timeOutInceconds = 20)....你可以通過委託來確定你想要驗證的web元素。 –