2016-04-28 2 views
0

Я надеюсь, что кто-то может мне помочь. У меня есть веб-сайт компании, на котором я пытаюсь перемещаться, поэтому, когда мне наконец удается добраться до места, где я должен быть, я могу автоматизировать завершение какой-либо формы.VBA IE automation - управляющий ребенок/новое окно

Я нахожусь в месте в коде, где ссылка «нажата» через код, и открывается новое окно. Мне нужно иметь возможность щелкнуть ссылку в новом окне, а затем переключить управление обратно в родительское окно.

Я видел несколько способов сделать это, но они не работают для меня, или, скорее всего, я не вставляю их в свой код правильно.

У меня есть метод оболочки, помещенный в мой код, и при его запуске нет ошибок, но это ничего не делает, и я не уверен, что элемент управления даже перемещается в дочернее окно.

Может ли кто-нибудь помочь?

Sub Fill_FormLog() 

Dim ie As InternetExplorer 
Dim URL As String 
Dim objElement As Object 
Dim objButton As Object 
Dim objLink As Object 
Dim objLink2 As Object 
Dim objShell As Object 

'Logs into website 
    Set ie = CreateObject("InternetExplorer.Application") 
    With ie 
    .Visible = True 
    .Navigate URL:="***parentwindowURL***" 
    Do Until .ReadyState = 4 
     DoEvents 
    Loop 
    Set mytextfield1 = .Document.all.Item("txtUserName") 
    mytextfield1.Value = "***username***" 
    Set mytextfield2 = .Document.all.Item("txtPassword") 
    mytextfield2.Value = "***password***" 
    ie.Document.getElementById("Submit").Click 
    While .Busy Or .ReadyState <> 4: DoEvents: Wend 
    End With 

'Opens the a link 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
ie.Navigate "***URLstillinparent***", , self 
End With 

'Opens the Profile menu 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
ie.Navigate "***anotherURLinparent***", , ["left"] 
End With 

'Opens the Profile search menu 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
ie.Navigate "***anotherURLinparent***", , ["mainParent"] 
End With 

'Copies the ID# from the Excel worksheet and pastes it to search in site 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:02")) 
Set objElement = .Document.frames("mainParent").Document.frames("main1").Document.forms("AgentIdentificationNumberSearch").Document.getElementById("IDN") 
objElement.Value = Sheets("Appointments").Range("a2").Value 
Set objButton = .Document.frames("mainParent").Document.frames("main1").Document.forms("AgentIdentificationNumberSearch").Document.getElementById("Search") 
objButton.Click 
End With 

'Opens view profile summary via child window 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:02")) 
Set objLink = .Document.frames("mainParent").Document.forms("AgentProfileList").Document.getElementById("grdProfile_r_0").Document.getElementsByTagName("a")(1) 
objLink.Click 
End With 

'Should move control to child window 
Application.Wait (Now + TimeValue("0:00:05")) 
Set objShell = CreateObject("Shell.Application") 
IE_count = objShell.Windows.Count 
For x = 0 To (IE_count - 1) 
    On Error Resume Next ' sometimes more web pages are counted than are open 
    my_url = objShell.Windows(x).LocationURL 
    my_title = objShell.Windows(x).Document.Title 

    If my_url  Like "***URLofChild/NewWindow***" Then 
    Set ie = objShell.Windows(x) 
    Exit For 
Else 
End If 
Next 

'Should click a link on the child window 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:02")) 
Set objLink2 = .Document.forms("form1").Document.getElementsByClassName("topHead").Document.getElementById("topLinks").Document.getElementsByTagName("a")(1) 
objLink2.Click 
End With 

'if I can get the section above to work, I need to return control to the parent window at this point 


End Sub 

ответ

0

Я нашел код на другой сайт, который работал для управления дочернего окна, и был в состоянии продолжить, но у меня был еще один вопрос, действительно дело, с которым сделал это ненужным. По крайней мере, я знаю, как это сделать сейчас. Код, который работал для меня, ниже.

Код должен быть в объекте вместо модуля для работы.

 Option Explicit 

Public WithEvents IE1 As InternetExplorer 
Public IE2 As InternetExplorer 


Private Sub Automation() 

Dim objElement As Object 
Dim objButton As Object 
Dim objLink As Object 
Dim objLink2 As Object 
Dim mytextfield1 As Object 
Dim mytextfield2 As Object 

Set IE1 = CreateObject("internetexplorer.application") 
Set IE2 = Nothing 

With IE1 
.navigate "***website url***" 
.Visible = True 'allows for viewing the web page 
While .Busy Or .readyState <> 4: DoEvents: Wend 
    Set mytextfield1 = .document.all.Item("txtUserName") 
    mytextfield1.Value = "***username***" 
    Set mytextfield2 = .document.all.Item("txtPassword") 
    mytextfield2.Value = "***password***" 
    While .Busy Or .readyState <> 4: DoEvents: Wend 
    IE1.document.getElementById("Submit").Click 
End With 

    ' loop until the page finishes loading 
Do While IE1.Busy: Loop 

'Opens another link 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
IE1.navigate "***url***" 
End With 

'Opens the menu 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
IE1.navigate "***URL in frame***", ["left"] 
End With 

'Opens the Profile search menu 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
IE1.navigate "***url in another frame***", , ["mainParent"] 
End With 

'Copies the ID# from the Excel worksheet and pastes it to search in site to search 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:03")) 
Set objElement = .document.frames("mainParent").document.frames("main1").document.forms("AgentIdentificationNumberSearch").document.getElementById("IDN") 
objElement.Value = Sheets("Appointments").Range("a2").Value 
Set objButton = .document.frames("mainParent").document.frames("main1").document.forms("AgentIdentificationNumberSearch").document.getElementById("Search") 
objButton.Click 
End With 

'Clicks "View Profile Summary" and opens new window 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:03")) 
Set objLink = IE1.document.frames("mainParent").document.forms("AgentProfileList").document.getElementById("grdProfile_r_0").document.getElementsByTagName("a")(1) 
objLink.Click 
End With 

'Ensure new window has been created (if the window does not generate, this will go on forever) 
Do While IE2 Is Nothing: Loop 
Do While IE2.Busy: Loop 

'Click first link in the new window 
With IE2 
While .Busy Or .readyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:03")) 
Set objLink2 = IE2.document.forms("form1").document.getElementsByTagName("a")(2) 
objLink2.Click 
End With 

Set IE2 = Nothing 

End Sub 

________________________ 

Private Sub IE1_NewWindow2(ppDisp As Object, Cancel As Boolean) 
    Set IE2 = New InternetExplorer 
    Set ppDisp = IE2.Application 
    Debug.Print "NewWindow2" 
End Sub 
Смежные вопросы