using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Net; using mshtml; using System.Threading; namespace WindowsFormsApplication16 { public partial class Form1 : Form { private IHTMLTxtRange searchRange = null;
首先你确定第二页里的next按钮名称和第一页相同? if (elem.GetAttribute("classname")== "icon-btn-next-2") 这不是跳转到第二页了么,每次都跳转到同一页?然后你timer_tick执行完毕,要将事件解除.否则下次又给它绑定了一个事件,就是2个timer在跑了.
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using mshtml;
using System.Threading;
namespace WindowsFormsApplication16
{
public partial class Form1 : Form
{
private IHTMLTxtRange searchRange = null;
public Form1()
{
InitializeComponent();
webBrowser1.Navigate("http://www.taobao.com");
}
private void button1_Click(object sender, EventArgs e)
{
string a;
a = textBox1.Text;
HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("INPUT");
foreach (HtmlElement elem in elems)
{
if (elem.GetAttribute("name").ToString() == "q")
elem.SetAttribute("value", a);
} HtmlElementCollection elems1 = webBrowser1.Document.GetElementsByTagName("BUTTON");
foreach (HtmlElement elem in elems1)
{
if (elem.GetAttribute("type").ToString() == "submit")
elem.InvokeMember("click");
}
yanshi();
}
void yanshi()
{
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 10000;
timer1.Enabled = true;
} void timer1_Tick(object sender, EventArgs e)
{
sousuo(); } private void sousuo()
{
//Document的DomDocument属性,就是该对象内部的COM对象。 IHTMLDocument2 document = (IHTMLDocument2)webBrowser1.Document.DomDocument;
string keyword = txtKeyword.Text.Trim();
if (keyword == "")
return; // IE的查找逻辑就是,如果有选区,就从当前选区开头+1字符处开始查找;没有的话就从页面最初开始查找。
// 这个逻辑其实是有点不大恰当的,我们这里不用管,和IE一致即可。
if (document.selection.type.ToLower() != "none")
{
searchRange = (IHTMLTxtRange)document.selection.createRange();
searchRange.collapse(true);
searchRange.moveStart("character", 1);
}
else
{
IHTMLBodyElement body = (IHTMLBodyElement)document.body;
searchRange = (IHTMLTxtRange)body.createTextRange();
} // 如果找到了,就选取(高亮显示)该关键字;否则弹出消息。
if (searchRange.findText(keyword, 1, 0))
{
searchRange.select();
MessageBox.Show("zhaodao");
}
else
{
HtmlElementCollection elems1 = webBrowser1.Document.GetElementsByTagName("SPAN");
foreach (HtmlElement elem in elems1)
{
if (elem.GetAttribute("classname")== "icon-btn-next-2")
elem.InvokeMember("click");
yanshi();
}
}
}
}}
button是打开淘宝搜索一个宝贝,然后去找那个掌柜。我弄上程序界面。
现在可以点那个下一页,但是到了第二页没反应了。也不知道有没有在第二页去搜索这个掌柜。
就是希望点下一页,然后看看有没有这个掌柜,没有点下一页,然后间隔10面,再看看有没有这个掌柜,没有就再点下一页。
你本来是想等10秒再点,但是你把点击的代码放到了sousou的else里
结果刚搜了一下,没搜到,没等搜完就直接点下一页了.
然后隔了10秒又执行一次sousou,又是没搜完就点了.
if (elem.GetAttribute("classname")== "icon-btn-next-2")
这不是跳转到第二页了么,每次都跳转到同一页?然后你timer_tick执行完毕,要将事件解除.否则下次又给它绑定了一个事件,就是2个timer在跑了.
怎么把timer1解除,并且再开启timer1.谢谢。
直接调那个方法就可以。
timer1.Interval = 10000;
timer1.Enabled = true;事件只在一开始绑定一次,后面控制 timer1.Enabled就行了
不要老去绑定事件解除事件,怪麻烦的.
else
{
HtmlElementCollection elems1 = webBrowser1.Document.GetElementsByTagName("SPAN");
foreach (HtmlElement elem in elems1)
{
if (elem.GetAttribute("classname")== "icon-btn-next-2")
elem.InvokeMember("click");
timer1.Enabled = false;
yanshi();
}
这样吗
我在猪八戒发了一个任务,初步200元。
http://task.zhubajie.com/4266955/
谢谢大家。
要调用一个函数的时候,总是希望能够安全返回,所以调用的时候需要将返回地址压入堆栈,在返回的时候用,
如果直接就GOTO到内部,那在返回的时候就知道往哪儿去了.