首页 > 解决方案 > 遍历 Web 图片(Selenium、Windows 窗体、C#)

问题描述

我正在尝试遍历图像列表。一旦我将 XPath 的后端从 td/a[1] 替换为 td/a[2],我就会在我的文件夹中获得第二个图像。我想在目录中获取所有下载的文件(20 个图像),但我不知道如何遍历 XPath。任何人都可以帮助我吗?

var TwentyImages = driver.FindElements(By.XPath("//* 
    [@id='ctl00_Main_pnlSearchControl']/tbody/tr/td/table/tbody/tr/td/table[3]/tbody/tr[3]/td/a[2]"));

for (int i = 0; i < TwentyImages.Count; i++)
{                   
  TwentyImages[i].Click();

  var Images = driver.FindElements(By.TagName("img"));

  foreach (var xs in Images)
  {
     var ImageUrl = xs.GetAttribute("src");
     WebClient DL = new WebClient();
     DL.DownloadFile(ImageUrl, @"C:\User\Desktop\GoogleImages\.jpg");

  }

  Thread.Sleep(1000);
  driver.Navigate().Back();
  driver.Quit();
}





标签: c#seleniumwebdriver

解决方案


(根据评论中的新信息进行编辑)

如果您的 20 张图像 xpath 中每个单独图像的 XPath 是例如 Image1 位于(...)/td/a[1],而 Image2 位于(...)/td/a[2],等等,那么您可以简单地将路径a从您的 XPath 中删除,然后使用:

var TwentyImages = driver.FindElements(By.XPath("//* 
    [@id='ctl00_Main_pnlSearchControl']/tbody/tr/td/table/tbody/tr/td/table[3]/tbody/tr[3]/td"));

从那里您的代码仍然能够找到您需要下载的每个图像 url的img标签、属性。src

另外,不要忘记DL.DownLoad根据下面的原始响应更改每个图像的文件名称。

(原始回复)

每次DL.DownloadFile(...)调用其中的图像时,都会覆盖您的“.jpg”文件名ImageUrl

您可以foreach()用另一个for()循环替换您的并将文件名设置为索引值,这将在保存时为每个文件提供一个唯一的名称并防止它被覆盖:

例子:

for(int xs = 0; xs < Images.Count(); xs++)
{
    var ImageUrl = Images[xs].GetAttribute("src");
    WebClient DL = new WebClient();
    DL.DownloadFile(ImageUrl, $@"C:\Users\Desktop\{xs}.jpg");
}

推荐阅读