项目表包含项目列表项目在单击项目时具有列(Id,名称,PM等),项目详细信息页面将打开该项目。自动化找到项目并单击它但我收到此错误
OpenQA.Selenium.StaleElementReferenceException:元素引用 陈旧的元素不再附加到DOM, 它不在当前帧上下文中,或者文档已经存在 刷新
我认为点击项目后,进入Proj详细信息页面后,循环不会停止。我怎么能打破;在找到我的项目后,从所有循环中获取 我是自动化新手我需要帮助
public static void SelectProject()
{
IWebElement Table = Driver.Instance.FindElement(By.Id("projectsGrid"));
ReadOnlyCollection<IWebElement> allRows = Table.FindElements(By.TagName("tr"));
foreach (IWebElement row in allRows)
{
ReadOnlyCollection<IWebElement> cells = row.FindElements(By.TagName("td"));
foreach (IWebElement cell in cells)
{
if (cell.Text.Contains("002032"))
{
cell.Click();
break;
}
}
}
}
答案 0 :(得分:2)
不需要标记,使用return而不是break。
return;
答案 1 :(得分:0)
我个人试图避免使用break语句,所以我会尝试使用while或者使用sentinel值但是如果你想使用foreach,你应该包含一个bool来决定你是否为每个循环中断。找到你想要的东西然后设置bool。例如:
public static void SelectProject()
{
IWebElement Table = Driver.Instance.FindElement(By.Id("projectsGrid"));
ReadOnlyCollection<IWebElement> allRows =
Table.FindElements(By.TagName("tr"));
bool loop = true;
foreach (IWebElement row in allRows)
{
ReadOnlyCollection<IWebElement> cells =
row.FindElements(By.TagName("td"));
foreach (IWebElement cell in cells)
{
if (cell.Text.Contains("002032"))
{
cell.Click();
loop = false;
}
if (!loop)
break;
}
if (!loop)
break;
}
}
答案 2 :(得分:0)
你可以用一个好的定位器去除这个函数中99%的逻辑。
public void SelectProject()
{
Driver.Instance.FindElement(By.XPath("[@id='projectsGrid']//td[.='002032']")).Click();
}
如果此元素不存在,则抛出异常的上述方法。如果元素不存在,您当前的方法不会做任何事情(抛出异常或单击元素)。如果您想要这种行为,请使用以下代码。
public void SelectProject()
{
IReadOnlyCollection<IWebElement> e = Driver.Instance.FindElements(By.XPath("[@id='projectsGrid']//td[.='002032']"));
if (e.Any())
{
e.ElementAt(0).Click();
}
}
答案 3 :(得分:-1)
您可以使用名为done
的布尔标志。它最初是假的,只是在从内循环中断之前才设置为true。如果你打破了内循环,那么在外循环之后立即检查done == true
。如果是这样,那意味着你打破了内循环,所以你也应该打破外循环。
public static void SelectProject()
{
// Boolean flag for when we break from inner loop
bool done = false;
IWebElement Table = Driver.Instance.FindElement(By.Id("projectsGrid"));
ReadOnlyCollection<IWebElement> allRows = Table.FindElements(By.TagName("tr"));
foreach (IWebElement row in allRows)
{
ReadOnlyCollection<IWebElement> cells = row.FindElements(By.TagName("td"));
foreach (IWebElement cell in cells)
{
if (cell.Text.Contains("002032"))
{
cell.Click();
done = true;
break;
}
}
// Check if the inner loop
// broke, if so also break here
if (done == true) {
break;
}
}
}