2016-07-05 7 views
0

Ich habe Probleme beim Laden von Text in ein Suchfeld in IE mit IE.document.getElementbyID Ich bin der Code, den ich bisher verwende. Ich bin mir sicher, dass mir hier etwas fehlt. Dies ist ein Update des iframe-Code Ich bin hier einschließlichLaufzeitfehler '424': Objekt erforderlich IE.Document.GetElementById Textfeld in iframe

<iframe tabindex="-1" id="WorkdayApp" src="javascript:""" style="left: -1000px; top: -1000px; width: 0px; height: 0px; border-top-color: currentColor; border-right-color: currentColor; border-bottom-color: currentColor; border-left-color: currentColor; border-top-width: medium; border-right-width: medium; border-bottom-width: medium; border-left-width: medium; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; position: absolute;"> 

<input class="gwt-TextBox GPNS02MDDGJ" aria-label="Expanded, multiSelectPrompt, 0 items selected, Use up and down arrows to select. or Type in a search" type="text" placeholder="search" data-automation-id="searchBox"/> 

"

Sub workdayrep() 

'******************************* 
Dim iframe As Object 
Dim textbox As Object 
'******************************* 
Dim IE As InternetExplorer 
Set IE = New InternetExplorer 
Set iframe = IE.document.getElementById("WorkdayApp") 
Set textbox = iframe.contentWindow.document.getElementById("searchBox") 
IE.Visible = True 


IE.navigate "https://wd.workday.com/142.htmld" 

Application.StatusBar = "Page Loading" 

'Do While IE.Busy 
' Application.Wait DateAdd("s", 1, Now) 
' Loop 
Application.Wait Now + TimeValue("00:00:10") 
textbox.Value = "TEST" 

' Application.StatusBar = "Check" 
End Sub 
+1

, während ich es nicht testen kann, schlage ich vor, noch Sie 'Während IE.Busy Oder IE.ReadyState <> 4: DoEvents: Wend' statt' Anwendung. Wait "... auch, bist du sicher" IE.document.getElementById ("searchBox") 'gibt nur ein Objekt zurück? Stoppen Sie einfach Ihren Code vor Ihrer 'getElementById' über' stop' oder einen Haltepunkt und setzen Sie Ihre "watches" direkt 'IE.document.getElementById (" searchBox ")' und dann überprüfen Sie, was es zurückgibt ... ich einfach nicht denke, dass Sie direkt über '.Value' darauf zugreifen können. –

+0

Ich habe mir nur den Code der Site angeschaut, den ich versuche den Text einzugeben, es ist wie in einem Iframe.

+0

Manchmal IE Automatisierung in VBA kann ein bisschen seltsam sein. Sie können versuchen, Ihren Suchwert als String 'Dim SV as String'' SV = "TEST" 'zu definieren und dann direkt auf IE.document.getElementById (" searchBox ") zu verweisen. Value = SV' geben Sie einen Versuch, I Ich musste viel in meinem letzten Web-Scraping-Projekt tun. –

Antwort

1

Das Objekt Sie versuchen, sich zu fangen keine ID Attribut haben, hat es eine "data-automation-id" Attribut.

<input class="gwt-TextBox GPNS02MDDGJ" aria-label="Expanded, multiSelectPrompt, 0 items selected, Use up and down arrows to select. or Type in a search" type="text" placeholder="search" data-automation-id="searchBox"/> 

Als solche getElementByID wird immer Nothing zurückkehren (es sei denn, es mit dieser ID ein anderes Element, das es offensichtlich ly ist nicht in diesem Fall!). Sie benötigen eine Brute-Force-Schleife über getElementsByClassName("gwt-TextBox GPNS02MDDGJ"), z. so etwas wie dieses (ungetestet):

Dim itm 
For each itm in iFrame.contentWindow.document.getElementsByClassName("gwt-TextBox GPNS02MDDGJ") 
    If itm.getAttribute("data-automation-id", 2) = "searchBox" Then 
     itm.setAttribte("data-automation-id", "test") 
     Exit For 
    End If 
Next 
+0

Ja, ich habe versucht, die ElementsByClassName, aber dies würde nur mit einem Laufzeitfehler 438 "Objekt unterstützt diese Eigenschaft oder Methode nicht". –

+0

Siehe [this] (http://stackoverflow.com/questions/7410949/javascript-document-getelementsbyclassname-compatibility-with-ie) mögliche Problemumgehung für ältere Versionen von IE, die diese Methode nicht unterstützen. –

+0

Siehe auch [diese ähnliche Antwort] (http://stackoverflow.com/questions/23476502/getelementsbyclassname-open-ie-vs-msxml2-methods) (von mir), die möglicherweise einfacher zu implementieren sind. –

Verwandte Themen