Selenium陈旧元素异常(在运行测试时找到而不是在调试时找到)

时间:2016-07-01 14:56:33

标签: c# selenium exception selenium-webdriver

运行代码时,我收到了陈旧的元素异常。但是在调试时我没有得到这个例外。 这是我的一段代码。有谁能够帮我 ?感谢

      public static bool CheckListFilterResult(IList<IWebElement> gridColumns, IList<IWebElement> gridRows, string filterColumn, List<string> filters)
    {
        bool checkResult = false;
        {
            int filterColumnIndex = GetColumnIndex(gridColumns, filterColumn);
           if (gridRows.Count > 0 )
           {
                foreach (IWebElement row in gridRows)
                {
                    TestManager.Doc.Step("before bool match");
                   bool filterMatch = filters.Contains(row.FindElements(By.TagName("td"))[filterColumnIndex].Text.Trim());
                    if (filterMatch)
                    {
                        checkResult = true;

                    }
                    else
                    {
                        checkResult = false;
                        break;
                    }
                }
            }
        }
            return checkResult;
        }
    }

2 个答案:

答案 0 :(得分:0)

从查看代码开始,该行是您从rows集合访问某些内容的第一行。我的猜测是它与此有关。你拉了rows集合,然后应用过滤器,然后调用这个函数?如果是这样,那可能就是问题所在。您需要应用过滤器,然后拉出rows集合,然后调用该函数。

答案 1 :(得分:0)

当您运行selenium代码时,可能是您的IWebElement行已通过javascript更新。

如此处所述:http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp,当UI上的对象可能已刷新但您尝试访问同一对象时,会发生过时元素引用异常。因此,即使该行对用户可见,它可能已被javascript更新/替换,然后它是一个不同的对象。

它之所以偶然发生,但并非总是如此,当你在调试模式下运行时,你停在你的selenium代码的每一行,但是javascript代码没有停止,所以UI上的元素已经刷新了,然后你的selenium代码获得IWebElement行的新副本。

有几种方法可以解决此问题。

  1. 尝试捕获StaleElementReferenceException,如果它发生,那么重做你要做的任何事情。
  2. 你可以这样做:wait.until(ExpectedConditions.stalenessOf(row));
  3. 希望有所帮助