The new Chrome and Edge functions in Macro Scheduler 15 make it possible to locate frames and iframes and then manipulate elements within them.
Switching Frames
The ChromeSwitchFrame and EdgeSwitchFrame functions allow you to specify a frame or iframe element, by index or element reference, to switch the “browsing context” to.
What this means is that any subsequent interactions will take place against elements within that frame. So a subsequent ChromeFindElements call will attempt to locate the specific element within the frame, rather than the parent page, and ChromeElementAction will act against the given element within that frame.
//Find the frame using xpath ChromeFindElements>sessionID,xpath,//iframe[@src='/contact-form/formpage.html'],elements //switch browsing context to this frame ChromeSwitchFrame>session_id,element,elements_1,res
If xpath doesn’t mean anything to you see my recent post Using Macro Scheduler 15’s Chrome Functions which includes an explanation of using Chrome’s Developer Tools to identify elements.
At some point you may need to switch the browsing context back to the parent frame. To do this you call ChromeSwitchFrame/EdgeSwitchFrame again with a null index. Subsequent calls to the Chrome/Edge functions will then act against the parent frame.
ChromeSwitchFrame>session_id,index,null,res
Traversing Frames
Since each time you switch frames you change the context to that frame, calling ChromeSwitchFrame or EdgeSwitchFrame again (on a valid frame element within) will switch the context down another level.
//Find the frame using xpath ChromeFindElements>sessionID,xpath,//iframe[@src='/contact-form/formpage.html'],elements ChromeSwitchFrame>session_id,element,elements_1,res //Switch to the next frame down *within the current frame* ChromeSwitchFrame>session_id,index,0,res
Differences between Edge and Chrome
The Edge and Chrome functions work in the same way and are almost identical. There’s one major difference when it comes to switching frames. When specifying an element (rather than index) ChromeSwitchFrame requires the element ID, whereas EdgeSwitchFrame requires the full element object. As well as an array of element IDs, EdgeFindElements returns a second array of the objects:
EdgeFindElements>sessionID,xpath,//iframe[@src='/contact-form/formpage.html'],FrameElements
This returns two arrays prefixed with the name passed as the return var (TheElements): FrameElements_1 … FrameElements_n and FrameElements_objects_1 … FrameElements_objects_n. For EdgeSwitchFrame use the second _objects array:
//switch to the frame EdgeSwitchFrame>session_id,element,FrameElements_objects_1,res
More Help
View the Chrome Functions and Edge Functions topics in the Macro Scheduler Manual.
Full Example:
Let>CHROMEDRIVER_EXE=c:\chromedriver.exe //start a Chrome session ChromeStart>session_id //navigate to google.com ChromeNavigate>session_id,url,https://www.mjtnet.com/contact.htm //Find the frame ChromeFindElements>sessionID,xpath,//iframe[@src='/contact-form/formpage.html'],elements //switch to the first frame (the one with the fields) ChromeSwitchFrame>session_id,element,elements_1,res //now anything we do is inside that frame so we should be able to get the name field and enter something ChromeFindElements>session_id,id,name,inputs ChromeSetElementValue>session_id,inputs_1,john doe //Switch context back to parent ChromeSwitchFrame>session_id,index,null,res