C# 用C3中的硒测试获得陈旧元素

C# 用C3中的硒测试获得陈旧元素,c#,selenium,C#,Selenium,我正在进行Selenium测试,我拥有所有包含具有特定名称的id的div(在本例中为“center-”) 当我尝试foreach或for在其中循环以获取可单击事件时: var hitit = item.FindElement(By.TagName("a")); hitit.Click(); 我有一个陈旧的元素。我怎样才能避免陈旧的元素错误呢? 下面是代码的完整示例 var x = driver.FindElements(By.XPath("//div[contains(@id, 'cen

我正在进行Selenium测试,我拥有所有包含具有特定名称的id的div(在本例中为“center-”)

当我尝试foreach或for在其中循环以获取可单击事件时:

var hitit = item.FindElement(By.TagName("a"));
hitit.Click();
我有一个陈旧的元素。我怎样才能避免陈旧的元素错误呢? 下面是代码的完整示例

   var x = driver.FindElements(By.XPath("//div[contains(@id, 'center-')]"));
   foreach (var item in x)
        {                 
            var hitit = item.FindElement(By.TagName("a"));
            hitit.Click();
            driver.Navigate().Back();                
        }

它可以很好地运行第一个循环,但当它返回并尝试再次运行时,则是错误发生的时候。

您的问题是,您可以单击带有以下行的链接:

hitit.Click();
单击链接并将浏览器重定向到新页面,然后返回到旧页面:

 driver.Navigate().Back(); 
并尝试单击循环中的下一个链接。问题是元素列表与页面上现在显示的元素不同,这就是它过时的原因。换句话说,元素具有相同的类名,但不是相同的元素

每次返回原始页面时,都需要调用FindElements。 像这样的方法应该会奏效:

var x = driver.FindElements(By.XPath("//div[contains(@id, 'center-')]"));
var elementCount = x.Count();
var loopCounter = 0;
while (loppCounter < elementCount)
{           
        var allCenterDivs = driver.FindElements(By.XPath("//div[contains(@id, 'center-')]"));      
        var hitit = allCenterDivs[loopCounter].FindElement(By.TagName("a"));
        hitit.Click();
        driver.Navigate().Back();          
        loopCounter++;      
}
var x=driver.FindElements(By.XPath(“//div[contains(@id,'center-'))]”);
var elementCount=x.Count();
var-loopCounter=0;
while(loppCounter
查看selenium,最可能的原因是元素已从DOM中删除或移除。你能发布一个更完整的例子吗?戴尔-太棒了。非常感谢你。我确实必须将hitit.Click()更改为hitit.SendKeys(Keys.Enter),因为页面加载速度不够快,而且我遇到了一个错误,a标记无法单击。但是你的回答救了我的理智,所以我非常感激。
var x = driver.FindElements(By.XPath("//div[contains(@id, 'center-')]"));
var elementCount = x.Count();
var loopCounter = 0;
while (loppCounter < elementCount)
{           
        var allCenterDivs = driver.FindElements(By.XPath("//div[contains(@id, 'center-')]"));      
        var hitit = allCenterDivs[loopCounter].FindElement(By.TagName("a"));
        hitit.Click();
        driver.Navigate().Back();          
        loopCounter++;      
}