Reputation: 61
I'm hoping someone can help me out. I have a company website I am trying to navigate through so when I finally manage to get to the place I need to be I can automate some form completion.
I am to a place in the code where a link is "clicked" via the code, and a new window opens up. I need to be able to click a link on the new window, and then switch control back to the parent window.
I've seen a few methods of doing this, but they are not working for me, or more likely I am not inserting them into my code correctly.
I have the shell method placed into my code, and there are no errors thrown when this is run, but it isn't doing anything, and I am not sure if the control is even being moved to the child window.
Can anyone assist?
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
Upvotes: 1
Views: 5928
Reputation: 61
I found some code on another site that worked to control the child window, and was able to proceed, but I had another issue do deal with which made this unnecessary. At least I know how to do it now. The code that worked for me is below.
The code must be in an object instead of a module to work.
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
Upvotes: 1