我想我在这里真的错过了什么,但无法弄清楚是什么。我希望这个方法返回一个web元素,但如果有这个特定的错误,我希望它再试一次:
int findCounter = 0;
public IWebElement Find([Optional] string[] Element, [Optional] string Text)
{
IWebElement element;
element = null;
if (findCounter < 30){
if (Text != null)
{
Wait(null, Text);
element = driver.FindElement(By.LinkText(Text));
findCounter = 0;
return element;
}
else
{
try
{
if (Element[1] == "xpath")
{
Wait(Element, null);
element = driver.FindElement(By.XPath(Element[0]));
findCounter = 0;
}
else if (Element[1] == "id")
{
Wait(Element, null);
element = driver.FindElement(By.Id(Element[0]));
findCounter = 0;
}
else if (Element[1] == "linktext")
{
Wait(Element, null);
element = driver.FindElement(By.LinkText(Element[0]));
findCounter = 0;
}
}
catch (StaleElementReferenceException e)
{
Console.Out.WriteLine("Attempting to recover from StaleElementReferenceException ...");
Sleep(250);
findCounter++;
Find(Element, Text);
}
return element;
}
} return null;
}
所以我试试看:
Find(Element, null)
它会出错,输出消息,然后失败:
尝试从StaleElementReferenceException中恢复...
NullReferenceException'对象引用未设置为对象的实例。'
但我第一次使用相同的参数。可能有什么不对?
答案 0 :(得分:2)
在你的捕获中你还想要元素吗?
如果是,那么您将要返回return Find(Element, Text);
答案 1 :(得分:0)
也许你必须检查变量的值&#34; [可选] string []元素&#34;你传递给函数。因为在错误输出中,声明try块中的变量为null且无法处理,因为在catch块中错误类型是&#34; StaleElementReferenceException&#34;。
我的建议是再应用一个处理Null错误的catch块并在那里放置一个断点。检查哪些值为空,哪些值不为,那么您将意识到缺少的值。
示例代码:
try
{
if (Element[1] == "xpath")
{
Wait(Element, null);
element = driver.FindElement(By.XPath(Element[0]));
findCounter = 0;
}
else if (Element[1] == "id")
{
Wait(Element, null);
element = driver.FindElement(By.Id(Element[0]));
findCounter = 0;
}
else if (Element[1] == "linktext")
{
Wait(Element, null);
element = driver.FindElement(By.LinkText(Element[0]));
findCounter = 0;
}
}
catch (StaleElementReferenceException e)
{
Console.Out.WriteLine("Attempting to recover from StaleElementReferenceException ...");
Sleep(250);
findCounter++;
Find(Element, Text);
}
catch (NullReferenceException e)
{
//break point here.
}