如何在c#中使用Selenium迭代网站中的所有链接
本文关键字:网站 链接 迭代 Selenium | 更新日期: 2023-09-27 18:05:49
我对Selenium非常陌生,并试图做一个小项目来从网站的页面获取图像。
在foreach的第二遍抛出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)
{
}
}
}
您需要导航到链接所在的页面,然后才能导航到下一个链接。抛出失效链接异常是因为您试图导航到的链接不在selenium驱动程序所在的页面上。只需在需要的地方添加'driver.Navigate(). back()'即可。
这可以用递归函数非常优雅地完成。
我很乐意与您分享我所做的递归函数来执行此任务,但我目前正在移动设备上。
Ayilmaz,如果您正在使用ide,那么您可以检查导航中是否有back()方法。有!或者,你可以谷歌"硒导航api"。然后,去这里的官方文档http://docs.seleniumhq.org/docs/03_webdriver.jsp。查看下面:导航:历史和位置。
另一个尝试是创建两个浏览器。一个浏览器用于保存包含所有链接的页面,另一个页面用于打开每个链接。为什么要后退和前进,并不断重新加载主页?缺点是你需要更多的内存来创建任何额外的浏览器。
您可以尝试使用"Actions"创建新窗口或新选项卡,而不是创建新浏览器。在我有限的经验中,管理窗口和选项卡并不容易,而且在chrome中可能不可靠(我创建了两个具有独特窗口句柄的选项卡,而chrome无法从新选项卡切换到上一个选项卡!!)。