组的第二次和进一步测试中的 StaleElementReferenceException
StaleElementReferenceException in second and further test of group
我有很多示例的 specflow 测试,所以如果我 运行 单独测试全部通过。但是当我 运行 将它们作为一个组仅首先通过时,其他失败 OpenQA.Selenium.StaleElementReferenceException :陈旧的元素参考:元素未附加到页面文档
场景是通过单元格中的数据查找第一行并通过单击带有菜单图标的单元格来验证菜单中的项目
这是我用来执行这种情况的 class。
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();
}
}
可能是什么问题?
我刚开始写这样的自动测试,所以不要骂代码太多)
As In a group
我假设在一个 chrome 会话中连续测试 运行。可能你的测试结束了,下一个期待另一页。只需确保您在开始时始终导航到正确的位置 - 尝试使用 setup 和 tearDown 属性。
如果先对数据进行操作,测试可能会在页面上造成混乱-然后添加清除方法
陈旧元素异常意味着您的定位元素在那里,但您的驱动程序实例对此不感兴趣,有 2 种方法可以解决此问题
1.By 在 selenium 中使用刷新方法
2.By 你可以解决的循环(循环直到元素被点击)
添加了清理 table 方法
_contactsTableContext.Clear();
我有很多示例的 specflow 测试,所以如果我 运行 单独测试全部通过。但是当我 运行 将它们作为一个组仅首先通过时,其他失败 OpenQA.Selenium.StaleElementReferenceException :陈旧的元素参考:元素未附加到页面文档
场景是通过单元格中的数据查找第一行并通过单击带有菜单图标的单元格来验证菜单中的项目 这是我用来执行这种情况的 class。
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();
}
}
可能是什么问题? 我刚开始写这样的自动测试,所以不要骂代码太多)
As In a group
我假设在一个 chrome 会话中连续测试 运行。可能你的测试结束了,下一个期待另一页。只需确保您在开始时始终导航到正确的位置 - 尝试使用 setup 和 tearDown 属性。
如果先对数据进行操作,测试可能会在页面上造成混乱-然后添加清除方法
陈旧元素异常意味着您的定位元素在那里,但您的驱动程序实例对此不感兴趣,有 2 种方法可以解决此问题
1.By 在 selenium 中使用刷新方法 2.By 你可以解决的循环(循环直到元素被点击)
添加了清理 table 方法
_contactsTableContext.Clear();