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

时间:2016-09-05 19:47:52

标签: c# selenium

我是Selenium的新手,并试图通过一个小项目从网站页面获取图像。

它在foreach的第二个loof中抛出StaleElementReferenceException。它在if语句中抛出异常。我知道在GoToUrl()之后,它不能使用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)
        {

        }
    }
}

2 个答案:

答案 0 :(得分:2)

您需要导航回链接所在的页面,然后才能导航到下一个链接。抛出过时链接异常,因为您尝试导航到的链接不在selenium驱动程序所在的页面上。只需添加&#39; driver.Navigate()。返回()&#39;在需要的地方。

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

我很乐意与您分享我为执行此任务所做的递归功能,但我目前正在使用移动设备。

答案 1 :(得分:0)

Ayilmaz,如果你使用的是ide,那么你可以检查导航中是否有back()方法。有 !或者,您可以谷歌&#34; selenium导航api&#34;。然后,转到此处的官方文档http://docs.seleniumhq.org/docs/03_webdriver.jsp。查看下面:导航:历史和位置。

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

您可以尝试使用&#34;操作&#34;使用新标签创建新窗口。而不是创建一个新的浏览器。在我有限的经验中,管理窗口和标签并不容易,并且它在chrome中可能不可靠(我创建了两个带有独特窗口句柄的标签,并且chrome无法从新标签切换到上一个标签!!!)。