Selenium 陈旧元素异常(在运行测试时发现,而不是在调试时发现)

问题描述 投票:0回答:3

运行代码时出现陈旧元素异常。但是在调试时我没有得到这个异常。 这是我的代码。有谁能够帮助我 ?谢谢

      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;
        }
    }
c# selenium exception selenium-webdriver
3个回答
0
投票

从代码来看,该行是您从

rows
集合中访问某些内容的第一行。我的猜测是这与此有关。您是否提取了
rows
集合,然后应用过滤器,然后调用此函数?如果是这样,那可能就是问题所在。您需要应用过滤器,然后拉出
rows
集合,然后调用该函数。


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));

希望有帮助


0
投票

重新分配 HTML 目标

问题似乎出在您的 HTML 定位上。在导致过时的

loop
期间,您不会再次重新定位 HTML。因为请记住,一旦用值声明的变量就永远不会改变,除非您重新赋值。

修复

我为您面临的类似问题提供了解决方案,在这里检查

© www.soinside.com 2019 - 2024. All rights reserved.