Причудливая проблема чувствительности к регистру при доступе к DOM в WebBrowser - PullRequest
0 голосов
/ 24 октября 2018

Хорошо, обо всем по порядку: Я действительно решил эту проблему, и я опишу проблему так же, как и ее решение .Мой вопрос заключается в том, чтобы выяснить, может ли кто-нибудь объяснить, что происходит, и почему решение, которое я в конечном итоге реализовал, работает , когда исходный код не работает.

Мы интегрируем какое-то стороннее программное обеспечение длянаш через REST API.На начальном этапе аутентификации их программное обеспечение предоставляет пользователю страницу «Вход в систему», через которую они могут затем получить код аутентификации, который затем используется в течение сеанса.Чтобы улучшить взаимодействие с пользователем, мы загружаем эту страницу «Логин» в элемент управления WebBrowser, затем мы используем DOM, чтобы найти элементы INPUT, в которые пользователь должен вводить данные, автоматически вводить данные в них и отправлять форму.Легко, правда?

Вот несколько примеров строк исходного кода, где wbLogin - это элемент управления WebBrowser:

Чтобы получить элемент INPUT, в который пользователь долженвведите свой адрес электронной почты

oEmail = wbLogin.Document.getElementsByName("email").item(0)

или

oEmail = wbLogin.Document.getElementById("LoginEmail")

Чтобы получить форму, которую необходимо отправить:

    If Not wbLogin.Document Is Nothing Then
        If Not wbLogin.Document.Forms Is Nothing Then
            If wbLogin.Document.Forms.length > 0 Then
                oForm = wbLogin.Document.Forms.item(0)
            End If
        End If
    End If

Чтобы отправить актуальную форму

oForm.Submit()

Но вот где это стало странным.Все это прекрасно работало в первый раз, когда я загружал диалог и все это делал.Но во второй раз, когда я загружал бы то же самое диалоговое окно с той же страницей, я получал бы исключения NotSupportedError «System.NotSupportedException: Exception from HRESULT: 0x800A01B6», например,

И это было странно.Проходя по коду и обнаружив, что

wbLogin.Document.getElementsByName("email")

не работает, я обнаружил, что

wbLogin.Document.getelementsbyname("email")

удалось.Поэтому я спустился в кроличью нору, где начал писать код, пробуя первый вариант, а затем второй.Но вскоре я обнаружил, что это не получится на ТРЕТЬЕЙ итерации, и тогда

wbLogin.Document.GetElementsByName("email")

будет успешным ... или

wbLogin.Document.GETELEMENTSBYNAME("email")

Аналогично, oForm.Submit () будет работать один раз,затем oForm.submit (), затем oForm.SUBMIT (), но каждый вариант будет работать ТОЛЬКО один раз.Конечно, перезапуск приложения «очистил бы планшет», но это происходило во время каждого сеанса.

И это становилось еще хуже.Чем больше я кодировал для подобных исключений, тем больше код просто начинал давать сбой где-то еще.И с самыми безумными ошибками при загрузке.В какой-то момент я получу эти методы, возвращающие DBNulls или Booleans.И все-таки я упорно кодирующий все больше и больше исключений.Попробуйте / Catch блоков везде, но каждый раз, когда я пробовал одну вещь, что-то еще падало или что-то еще возвращало чепуху.Я рвал на себе волосы.Я пытался написать код своей собственной прогулки по DOM, пытаясь найти элементы грубой силой, но даже это вызывало ошибки при последующем доступе.Мой исходный код из нескольких горстей строк увеличился до более чем 500 строк, и я все еще не нашел решения.

К счастью, в конце концов я нашел решение, которое работает каждый раз

Например, чтобы получить вышеупомянутое поле INPUT, я сейчас делаю это:

Dim oDocType As System.Type = wbLogin.Document.GetType
Try
    oEmail = oDocType.InvokeMember("getElementById", Reflection.BindingFlags.Default + Reflection.BindingFlags.InvokeMethod, Nothing, wbLogin.Document, {"LoginEmail"})
Catch

End Try

Чтобы отправить форму:

oForm.GetType().InvokeMember("submit", Reflection.BindingFlags.Default + Reflection.BindingFlags.InvokeMethod, Nothing, oForm, {})

Итак, мои вопросы:

  • Почему у меня возникли эти проблемы с моим исходным кодом?
  • Почему мои изменения работают?
...