0

スクレイピングプログラムを書いています。

初めてアンカータグをクリックできるようになりましたが、もう一度ループしても同じことは起こりません。私は IE の Watin インスタンスでこれを行いました。これは、私が行ったIEインスタンスの背後にあるとは思えません。

2 つのコードを見つけてください。

PDFのダウンロード方法

private void DownloadFiles(IE ieInstance, HTMLDocument document_sub)
{
  // int chktest = 2;
  try
  {
    foreach (HTMLAnchorElement anchorTagPg1 in document_sub.getElementsByTagName("a"))
    {
      if (anchorTagPg1.innerText.Contains("Monthly Statement"))
      {
        string urltemp = anchorTagPg1.outerHTML.ToString();
        int startTextpos = urltemp.IndexOf("window.open");
        string spltstr1 = urltemp.Substring(startTextpos);
        int endpos = spltstr1.IndexOf(')');
        string spltstr2 = spltstr1.Substring(0, endpos);
        spltstr2 = spltstr2.Replace("window.open(", "");
        string[] manipulatestrsplt = spltstr2.Split(',');
        string finalmanipstr = manipulatestrsplt[0].Replace("'", "");
        finalmanipstr = finalmanipstr.Replace("amp;", "");
        finalurl = "https://myaccount.pseg.com/psegbdisu/" + finalmanipstr;
        //anchorTagPg1.click();
        //ieInstance.WaitForComplete();
        ieInstance.GoToNoWait(finalurl);
        Thread.Sleep(5000);
        SendKeys.SendWait("^%S"); // to get the Save As window...
        Thread.Sleep(5000);
        SendKeys.SendWait("abc123");
        Thread.Sleep(5000);
        SendKeys.Send("^S");
        Thread.Sleep(5000);
        SendKeys.SendWait("DownloadedFile" + iFileCnt + ".pdf");  // Enters File Name
        Thread.Sleep(5000);
        SendKeys.Send("{ENTER}");
        iFileCnt++;
        //chktest++;
        Thread.Sleep(5000);
        ieInstance.Back();
        // bool rtnBack = ieInstance.Back();
        Thread.Sleep(10000);
        // }
      }
    }
  }
  catch (Exception ex)
  {
      MessageBox.Show(ex.Message.ToString());
  }
}

アンカータグをヒットすることも、onclickイベントを発生させることもできない別の方法。

private void ClickSelectAccount(IE ieInstance)
{
  FrameCollection hframesSelAcct = ieInstance.Frames;
  HTMLDocument document_sub_SelAcct = ((mshtml.HTMLDocument)(((WatiN.Core.Native.InternetExplorer.IEDocument)(((WatiN.Core.FrameCollection)(hframesSelAcct))[1].NativeDocument)).HtmlDocument));

  foreach (HTMLAnchorElement anchorTagSelectAcct in document_sub_SelAcct.getElementsByTagName("a"))
  {
    if (anchorTagSelectAcct.innerText.Contains("Select Account"))
    {
      Thread.Sleep(2000);
      //anchorTagSelectAcct.click();
      anchorTagSelectAcct.FireEvent("onclick");
      Thread.Sleep(10000);
      ieInstance.WaitForComplete();
      anchorTagSelectAcct.click();
      Thread.Sleep(10000);

      break;
    }
  }
}

誰かが私を助けてください.2番目の方法は初めてうまくいきますが、2回目はうまくいきません. より多くのスリープ時間を試してみたので、IEインスタンスに疑問があります。また、ループに入ることができますが、リンクをクリックすることはできません。

前もって感謝します

4

1 に答える 1

0

DownloadFiles メソッド内で次のことを試してください。

var link = ieInstance.Links.FirstOrDefault(p => p.Text.Equals("Select Account"));
if (link != null && link.Exists)
{
   link.Click();
}

また

var link = ieInstance.Links.FirstOrDefault(p => p.Text.Equals("Monthly Statement"));
if (link != null && link.Exists)
{
   link.Click();
}

このコードをデバッグして、実際にリンク内にアクセスしていることを確認します。if ステートメントが存在します。そうでない場合は、次を試してください。

var links = browser.Links;
foreach (var link in links.Where(l => l != null && (l.Text.Contains("Select Account")| l.Text.Contains("Monthly Statement"))))
{
    link.Click();
}

これがうまくいったかどうか教えてください。

于 2014-11-06T17:20:19.847 に答える