2024年12月31日火曜日

C#のSeleniumでリンクリストから違うページに遷移して、再度リンクから遷移を繰り返したいとき

ChatGPTで、解決方法を聞いてみたら、いい方法があることを知った。
   
IList<IWebElement> Iwels = FindElementsWithWait(mainDriver, By.XPath("//*[@id=\"sr\"]/ul/li"), 20);
    
  foreach (IWebElement iel in Iwels)
  {
       IWebDriver  tmpDriver = mainDriver;  
      try
      {           
          IWebElement link_question = iel.FindElement(By.XPath("./h3/a"));
          link_question.Click();           
  
          IWebElement i_question = SeleniumHelper.FindElementWithWait(
              tmpDriver,
              By.XPath("//*[@id=\"leftColumn\"]/article[1]"),
              10
          );
        //ここでi_questionを使い相対パスで目的データを取得       
      }
      catch (Exception ex)
      {         
      }            
  }
 ChatGPTに質問「このようなコードだと、エラーが発生します。おそらく、foreachしている間にwedDriverが最初のものとかわってしまうことが原因だと思います。最初のページからスクレイピングできないのが原因だと思います。何かいい方法あるのでしょうか?」
foreach (IWebElement iel in Iwels)
{    
    try
    {
        IWebElement link_question = iel.FindElement(By.XPath("./h3/a"));
        string questionUrl = link_question.GetAttribute("href");
        ((IJavaScriptExecutor)mainDriver).ExecuteScript($"window.open('{questionUrl}', '_blank');");
        mainDriver.SwitchTo().Window(mainDriver.WindowHandles.Last()); 
        IWebElement i_question = SeleniumHelper.FindElementWithWait(
            mainDriver,
            By.XPath("//*[@id=\"leftColumn\"]/article[1]"),
            10
        );
        //ここでi_questionを使い相対パスで目的データを取得  

        mainDriver.Close();
        mainDriver.SwitchTo().Window(mainDriver.WindowHandles.First());
    }
    catch (Exception ex)
    {
       
    }
}

0 件のコメント:

コメントを投稿