陈旧元素引用:元素未附加到带有循环的页面文档

时间:2017-07-13 21:37:19

标签: c# selenium-webdriver

我正在尝试浏览页面上有多个标签的系统,每个标签上都有多个页面链接。我知道这与从DOM中删除的元素有关,但我不确定如何使用我的场景解决这个问题。

        //Get all the elements in the top tab section
        IList<IWebElement> tabIndex = driver.FindElements(By.XPath("//*[@class='TabList ClearFix']//a[@tabindex=-1]"));
        //The first page of the frist tab is already accessed
        //Get all the page links that are in the left navigation bar, click on the page and then move onto the next one
        //Once the last page is accessed, move to the next tab and repeat.
        foreach (IWebElement element in tabIndex)
        {
            Console.WriteLine(element.Text.ToString());
            IList<IWebElement> leftIndex = driver.FindElements(By.XPath("//*[@id='LeftMenu']//a[@tabindex=-1]"));
            foreach (IWebElement lElement in leftIndex)
            {
                Console.WriteLine(lElement.Text.ToString());
            }
            element.Click();
        }

我在Console.WriteLine(element.Text.ToString());收到例外情况 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

陈旧元素:您正在找到一个导致对象的元素&gt;页面更改/重新加载&gt;你正试图使用​​那个对象。

您的主要问题是您在先前找到的对象列表的<google-chart type="pie" data='[["ID", "Life Expectancy", "Fertility Rate", "Region", "Population"], ["CAN", 80.66, 1.67, "North America", 33739900], ["DEU", 79.84, 1.36, "Europe", 81902307], ["DNK", 78.6, 1.84, "Europe", 5523095], ["EGY", 72.73, 2.78, "Middle East", 79716203], ["GBR", 80.05, 2, "Europe", 61801570], ["IRN", 72.49, 1.7, "Middle East", 73137148], ["IRQ", 68.09, 4.77, "Middle East", 31090763], ["ISR", 81.55, 2.96, "Middle East", 7485600], ["RUS", 68.6, 1.54, "Europe", 141850000], ["USA", 78.09, 2.05, "North America", 307007000]]'> </google-chart> 循环中执行click操作,这些元素对象在页面更改/重新加载时丢失。

您需要确保页面在查找元素和将其用于操作之间不会发生变化。

  

不要在可能使用来自循环外部的对象更改页面的循环中执行操作

选项:
  - 计算制表符并按索引使用循环中的find   - 找到所有标签,在列表中保存一些foreach并使用这些属性查找循环中的每个标签
  - 使用选择器根据当前选项卡识别选项卡,例如下一个未打开选项卡的选择器

答案 1 :(得分:0)

只是做一些简单的事情,比如将元素集合刮到循环中就应该修复它。这样在循环的顶部,页面再次被删除。

// Get all the elements in the top tab section
//The first page of the frist tab is already accessed
//Get all the page links that are in the left navigation bar, click on the page and then move onto the next one
//Once the last page is accessed, move to the next tab and repeat.
foreach (IWebElement element in driver.FindElements(By.XPath("//*[@class='TabList ClearFix']//a[@tabindex=-1]")))
{
    Console.WriteLine(element.Text.ToString());
    foreach (IWebElement lElement in driver.FindElements(By.XPath("//*[@id='LeftMenu']//a[@tabindex=-1]")))
    {
        Console.WriteLine(lElement.Text.ToString());
    }
    element.Click();
}