我正在试图弄清楚如何在Selenium 2.0 WebDriver中编写自定义的FindElement例程。这个想法是这样的:
driver.FindElement(By.Method( (ISearchContext) => {
/* examine search context logic here... */ }));
匿名方法将检查ISearchContext,如果匹配则返回True;否则就错了。
我正在挖掘Selenium代码,并且有点迷失。看起来实际的By。*逻辑是在服务器端执行的,而不是客户端。这似乎使事情变得复杂。
有什么建议吗?
答案 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);