2011-11-04 54 views
1

我想弄清楚如何在Selenium 2.0 WebDriver中編寫自定義FindElement例程。這個想法是這樣的:如何在Selenium中編寫自定義FindElement例程?

driver.FindElement(By.Method((ISearchContext) => { 
    /* examine search context logic here... */ })); 

匿名方法將檢查ISearchContext並返回True,如果它匹配;否則爲假。

我正在挖掘Selenium代碼,並且有點迷路。它看起來像實際的By。*邏輯是在服務器端進行的,而不是客戶端。這似乎是複雜的事情。

有什麼建議嗎?

+0

請[不要將簽名或標語添加到您的帖子](http://stackoverflow.com/faq#signatures)。 – meagar

回答

0

好吧,我想通了,如何做到這一點。我利用driver.ExecuteScript()在webdriver上運行自定義js。它看起來有點像這樣:

function elementFound(elem) { 
    var nodeType = navigator.appName == ""Microsoft Internet 
Explorer"" ? document.ELEMENT_NODE : Node.ELEMENT_NODE; 
    if(elem.nodeType == nodeType) 
    { 
     /* Element identification logic here */ 
    } 
    else { return false; } 
} 

function traverseElement(elem) { 
    if (elementFound(elem) == true) { 
     return elem; 
    } 
    else { 
     for (var i = 0; i < elem.childNodes.length; i++) { 
      var ret = traverseElement(elem.childNodes[i]); 
      if(ret != null) { return ret; } 
     } 
    } 
} 

return traverseElement(document); 
0

我做了一個多級搜索。我有一個方法執行try catch然後獲取元素的方法。從理論上講,你可以嘗試一下,直到取代這種方式,但是由於我的設置,我更喜歡這種方式。

public bool CheckUntil(IWebDriver driver, string selectorType, string selectorInfo) 
{ 
    int Timer = 160; 
    bool itemFound = false; 

    for (int i = 0; i < Timer; i++) 
    if(itemFound) 
    { 
    i = 0 
    } 
    else 
    { 
    Thread.Sleep(500); 
    if(selectorType.ToLower() == "id" && TryCatch(driver, selectorType, selectorInfo)) 
    { 
    if(driver.FindElement(By.Id(selectorInfo).Displayed) 
    { 
     itemFound = true; 
    } 
    } 
    else if(selectorType.ToLower() == "tagname" && TryCatch(driver, selectorType, selectorInfo)) 
    { 
    if(driver.FindElement(By.TagName(selectorInfo).Displayed) 
    { 
     itemFound = true; 
    } 
    } 
    } 

    return itemFound; 
} 

這裏是我的嘗試捕捉方法,你要ID,cssselector,XPath的,標記名,類名,你可以添加儘可能多的不同類型,等等

public bool TryCatch(IWebDriver driver, string selectorType, string selectorInfo) 
{ 
    bool ElementFound = false; 

    try 
    { 
    switch(selectorType) 
    { 
    case "id": 
    driver.FindElement(By.Id(selectorInfo); 
    break; 
    case "tagname": 
    driver.FindElement(By.TagName(selectorInfo); 
    break; 
    } 
    ElementFound = truel 
    } 
    catch 
    { 
    ElementFound = false; 
    } 
return ElementFound; 
}