最近答应老总写一个网易邮箱注册器,代码如下,后天就要交工了,遇到了难题,请大家指点一二。
现在的情况是:先点击Command1页面加载之后,再点击Command2才可以实现我想要的结果,我现在想实现点击Command1之后就可以得到我想要的结果。(希望有热心的朋友可以帮我个忙,form当中就一个 WebBrowser1对像,和两个按钮,麻烦各位了)
Private Sub Command1_Click()
    WebBrowser1.Navigate "http://login.sina.com.cn/signup/signup.php?entry=freemail"
End Sub
Private Sub Command2_Click()
Set doc = WebBrowser1.Document
    Set ss = doc.getElementById("cnname")
    ss.Click
End Sub
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, url As Variant)
    If WebBrowser1.Document.ReadyState = "complete" Then
    Title = WebBrowser1.LocationName
    Set doc = WebBrowser1.Document
    If Title = "欢迎注册新浪免费邮箱" Then
            doc.getElementById("emailname").focus
            doc.getElementById("emailname").Value = "renqinng333"
            doc.getElementById("emailname").blur
            'waittime(3) '我想由于js函数不可能反应太快这里加入了延迟函数waittime(3)也不行
            Set ss = doc.getElementById("cnname")
            ss.Click
      End If
   End If
End Sub
Public Sub waittime(delay As Single)
  Dim starttime As Single
  starttime = Timer
  Do Until (Timer - starttime) > delay
  DoEvents
  Loop
End Sub

解决方案 »

  1.   

     - -# 那不是网易邮箱吧。三石哥表示压力很大啊代码测试没问题cnname的标签是用户名已经注册的情况下出现的推荐选择的用户名中后缀为@sina.cn的那个用户名
      

  2.   

    "网易邮箱注册器"添加一个定时器Timer1,然后把Interval设置为想要等待的时间,比如3秒.然后:            'waittime(3) '我想由于js函数不可能反应太快这里加入了延迟函数waittime(3)也不行
                Set ss = doc.getElementById("cnname")
                ss.Click
    这里的代码改改:timer1.enabled=true再在定时器事件里:private sub timer1_timer()
        timer1.enabled=false    call command2_click
    end sub
      

  3.   

    Private Sub Command1_Click()
        WebBrowser1.Navigate "http://login.sina.com.cn/signup/signup.php?entry=freemail"
        Command2_Click
    End Sub
      

  4.   

    Private Sub Command1_Click()
        WebBrowser1.Navigate "http://login.sina.com.cn/signup/signup.php?entry=freemail"
        Command2_Click
    End Sub
      

  5.   

    Private Sub Command1_Click()
        WebBrowser1.Navigate "http://login.sina.com.cn/signup/signup.php?entry=freemail"
        DoSTH
    End Sub
    Private Sub DoSTH()
    Set doc = WebBrowser1.Document
        Set ss = doc.getElementById("cnname")
        ss.Click
    End Sub
    Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, url As Variant)
        If WebBrowser1.Document.ReadyState = "complete" Then
        Title = WebBrowser1.LocationName
        Set doc = WebBrowser1.Document
        If Title = "欢迎注册新浪免费邮箱" Then
                doc.getElementById("emailname").focus
                doc.getElementById("emailname").Value = "renqinng333"
                doc.getElementById("emailname").blur
                'waittime(3) '我想由于js函数不可能反应太快这里加入了延迟函数waittime(3)也不行
                Set ss = doc.getElementById("cnname")
                ss.Click
          End If
       End If
    End Sub
    Public Sub waittime(delay As Single)
      Dim starttime As Single
      starttime = Timer
      Do Until (Timer - starttime) > delay
      DoEvents
      Loop
    End Sub
      

  6.   


    Option Explicit
    Dim bComplete As Boolean
    Dim WithEvents DivTemp As HTMLDivElement
    Private Sub Command1_Click()
        WebBrowser1.Navigate "http://login.sina.com.cn/signup/signup.php?entry=freemail"
        bComplete = False
    End SubPrivate Sub DivTemp_onresize()
        Call WebBrowser1.Document.getElementById("cnname").Click
    End SubPrivate Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, url As Variant)
        Dim doc As HTMLDDElement
        If WebBrowser1.Document.ReadyState = "complete" Then
            Set doc = WebBrowser1.Document
            If WebBrowser1.LocationName = "欢迎注册新浪免费邮箱" Then
                doc.getElementById("emailname").Value = "renqinng333"
                Set DivTemp = doc.getElementById("tip_top")
            End If
       End If
    End Sub
      

  7.   

    引用Microsoft HTML Object LibrarySet doc = WebBrowser1.Document
    这个doc也是引用这个,定义是Dim doc As HTMLDDElement你的代码没有定义doc的类型,就把WebBrowser1.Document的类型赋给它了,
    其实就是HTMLDDElement如果你在代码头定义了Option Explicit这些错误就都看得见了
    这些我以为你知道的,只是简写了
      

  8.   

    高手啊。我想知道为什么把它的style属性拿了后就会触发resize事件。我尝试了onresizeend、onactivate、onbeforeupdate等事件基本都没用,很奇怪。
      

  9.   


    zzhgb
    你的代码学习了,有几个问题再请教下
    1:WebBrowser1.Document.ReadyState = "complete" 这句在多框架语句中是不是等价与pdisp is webbrowser1.object  ??2: 既然已经有了complete的判断,为什么你后面要加If WebBrowser1.LocationName = "欢迎注册新浪免费邮箱"  这句呢???目的是为了排除什么情况??3:DivTemp_onresize 这个事件是不是必须引用Microsoft HTML Object Library才可以使用的?
    怎么判断这个ID元素有那些事件呢?我实验了下用其他的ID就没法用这个事件
      

  10.   

    我也在学习这个。我先回答下看看
    第一个应该是差不多的意思吧。其中ReadyState ="complete" 和ReadyState = 4应该是一个意思。
    第二个可能是多余的,可能是为了防止网页哪天突然修改了标题吧。
    第三个呢是必须要引用的了,实际引用的文件是mshtml.tlb。这些都不是vb本身的。他声明的是 As HTMLDivElement,说明只是div的事件列出来。其他的还有input、button、link等等element,支持的事件可能也有所差异。查了下dhtml手册,所有事件如下:
    onabort 当用户中断下载图像时触发。 
    onactivate 当对象设置为活动元素时触发。 
    onafterprint 对象所关联的文档打印或打印预览后立即在对象上触发。 
    onafterupdate 当成功更新数据源对象中的关联对象后在数据绑定对象上触发。 
    onbeforeactivate 对象要被设置为当前元素前立即触发。 
    onbeforecopy 当选中区复制到系统剪贴板之前在源对象触发。 
    onbeforecut 当选中区从文档中删除之前在源对象触发。 
    onbeforedeactivate 在 activeElement 从当前对象变为父文档其它对象之前立即触发。 
    onbeforeeditfocus 在包含于可编辑元素内的对象进入用户界面激活状态前或可编辑容器变成控件选中区前触发。 
    onbeforepaste 在选中区从系统剪贴板粘贴到文档前在目标对象上触发。 
    onbeforeprint 对象的关联文档打印或打印预览前在对象上触发。 
    onbeforeunload 在页面将要被卸载前触发。 
    onbeforeupdate 当成功更新数据源对象中的关联对象前在数据绑定对象上触发。 
    onblur 在对象失去输入焦点时触发。 
    onbounce 当 marquee 对象的 behavior 属性设置为“alternate”且字幕的内容到达窗口一边时触发。 
    oncellchange 在数据供应者中的数据变更时触发。 
    onchange 当对象或选中区的内容改变时触发。 
    onclick 在用户用鼠标左键单击对象时触发。 
    oncontextmenu 在用户使用鼠标右键单击客户区打开上下文菜单时触发。 
    oncontrolselect 当用户将要对该对象制作一个控件选中区时触发。 
    oncopy 当用户复制对象或选中区,将其添加到系统剪贴板上时在源元素上触发。 
    oncut 当对象或选中区从文档中删除并添加到系统剪贴板上时在源元素上触发。 
    ondataavailable 每当异步传输数据的数据源对象的数据到达时触发。 
    ondatasetchanged 当数据源对象对应的数据集发生变更时触发。 
    ondatasetcomplete 触发就表明数据源对象所有数据都可用。 
    ondblclick 当用户双击对象时触发。 
    ondeactivate 当 activeElement 从当前对象变为父文档其它对象时触发。 
    ondrag 当进行拖曳操作时在源对象上持续触发。 
    ondragend 当用户在拖曳操作结束后释放鼠标时在源对象上触发。 
    ondragenter 当用户拖曳对象到一个合法拖曳目标时在目标元素上触发。 
    ondragleave 当用户在拖曳操作过程中将鼠标移出合法拖曳目标时在目标对象上触发。 
    ondragover 当用户拖曳对象划过合法拖曳目标时持续在目标元素上触发。 
    ondragstart 当用户开始拖曳文本选中区或选中对象时在源对象上触发。 
    ondrop 当鼠标按钮在拖曳操作过程中释放时在目标对象上触发。 
    onerror 当对象装载过程中发生错误时触发。 
    onerrorupdate 更新数据源对象中的关联数据出错时在数据绑定对象上触发。 
    onfilterchange 当可视滤镜更改状态或完成转换时触发。 
    onfinish 当字幕循环完成后触发。 
    onfocus 当对象获得焦点时触发。 
    onfocusin 当元素将要被设置为焦点之前触发。 
    onfocusout 在移动焦点到其它元素之后立即触发于当前拥有焦点的元素上触发。 
    onhelp 当用户在浏览器为当前窗口时按 F1 键时触发。 
    onkeydown 当用户按下键盘按键时触发。 
    onkeypress 当用户按下字面键时触发。 
    onkeyup 当用户释放键盘按键时触发。 
    onlayoutcomplete 当打印或打印预览版面处理完成用来自于源文档的内容填充当前 LayoutRect 对象时触发。 
    onload 在浏览器完成对象的装载后立即触发。 
    onlosecapture 当对象失去鼠标捕捉时触发。 
    onmousedown 当用户用任何鼠标按钮单击对象时触发。 
    onmouseenter 当用户将鼠标指针移动到对象内时触发。 
    onmouseleave 当用户将鼠标指针移出对象边界时触发。 
    onmousemove 当用户将鼠标划过对象时触发。 
    onmouseout 当用户将鼠标指针移出对象边界时触发。 
    onmouseover 当用户将鼠标指针移动到对象内时触发。 
    onmouseup 当用户在鼠标位于对象之上时释放鼠标按钮时触发。 
    onmousewheel 当鼠标滚轮按钮旋转时触发。 
    onmove 当对象移动时触发。 
    onmoveend 当对象停止移动时触发。 
    onmovestart 当对象开始移动时触发。 
    onpaste 当用户粘贴数据以便从系统剪贴板向文档传送数据时在目标对象上触发。 
    onpropertychange 当在对象上发生对象上发生属性更改时触发。 
    onreadystatechange 当对象状态变更时触发。 
    onreset 当用户重置表单时触发。 
    onresize 当对象的大小将要改变时触发。 
    onresizeend 当用户更改完控件选中区中对象的尺寸时触发。 
    onresizestart 当用户开始更改控件选中区中对象的尺寸时触发。 
    onrowenter 触发就表明当前行已经在数据源中更改,对象上有可用的新数据值。 
    onrowexit 当数据源控件更改对象当前行前触发。 
    onrowsdelete 当行将要从记录集中被删除时触发。 
    onrowsinserted 当在当前记录集中插入新行后触发。 
    onscroll 当用户滚动对象的滚动条时触发。 
    onselect 当当前选中区改变时触发。 
    onselectionchange 当文档的选中状态改变时触发。 
    onselectstart 对象将要被选中时触发。 
    onstart 在 marquee 对象的每次循环开始时触发。 
    onstop 当用户单击停止按钮或离开 Web 页面时触发。 
    onsubmit 当表单将要被提交时触发。 
    onunload 在对象卸载前立即触发。 
      

  11.   

    哇,谢谢啦,有这么多啊,我一个都不知道呢onresize 当对象的大小将要改变时触发。他的代码里判断的onresize 我观察了,只触发了一次,是当tip_top从隐藏到出现时候触发的吧?
    那么为什么click后tip_top又消失了却没有再次触发onresize呢?还有我觉得这个"当对象的大小将要改变时触发",应该说成"当对象的大小改变时触发"吧,什么叫“将要”哦,那就是在改变前触发,如果是这样,那么根本还不能click,怎么可能成功
      

  12.   

    刚才又发现个纳闷的事Dim WithEvents DivTemp As HTMLDivElement    '引用Microsoft HTML Object LibraryPrivate Sub DivTemp_onresize()
        Me.Caption = Me.Caption & "/"
        Call WebBrowser1.document.getElementById("typecn").Click
    End SubPrivate Sub Form_Load()
        Me.Show
        WebBrowser1.navigate "http://login.sina.com.cn/signup/signup.php?entry=freemail"
    End SubPrivate Sub Command1_Click()
            Dim doc As HTMLDDElement
            Set doc = WebBrowser1.document
            doc.getElementById("emailname").Value = "renxxxqinng333"
            '''''doc.getElementById("checkName").Click
            Set DivTemp = doc.getElementById("tip_top")
    End Sub如果人工等加载完点command1_click的话,不加doc.getElementById("checkName").Click
    就是那个“检测”按钮就没法点选邮件名,这个是为什么?为什么放到document_complete事件里就不要这一句呢
      

  13.   

    在输入用户名的时候,网页有程序判断并加载提供推荐的用户名,
    你肯定要等这个加载信息的程序运行后才能去点哪个,用timmer是一样的(加个全局变量作标记),
    至于为什么要用resize要看网站的代码怎么写了,这个只有尝试了,一般在加载的时候会触发resize事件
    不明白下边的是指什么
      

  14.   


    哦,是我搞错了,我输入名字的时候没把鼠标移动出来,所以下面的框没出来对了,为什么onresize事件只触发了一次啊?下弹框消失的时候为什么不触发?
      

  15.   


    Dim WithEvents x As HTMLDivElementPrivate Sub Command1_Click()   '点前手动点下vbgood右上角的登陆,等待弹出登陆浮动窗口
    Dim doc As HTMLDDElement
    Set doc = ie1.Document
    Set x = ie1.Document.getElementsByTagName("DIV")(4)
    End SubPrivate Sub Form_Load()
    Me.Show
    ie1.Navigate "http://www.vbgood.com/vbf.good"
    End SubPrivate Sub x_onresize()
    Me.Caption = Me.Caption & "/"
    End Sub结果测试失败,没有检测到浮动登陆窗口的弹出和关闭,请问错在哪