IWebElements的foreach循环中的StaleElementException c#

时间:2016-07-29 15:57:53

标签: c# selenium-webdriver foreach

所以我的问题如下,我正在尝试检查页面上的所有元素并验证element.GetAttribute("class") == expectedClass。这是代码

 var feedback = Driver.FindElements(AuctivaSalesPageModel.ViewFeedbackSelector);
            var attempts = 0;
            foreach (IWebElement element in feedback)
            {
                while (attempts < 3)
                {
                    try
                    {
                        Assert.AreEqual("leaveFeed actionTaken", element.GetAttribute("class"));
                        attempts = 0;
                        break;

                    }
                    catch (StaleElementReferenceException)
                    {
                        Assert.AreEqual("leaveFeed actionTaken", element.GetAttribute("class"));
                        attempts = 0;
                        break;
                    }
                    catch (AssertionException)
                    {
                        System.Threading.Thread.Sleep(3000);
                        Driver.Navigate().Refresh();
                        AuctivaSalesPage.WaitForElementVisible(Driver, AuctivaSalesPageModel.TotalNumberOfSalesSelector);
                        AuctivaSalesPage.ScrollToTop();
                        AuctivaSalesPage.SelectNoFolder();
                        attempts++;
                    }

                }

            }

现在我一直在阅读StaleElementException,我认为我的catch和retry方法没用,好像DOM已刷新,然后列表中的元素将始终是陈旧的。我相信我需要做的是使用Driver.FindElement()重新构造元素,但是我在IWebElements的foreach循环中遇到了这个问题我不知道如何获取未能通过的特定元素的选择器重试? 我应该抓住异常重建列表然后重试整个foreach循环吗?或者有没有办法提取特定于循环中element的选择器,以便我可以按照

的方式做一些事情。

Assert.AreEqual("leaveFeed actionTaken", Driver.FindElement(By.someSelector(element.GetSelector)).GetAttribute("class"));

1 个答案:

答案 0 :(得分:0)

我希望这会有所帮助,但我遇到了类似的问题,并且能够使用以下逻辑绕过它,认为它不是最好的方法,但它有效:

var feedbackCount = Driver.FindElements(AuctivaSalesPageModel.ViewFeedbackSelector).Count();
var attempts = 0;
for(var i = 0; i < feedbackCount; i++)
{
    while (attempts < 3)
    {
        var element = Driver.FindElements(AuctivaSalesPageModel.ViewFeedbackSelector).ElementAt(i);
        //Continue you logic here
    }
}

希望这个帮助