C# Selenium无法捕获StaleElementReferenceException

C# Selenium无法捕获StaleElementReferenceException,c#,selenium,staleelementreferenceexception,C#,Selenium,Staleelementreferenceexception,我特别想问的是,我的try/catch块可能存在哪些问题,这些问题在链接到本文的“重复”问题中没有描述 我遇到一个问题,我试图捕获一个StaleElementReferenceException,然后再次查找该元素,但由于某种原因,无法捕获该异常。我有下面的方法,当我运行测试时,我得到一个StaleElementReferenceException当执行这行时,value=element.GetAttribute(attributeName)。我假设(可能很糟糕)在try/catch中添加检查并

我特别想问的是,我的
try/catch
块可能存在哪些问题,这些问题在链接到本文的“重复”问题中没有描述

我遇到一个问题,我试图捕获一个
StaleElementReferenceException
,然后再次查找该元素,但由于某种原因,无法捕获该异常。我有下面的方法,当我运行测试时,我得到一个
StaleElementReferenceException
当执行这行时,
value=element.GetAttribute(attributeName)。我假设(可能很糟糕)在
try/catch
中添加检查并专门查找异常将允许我继续尝试,直到selenium能够再次找到元素为止。问题是由于某种原因,异常没有被捕获,测试立即退出。奇怪的是,如果我将catch块更改为只捕获常规
异常
,它就可以正常工作。我担心的是,我可能陷入一个永远不会退出的循环。我使用一个页面对象模型来初始化元素

bool isStale = false;
string value = "";
do
{
    try
    {
        value = element.GetAttribute(attributeName);
        isStale = false;
    }
    catch (StaleElementReferenceException)
    {
        element = driver.FindElement(By.XPath(xPath));
        isStale = true;
    }

} while (isStale == true);
return value;
这是堆栈跟踪的一部分:

测试失败,错误为:System.Reflection.TargetInvocationException:调用的目标已引发异常。-->OpenQA.Selenium.StaleElement引用异常:stale元素引用:元素未附加到页面文档(会话信息:chrome=71.0.3578.98)(驱动程序信息:chromedriver=2.43.600210(68DCF5EEBDE337173D4027FA8635E332711D2874A),平台=Windows NT 10.0.17134 x8664)在OpenQA.Selenium.Remote.RemoteWebDriver.UnpachtRowner(Response errorResponse)在OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute,Dictionary
2参数)在OpenQA.Selenium.Remote.RemoteWebElement.Execute(String commandToExecute,Dictionary
2参数)在OpenQA.Selenium.Remote.RemoteWebElement.GetAttribute(String attributeName)


我不确定这些其他东西是如何与此重复的,除了他们讨论了stale元素异常这一事实。我理解stale元素是什么,我正在尝试再次查找该元素,正如其他帖子中所述。我在这个问题中描述的问题是,我的代码没有像我想象的那样工作,这意味着由于某些原因,我的异常没有被捕获,因此我可以尝试再次查找该元素。关于我的代码没有捕获过时的元素异常的原因,您有什么建议吗?谢谢。@DebanjanB您重复的问题中没有一个是相关的。一个是python,这是C#。另一个是与PageFactory相关的,这没有任何补充对PageFactory进行初始化。撤消dup。我不确定您的代码为什么不起作用。一种猜测是,在
catch
语句中引发了异常。处理过时元素的更好方法是处理导致页面/元素刷新的原因。等待页面/元素刷新完成,然后提取属性。一种方法是n重写/简化此代码是这样做的:
do{try{return driver.FindElement(By.XPath(XPath)).GetAttribute(attributeName);}catch(StaleElementReferenceException){Thread.Sleep(500)}}while(true);
基本上,当您获取值时返回,而不是跟踪
isStale
,只需重新提取元素,而不是第一次测试它。
Thread.Sleep()
只是尝试之间的短暂停顿。一旦未引发异常,它将通过
return退出
do
循环