我有很多例子的specflow测试,所以如果我单独运行测试,所有测试都会通过。但当我作为一个组运行它们时,只有第一次通过,其他测试都会失败。OpenQA.Selenium.StaleElementReferenceException:过时的元素引用:元素没有附加到页面文档
场景是通过单元格中的数据查找第一行,并通过单击带有菜单图标的单元格来验证菜单中的项目这是我用来执行这种场景的类。
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();
}
}
可能是什么问题?我刚开始写这样的自动测试,所以不要太骂代码(
作为In a group
,我假设测试在一个chrome会话中连续运行。也许你的测试结束了,下一页会是另一页。只要确保您在开始时始终导航到正确的位置——尝试使用setup和tearDown属性。
如果你对数据进行操作,首先测试可能会在页面上留下混乱,然后添加清除方法
过时的元素异常意味着你的定位元素在那里,但你的驱动程序实例对此不感兴趣,有两种方法可以解决这个
1.硒中采用刷新法2.通过for循环,您可以解析(循环直到元素被点击(
添加了清洁表方法_contactsTableContext.Clear();