C# 如何在C中使用Selenium迭代网站中的所有链接#

C# 如何在C中使用Selenium迭代网站中的所有链接#,c#,selenium,C#,Selenium,我对Selenium非常陌生,正在尝试做一个小项目,从网站页面获取图像 它在foreach的第二个loof中抛出StaleElementReferenceException。它在if语句中抛出异常。我知道在gotour()之后,它不能使用GetAttribute(),但我应该如何迭代所有网页 driver.Navigate().GoToUrl("http://www.xxxxxxxx.com/"); // dummy web address driver.Manage().Timeouts().

我对Selenium非常陌生,正在尝试做一个小项目,从网站页面获取图像

它在foreach的第二个loof中抛出StaleElementReferenceException。它在if语句中抛出异常。我知道在gotour()之后,它不能使用GetAttribute(),但我应该如何迭代所有网页

driver.Navigate().GoToUrl("http://www.xxxxxxxx.com/"); // dummy web address
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
IList<IWebElement> results = driver.FindElements(By.CssSelector(".list-menu > li > ul > li > a"));

foreach (IWebElement result in results)
{
    if (result.GetAttribute("href").Length>0) // It throws EXCEPTION here *******
    {
        driver.Navigate().GoToUrl(result.GetAttribute("href"));
        driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(20));

        //serie-list-product-four-column
        IList<IWebElement> gridResults = driver.FindElements(By.CssSelector(".serie-list-product-four-column > li > a"));
        foreach (IWebElement gridResult in gridResults)
        {

        }
    }
}
driver.Navigate().gotour(“http://www.xxxxxxxx.com/"); // 虚拟网址
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
IList results=driver.FindElements(By.CssSelector(“.list menu>li>ul>li>a”);
foreach(结果中的IWebElement结果)
{
if(result.GetAttribute(“href”).Length>0)//它在这里抛出异常*******
{
driver.Navigate().gotour(result.GetAttribute(“href”);
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(20));
//系列列表产品四列
IList gridResults=driver.FindElements(By.CssSelector(“.serie list product four column>li>a”);
foreach(gridResults中的IWebElement gridResult)
{
}
}
}

您需要导航回链接所在的页面,然后才能导航到下一个链接。由于尝试导航到的链接不在selenium驱动程序所在的页面上,因此引发陈旧链接异常。只需在需要的地方添加“driver.Navigate().Back()”

这可以通过递归函数非常优雅地完成


我很乐意与您分享我为执行此任务而创建的递归函数,但我目前正在使用移动设备。

Ayilmaz,如果您使用的是ide,那么您可以检查navigate中是否有back()方法。有!或者,您可以在谷歌上搜索“SeleniumNavigateAPI”。然后,转到这里的官方文档。查看:导航:历史和位置

另一个尝试是创建两个浏览器。一个浏览器用于保存包含所有链接的页面,另一个页面用于打开每个链接。为什么要前后移动并不断重新加载主页?缺点是您需要更多的内存来创建任何其他浏览器

您可以尝试使用“操作”创建新窗口或新选项卡,而不是创建新浏览器。在我有限的经验中,管理窗口和选项卡并不容易,而且在chrome中可能不可靠(我创建了两个具有唯一窗口句柄的选项卡,chrome无法从新选项卡切换到以前的选项卡!!!)