0

我有很多例子的specflow测试,所以如果我单独运行测试都通过了。但是当我将它们作为一个组运行时,只有第一次通过,其他失败并出现 OpenQA.Selenium.StaleElementReferenceException : stale element reference: element is not attach to the page document

场景是通过单元格中的数据查找第一行并通过单击带有菜单图标的单元格来验证菜单中的项目这是我用来执行此类场景的类。

public class ContactTable
    {
        private static readonly By ActionMenu = By.ClassName("inline-action-dialog");

        static List<ContactTableContext> _сontactTableContext = new List<ContactTableContext>();

        public static IWebElement EditActionButton { get; set; }
        public static IWebElement DeleteActionButton { get; set; }
        
        public static void ReadTable(IWebElement table)
        {
            var columns = table.FindElements(By.TagName("th"));
            var rows = table.FindElements(By.TagName("tr"));
            int rowIndex = 0;
            foreach (var row in rows)
            {
                int columnIndex = 0;
                var columnDatas = row.FindElements(By.TagName("td"));
                foreach (var columnValue in columnDatas)
                {
                    _сontactTableContext.Add(new ContactTableContext
                    {
                        RowNumber = rowIndex,
                        ColumnName = columns[columnIndex].Text != "" ?
                                  columns[columnIndex].Text : columnIndex.ToString(),
                        ColumnValue = columnValue.Text,
                        ColSpecValues = columnValue.Text != "" ? null :
                                        columnValue.FindElements(ActionMenu),
                    });
                    columnIndex++;
                }

                rowIndex++;
            }
        }

        public static void PerformActionOnCell(string columnIndex, string refColunmName, string refColunmValue)
        {
            var row = _сontactTableContext.FirstOrDefault(table => table.ColumnName == refColunmName && table.ColumnValue == refColunmValue);
            var rowNumber = row.RowNumber;
            var cell = (from e in _reviewContactTableContext
                        where e.ColumnName == columnIndex && e.RowNumber == rowNumber && e.ColSpecValues != null
                        select e.ColSpecValues).FirstOrDefault();
            var currenCell = cell?.First();
            currenCell.Click();
            GetActionMenu(currenCell);
        }

        public static void GetMenu(IWebElement cell)
        {
            var actionPanel = cell.FindElement(By.TagName("ul"));
            if (actionPanel.Displayed)
            {
                var actionList = actionPanel.FindElements(By.TagName("span"));
                EditButton = actionList.FirstOrDefault();
                DeleteButton = actionList.LastOrDefault();
            }
        }

可能是什么问题呢?我是编写此类自动测试的新手,所以不要过多地责骂代码)

4

3 回答 3

0

因为In a group我假设测试在一个 chrome 会话中连续运行。可能你的测试结束了,下一个期待另一页。只需确保您在开始时始终导航到正确的位置 - 尝试使用 setup 和 tearDown 属性。

如果您首先对数据进行操作测试可能会在页面上留下混乱 - 然后添加清除方法

于 2020-07-17T15:42:25.943 回答
0

陈旧元素异常意味着您的定位元素在那里,但您的驱动程序实例对此不感兴趣,有两种方法可以解决此问题

1.通过在硒中使用刷新方法2.通过for循环你可以解决(循环直到元素被点击)

于 2020-07-17T23:36:59.583 回答
0

添加了清理表方法
_contactsTableContext.Clear();

于 2020-07-20T11:52:26.287 回答