无法使用C#

时间:2016-06-15 16:38:30

标签: c# selenium for-loop foreach

我遇到了一个循环浏览WebElements列表的问题。它在第一次迭代中起作用,但在第二次迭代时失败。

工作流

循环1正确执行并创建Web元素列表。我这样做是因为我认为循环2失败是因为导航切换(例如点击网页元素)

Durning Loop 2执行

  1. ListofLinks已填充
  2. 在第一次迭代中,它工作正常,点击web元素并完成循环
  3. 在第二次迭代Item.Text失败。看起来该项目不存在。
  4. 有什么想法?

        var ListOflinks = new List<IWebElement>();
    
        //Loop 1
                    foreach (var item in driver.FindElements(By.TagName("a")))
                    {
                        if (item.Text != "")
                        {
                            ListOflinks.Add(item);
                        }
                    }
    
    // Loop 2
     foreach (var item in ListOflinks)
                {
                    if (item.Text != "")   // <<<<---- Fails Here
                    {
                        // Clicks on Current Link
                        item.Click();
                    }
                 }
    

    注意:在我尝试2循环解决方案之前。我正在考虑相同的结果。它适用于第一个Web元素,然后在第二次迭代时失败。

    foreach (var item in driver.FindElements(By.TagName("a")))
                {
                    if (item.Text != "")
                    {
                        item.Click();
                    }
                }
    

2 个答案:

答案 0 :(得分:2)

IList<IWebElement> links = driver.FindElements(By.TagName("a"));
IList<IWebElement> listOflinks = new List<IWebElement>();

foreach (IWebElement link in links)
{
   if (!string.IsNullOrEmpty(link.Text))
      listOflinks.Add(link);
}

在第一次点击 DOM将会改变后,你会给你所有链接引用,你将失去所有元素!

要获取元素,您需要再次初始化链接

出于您的目的,您应该使用for循环来检查获取正确的索引

IList<IWebElement> links = driver.FindElements(By.TagName("a"));
IList<IWebElement> listOflinks = new List<IWebElement>();

for(int i = 0 ; i < links.Count ; i++)
{
   links = driver.FindElements(By.TagName("a"));

   if (!string.IsNullOrEmpty(link[i].Text))
      links[i].Click();
}

如果点击链接后页面重定向到其他页面,则需要更改逻辑,否则无效!

答案 1 :(得分:0)

可能是因为当单击第一个链接并导航到新视图时,先前找到的元素在当前视图中不存在。

如果是这种情况,您可以在第二个循环中导航回来,然后单击链接。