在表

时间:2018-05-07 17:31:25

标签: c# selenium automation

项目表包含项目列表项目在单击项目时具有列(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;
            }
        }
    }
}

4 个答案:

答案 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;
        }
    }
}