2011-04-11 295 views
0

我不是一个真正的程序员(更多的是scripter),并使用AutoIt编写了一个非常快速的脚本!从惠普网站上收集我们所拥有的电脑列表中的信息。我想我会尝试将它移植到C#以使其更“专业”一点。从网页获取信息

该代码读取包含产品代码,序列号的文件。然后它将这些信息放到datagridview中。有三栏,第三栏是开始日期(我在找什么)。

以下是我到目前为止。从这里我失去了下一步该做什么。该网页确实进入下一页,但我不明白如何获取我需要的信息(第一个开始日期 - 这是保修开始时的时间)。在AutoIt中!它是第19帧,然后我解析了它。我只是不太清楚如何在C#中做到这一点。

任何指针将不胜感激。

private void runner(int i) 
    { 
     int j = i; 
     bool loadFinished = false; 

     webBrowser1.DocumentCompleted += delegate { loadFinished = true; }; 
     webBrowser1.Navigate("http://www11.itrc.hp.com/service/ewarranty/warrantyInput.do"); 

     while (!loadFinished) 
     { 
      Thread.Sleep(100); 
      Application.DoEvents(); 
     } 

     webBrowser1.Document.GetElementById("productnumber").InnerText = dt.Rows[j][0].ToString(); 
     webBrowser1.Document.GetElementById("serialnumber1").InnerText = dt.Rows[j][1].ToString(); 

     HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("SELECT"); 
     foreach (HtmlElement elem in elems) 
     { 
      if (elem.Name.ToString() == "country") 
      { 
       elem.SetAttribute("value", "US"); 
      } 
     } 

     int countelement = 0; 
     HtmlElementCollection col = webBrowser1.Document.GetElementsByTagName("INPUT"); 
     foreach (HtmlElement element in col) 
     { 
      if (element.Name.ToString() == "") 
      { 
       if (countelement == 1) 
       { 
        element.InvokeMember("click"); 
       } 
       countelement++; 
      } 
     } 
     dt.Rows[j][2] = "done"; 

    }` 

回答

0

我真的帮不了你(因为我从来没有你现在在做什么),但我认为watin自动化库可以帮助您显著

0

我想我想通了。在提交按钮上的点击事件之后,我需要暂停以等待新页面加载。即使我看到新的网页,该程序已经转到下一个命令。看看调试中的变量,我可以看到它是旧的页面。以下是我使用的代码。

当我想到关于网页加载时,我已经知道它是第19帧。从那里,它只是一个问题,将字符串转换为一行数组,然后循环查找第一个开始日期并提取该信息。

 private void runner(int i) 
    { 
     int j = i; 
     bool loadFinished = false; 

     webBrowser1.DocumentCompleted += delegate { loadFinished = true; }; 
     webBrowser1.Navigate("http://www11.itrc.hp.com/service/ewarranty/warrantyInput.do"); 

     while (!loadFinished) 
     { 
      Thread.Sleep(100); 
      Application.DoEvents(); 
     } 

     webBrowser1.Document.GetElementById("productnumber").InnerText = dt.Rows[j][0].ToString(); 
     webBrowser1.Document.GetElementById("serialnumber1").InnerText = dt.Rows[j][1].ToString(); 

     HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("SELECT"); 
     foreach (HtmlElement elem in elems) 
     { 
      if (elem.Name.ToString() == "country") 
      { 
       elem.SetAttribute("value", "US"); 
      } 
     } 

     int countelement = 0; 
     HtmlElementCollection col = webBrowser1.Document.GetElementsByTagName("INPUT"); 
     foreach (HtmlElement element in col) 
     { 
      if (element.Name.ToString() == "") 
      { 
       if (countelement == 1) 
       { 
        element.InvokeMember("click"); 
        do 
        { 
         Application.DoEvents(); 
        } while (webBrowser1.IsBusy); 
       } 
       countelement++; 
      } 
     } 

     string output = ""; 
     int county = 0; 
     HtmlElementCollection elly = webBrowser1.Document.GetElementsByTagName("TABLE"); 
     foreach (HtmlElement el in elly) 
     { 
      if (county == 19) 
      { 
       string[] lines = el.InnerText.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 
       foreach (string line in lines) 
       { 
        if (line.IndexOf("Start Date") != -1) 
        { 
         output = line.ToString(); 
         dt.Rows[j][2] = output.Remove(0, 10); 
         break; 
        } 

       } 

      } 
      county++; 
     } 

    }