我目前在嘗試向網站 "www.skyvector.com "插入文本時遇到了麻煩。我一直試圖在 "路線 "欄位中粘貼一些文本,該欄位出現在左上方的一個灰色框中(通常是在點擊 "飛行計劃 "之后)。
這是我目前掌握的代碼,它對其他網站有效,但奇怪的是對SkyVector無效:
這是我目前掌握的代碼。
Sub test1()
Dim IEAs Object
Dim doc As HTMLDocument
Set IE = CreateObject("InternetExplorer.Application"/span>)
IE.Visible = True[/span]。
IE.navigate "http://www.skyvector.com/"。
Do While IE.Busy
Application.Wait DateAdd("s"/span>, 1, Now)
回圈。
Set doc = IE.document
doc.getElementsById("sv_planEditField").Value = "test"。
結束 Sub
不幸的是,每當這一行被設定為運行時,就會出現一個錯誤:
doc.getElementsById("sv_planEditField"/span>).Value = "test"
錯誤是 "運行時錯誤'438'。物件不支持此屬性或方法"。
我一直在絞盡腦汁尋找解決方案,我在這里也找不到任何解決方案,特別是對于像SkyVector這樣的網站。我不太清楚這和其他網站之間有什么區別。非常感謝您的時間!
uj5u.com熱心網友回復:
元素sv_planEditField不是一個普通的文本框。在你的瀏覽器中打開它,用開發者工具(按F12)檢查它。在填充它之前和之后都要這樣做。你會注意到,這與標準輸入有很大的不同。要么重新創建已填充控制元件的html結構,要么重新創建表單提交。請看createElement和appendChild以了解更多資訊。
uj5u.com熱心網友回復:
首先,方法的名稱不是getElementsById()。它的名字是getElementById(),沒有復數的s。原因是,一個ID在一個html檔案中只能使用一次,它是唯一的。
但是如果你使用了正確的名字,你會收到沒有物件的錯誤。這里的原因是,沒有一個ID名為sv_planEditField的元素。
那么你能做什么呢?你可以使用另一個名為getElementsByClassName()的方法,因為有關的html行是
< input autocomplete="false" spellcheck="false" class="sv_search" automatic correct="off">
方法getElementsByClassName()建立了一個節點集合。因此它使用s表示復數。開發者可以有多少個具有相同類名的元素。你可以通過它的索引獲得一個特定的元素,就像你在陣列中使用它一樣。clss名稱sv_search在檔案中只使用一次。一個節點集合的第一個索引總是0。所以你必須使用下面這行vba代碼,而不是你的代碼:
doc.getElementsByClassName("sv_search")(0).Value = "test"
編輯
在再次閱讀了你的問題并理解了它之后;-),根據Sam的回答,這里是你可以解決你的問題的方法。你需要的是一個新的文本節點和(我認為)觸發正確的事件,使輸入在頁面上發揮作用。用原始資料試試吧。Sub test1()
Dim IEAs Object
Dim textToEnter As Object
Dim nodeToAppendTextAs Object
Dim nodeText As Object
Set IE = CreateObject("InternetExplorer.Application"/span>)
IE.Visible = True[/span]。
IE.navigate "http://www.skyvector.com/"。
Do While IE.Busy
Application.Wait DateAdd("s"/span>, 1, Now)
回圈。
'打開覆寫層以輸入資料。
IE.document.getElementsByClassName("sv_topbarlink")(0) .Click
'點擊文本框以隱藏幫助文本并放置游標。
IE.document.getElementsByClassName("svfpl_helpmessage")(0) .Click
'創建一個屬于檔案的文本節點。
Set textToEnter = IE.document.createTextNode("Test"/span>)
'獲得你想追加新文本節點的節點。
Set nodeToAppendText = IE.document.getElementById("sv_planEditField"/span>)
'附加新的文本節點。
Set nodeText = nodeToAppendText.appendChild(textToEnter)
'不確定是否有必要觸發一個事件。
'但有兩個事件的問題:。
' 第一個是輸入。
' 第二個是按鍵。
'你必須試試它是如何作業的。
Call TriggerEvent(IE.document, nodeToAppendText, "input" )
End Sub
如果需要的話,使用這個方法來觸發任何事件:
Private Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As String)
Dim theEvent As Object.
htmlElementWithEvent.Focus
Set theEvent = htmlDocument.createEvent("HTMLEvents"/span>)
theEvent.initEvent eventType, True, False。
htmlElementWithEvent.dispatchEvent theEvent
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/320193.html
標籤:
