ввод данных в div на странице входа - PullRequest
0 голосов
/ 07 августа 2020

https://imgur.com/a/QauSk1H

Set IE = New InternetExplorer

IE.Visible = True
IE.navigate "https://mdemo.cqg.com/cqg/desktop/logon"
Do While IE.Busy = True: DoEvents: Loop


Set HTMLDoc = IE.document
Set wpfe = HTMLDoc.getElementsByClassName("wpfe-logon-input-full wpfe-native-faded-input ng-untouched ng-pristine ng-valid")(0)
wpfe.Value = "User Login"

Тяжело вводить логин но похоже эмм ... ничего хорошего. Экраны интересной части кода и ошибки прикреплены вверху. Надеюсь, вы сможете помочь.

1 Ответ

1 голос
/ 07 августа 2020

Вы хотите получить первое поле ввода по css именам классов "wpfe-logon-input-full wpfe-native-faded-input ng-untouched ng-pristine ng-valid". Я написал имена , потому что каждая строка, разделенная пробелом, является собственным css именем класса. Последнее имя класса css не равно ng-valid при загрузке страницы. Это ng-invalid. Это причина вашей ошибки.

Решение - использовать только первый css класс wpfe-logon-input-full. Но этого недостаточно для достижения вашей цели.

После того, как первый код html был загружен и IE сообщает, что браузер больше не занят, IE лжет вам ;-) Есть динамика c контент, который будет загружен после этого. Так что вам придется подождать, пока это не будет сделано.

Но даже в этом случае вход в систему не работает. Вы должны инициировать два события html для каждого поля ввода.

Этот код работает:

Sub Login()

  Const url As String = "https://mdemo.cqg.com/cqg/desktop/logon"
  
  Dim ie As Object
  Dim HTMLDoc As Object
  Dim nodeUsername As Object
  Dim nodePassword As Object
  
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = True
  ie.navigate url
  Do While ie.Busy = True: DoEvents: Loop
  Application.Wait (Now + TimeSerial(0, 0, 5))
  
  Set HTMLDoc = ie.document
  
  Set nodeUsername = HTMLDoc.getElementsByClassName("wpfe-logon-input-full")(0)
  Call TriggerEvent(HTMLDoc, nodeUsername, "compositionstart")
  nodeUsername.Value = "TestName"
  Call TriggerEvent(HTMLDoc, nodeUsername, "compositionend")
  
  Set nodePassword = HTMLDoc.getElementsByClassName("wpfe-logon-input-full")(1)
  Call TriggerEvent(HTMLDoc, nodePassword, "compositionstart")
  nodePassword.Value = "TestPassword"
  Call TriggerEvent(HTMLDoc, nodePassword, "compositionend")
  
  HTMLDoc.getElementByID("login").Click
End Sub

Используйте эту процедуру для запуска html событий :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...