如何在Selenium中编写自定义FindElement例程?

时间:2011-11-04 18:01:28

标签: selenium

我正在试图弄清楚如何在Selenium 2.0 WebDriver中编写自定义的FindElement例程。这个想法是这样的:

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

匿名方法将检查ISearchContext,如果匹配则返回True;否则就错了。

我正在挖掘Selenium代码,并且有点迷失。看起来实际的By。*逻辑是在服务器端执行的,而不是客户端。这似乎使事情变得复杂。

有什么建议吗?

2 个答案:

答案 0 :(得分: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;
}

这是我的try catch方法,你可以根据需要添加任意数量的不同类型id,cssselector,xpath,tagname,classname等。

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;
}

答案 1 :(得分: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);