无法将文本从 Excel 复制到网站,显示 运行-time 错误

Unable to copy text from Excel to website, showing Run-time error

我目前在尝试将文本插入网站“www.skyvector.com”时遇到问题。我一直在尝试在“路线”字段中粘贴一些文本,该字段出现在左上角的灰色框中(通常在单击 'Flight Plan' 之后)。

这是我到目前为止的代码,它适用于其他网站,但奇怪的是不适用于 SkyVector:

Sub test1()

Dim IE As Object
Dim doc As HTMLDocument

     Set IE = CreateObject("InternetExplorer.Application")

IE.Visible = True
IE.navigate "http://www.skyvector.com/"

     Do While IE.Busy
         Application.Wait DateAdd("s", 1, Now)
     Loop

Set doc = IE.document

     doc.getElementsById("sv_planEditField").Value = "test"

End Sub

不幸的是,当此行设置为 运行:

时会出现错误
doc.getElementsById("sv_planEditField").Value = "test"

错误是“运行-时间错误‘438’:对象不支持此属性或方法”。

我一直在绞尽脑汁寻找解决方案,但我在这里也找不到任何解决方案,特别是对于像 SkyVector 这样工作的网站。我不确定那个网站和任何其他网站之间有什么区别。非常感谢您的宝贵时间!

元素 sv_planEditField 不是普通的文本框。在浏览器中打开它并使用开发人员工具检查它(按 F12)。在填充之前和之后都这样做。您会注意到这与标准输入完全不同。重新创建已填充控件的 html 结构或重新创建表单提交。查看 createElement 和 appendChild 了解更多信息。

首先,方法名不是getElementsById()。名称是 getElementById(),没有复数形式的 s。原因是,一个 ID 只能在 html 文档中使用一次,它是唯一的。

但是如果您使用正确的名称,您将收到没有对象的错误。原因是,没有 ID 名为 sv_planEditField.

的元素

那你能做什么?您可以使用另一种称为 getElementsByClassName() 的方法,因为有问题的 html 行是

<input autocomplete="false" spellcheck="false" class="sv_search" autocorrect="off">

方法getElementsByClassName()建立节点集合。因此它使用 s 表示复数。具有相同 class 名称的元素可以有任意多个开发人员想要的。您可以通过它的索引获取特定元素,就像将它与数组一起使用一样。 clss 名称 sv_search 仅在文档​​中使用过一次。节点集合的第一个索引总是 0。因此,您必须使用下面的 vba 代码行,而不是您的:

doc.getElementsByClassName("sv_search")(0).Value = "test"

编辑

再次阅读您的问题并理解它之后 ;-) 并且基于 Sam 的回答,这里是您可以解决问题的方法。您需要的是一个新的文本节点和(我认为)触发正确的事件以使输入适用于页面。用原始数据试试。

Sub test1()

Dim IE As Object
Dim textToEnter As Object
Dim nodeToAppendText As Object
Dim nodeText As Object

  Set IE = CreateObject("InternetExplorer.Application")
  IE.Visible = True
  IE.navigate "http://www.skyvector.com/"
  
  Do While IE.Busy
    Application.Wait DateAdd("s", 1, Now)
  Loop
  
  'Open overlay to enter data
  IE.document.getElementsByClassName("sv_topbarlink")(0).Click
  'Click textfield to hide helptext and place curser
  IE.document.getElementsByClassName("svfpl_helpmessage")(0).Click
  
  'Create a text node which belongs to the document
  Set textToEnter = IE.document.createTextNode("Test")
  'Get the node you want to append the new text node
  Set nodeToAppendText = IE.document.getElementById("sv_planEditField")
  'Append the new text node
  Set nodeText = nodeToAppendText.appendChild(textToEnter)
  
  'Not sure if it is necessary to trigger an event
  'But there are two events in question:
  '  First one is input
  '  Second one is keypress
  'You must try how it works
  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")
  theEvent.initEvent eventType, True, False
  htmlElementWithEvent.dispatchEvent theEvent
End Sub