Reputation: 22440
I've written a script in VBA in combination with IE to fill two input fields to login to a webpage.
When I try to execute my script, it throws Access is denied
error because of the iframe
within which the input fields are. How can I fill the two input fields with my credentials?
This is my try so far:
Sub LogIn()
Const Url = "replace with above link"
Dim IE As New InternetExplorer, HTML As HTMLDocument
Dim frm As Object, post As Object
With IE
.Visible = True
.navigate Url
While .Busy Or .readyState < 4: DoEvents: Wend
Set HTML = .document
End With
Application.Wait Now + TimeValue("00:00:05")
Set frm = HTML.querySelector("iframe[name='disneyid-iframe']").contentWindow.document
Set post = frm.querySelector("input[placeholder='Username or Email Address']")
post.Value = "[email protected]"
End Sub
You can try with any input details. All I need to know is how can I fill the two boxes.
Html elements connected to iframe
content:
<iframe id="disneyid-secure-responder" name="disneyid-secure-responder" src="https://www.espn.com/disneyid/responder/index.html?clientId=ESPN-ONESITE.WEB-PROD&scheme=http&postMessageOrigin=http%3A%2F%2Ffantasy.espn.com%2Fbasketball%2Fteam%3FleagueId%3D24874190%26teamId%3D1%26statSplit%3DcurrSeason&cookieDomain=espn.com&config=PROD&logLevel=INFO&topHost=fantasy.espn.com&ageBand=ADULT&countryCode=CA&langPref=en-US&cssOverride=https%3A%2F%2Fsecure.espncdn.com%2Fcombiner%2Fc%3Fcss%3Ddisneyid%2Fcore.css%2Cdisneyid%2Ffantasy.css&responderPage=https%3A%2F%2Fwww.espn.com%2Fdisneyid%2Fresponder%2Findex.html&buildId=165f40c7564" style="display: none;"></iframe>
Upvotes: 1
Views: 165
Reputation: 11335
Try to refer example below may solve your issue.
Main HTML Page Code (demo51.html):
<!DOCTYPE html>
<html>
<body>
<H2>This is main page...</h2><br>
<iframe src="C:\Users\Administrator\Desktop\demo52.html" id="ifrm" height="300px" width="300px">
<p>Your browser does not support iframes.</p>
</iframe>
</body>
</html>
Page which will be displayed with in Main page Iframe (demo52.html).
<!DOCTYPE html>
<html>
<body>
<h2> Sample Page</h2><br>
Name: <input type="text" id="txt_name" value=""><br><br>
Age:    <input type="text" id="txt_age" value=""><br><br>
            <input type="submit" value="submit">
</body>
</html>
VBA Code:
Public Sub demo()
Dim baseURL As String
Dim IE As InternetExplorer
Dim HTMLdoc As HTMLDocument
Dim workFrame As HTMLIFrame
Dim acctInput As HTMLInputElement
baseURL = "C:\Users\Administrator\Desktop\demo51.html"
Set IE = New InternetExplorer
With IE
.Visible = True
.Navigate baseURL
While .Busy Or .ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend
Set workFrame = .Document.getElementById("ifrm")
Set HTMLdoc = workFrame.contentWindow.Document
End With
Set acctInput = HTMLdoc.getElementById("txt_name")
acctInput.Focus
acctInput.Value = "abcde"
Set acctInput = HTMLdoc.getElementById("txt_age")
acctInput.Focus
acctInput.Value = "25"
End Sub
Output in Internet Explorer:
Note: Try to add reference to library below in VBA Editor.
(1) Microsoft HTML Object Library.
(2) Microsoft Internet controls.
Try to change the URL in code as per your own requirement.
Upvotes: 1
Reputation: 84465
As mentioned in the other answer, the iframe src
is in a different domain and same domain policy effectively rules out IE for > version 8 in this case. Whilst messing with security settings to attempt to bypass this is a bad idea see this for reading.
This is easy enough with selenium basic for VBA using Chrome. You additionally need to loop until login details can be entered. I add a timeout to prevent an infinite loop.
After installing selenium you need to go VBE > Tools > References and add a reference to Selenium Type Library.
Option Explicit
Public Sub Login()
Dim d As WebDriver, ele As WebElement, t As Date
Const MAX_WAIT_SEC As Long = 5
Const url = "http://fantasy.espn.com/basketball/team?leagueId=24874190&teamId=1&statSplit=currSeason"
Set d = New ChromeDriver
With d
.Start "Chrome"
.get url
t = Timer
Do
DoEvents
On Error Resume Next
.SwitchToFrame .FindElementById("disneyid-iframe")
Set ele = .FindElementByCss("[type=email]")
On Error GoTo 0
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While Not ele.IsDisplayed
If ele Is Nothing Then Exit Sub
ele.SendKeys "[email protected]"
.FindElementByCss("[type=password]").SendKeys "password"
.FindElementByCss("[type=submit]").Click
Stop '<== Delete me later
'Other code
.Quit
End With
End Sub
Upvotes: 1
Reputation: 1
You cannot change things in an iframe on another domain due to security limitations. http://en.wikipedia.org/wiki/Same_origin_policy
Upvotes: 0