Проблема со ссылкой на документ HTML внутри iframe - PullRequest
0 голосов
/ 17 января 2020

У меня возникли проблемы при попытке обратиться к элементам внутри iframe, содержащим рекапчу.

Цель моего сценария - помочь человеку заполнить поисковую форму, нажав кнопку "Поиск", и направить пользователя к сделке. с reCaptcha (я не пытаюсь сломать капчу или что-то в этом роде) и после поиска откройте найденную страницу, чтобы получить некоторую информацию и показать ее пользователю для подтверждения.

Проблема когда я программно нажимаю кнопку поиска, скрипт reCaptcha будет действовать. Иногда он очищает доступ и идентифицирует, что запрос сделан человеком (когда пользователь делал другие вещи непосредственно перед использованием сценария); в других случаях он представляет всплывающее окно reCaptcha с тестированием изображений, если вы человек.

Мне нужно различать guish, когда скрипт reCaptcha автоматически идентифицирует или представляет изображения капчи, потому что в последних случаях я ' Я покажу всплывающее окно, сообщающее пользователю, что go нужно разобраться с капчей.

Вот проблема: я могу определить iframe reCaptcha (хранится в переменной ifrCaptcha); Я также знаю, когда проблема показывается стилем видимости CSS div, содержащим iframe (ifrCaptcha.parentElement.parentElement.Style.visibility). Но мне не удалось найти способ ссылки на документ, содержащийся в iframe.

Когда я использую ifrCaptcha.document, он получает основной документ страницы, а не документ iframe.

Как я могу сослаться на документ iframe?

Страница не опубликована c, но я думаю, что любая страница с reCaptcha сделает эту работу; код выглядит следующим образом (цель состоит только в том, чтобы ссылаться на что-либо в документе iframe; например, на заголовок документа iframe):

Sub AbrePesquisa()

    Dim IE As InternetExplorer , DocHTML As HTMLDocument, ifrDocHTML As HTMLDocument
    Dim intCont As Integer
    Dim ifrCaptcha As HTMLIFrame
    Dim bolCaptchaValidado As Boolean, bolCaptchaVisivel As Boolean


    Set IE = New InternetExplorer
    IE.Navigate "http://www.whatever-url-which-uses-recaptcha.com"

    Do
        DoEvents
    Loop  Until IE.readyState = READYSTATE_COMPLETE

    Set DocHTML = IE.document

    Set ifrCaptcha = Nothing
    Set ifrCaptcha = PegarCaptcha(DocHTML)
    strSrcCaptcha = ifrCaptcha.src ' When page reloads, the iframe src changes a bit, so I need it

    DocHTML.getElementById("SearchString").Value = strSearchParameters
    DocHTML.getElementById("SearchButton").Click

    ' Wait for browser to process the reCaptcha script
    Do
        Set ifrCaptcha = Nothing
        Set ifrCaptcha = PegarCaptcha(DocHTML)

        bolCaptchaVisivel = ExibindoCaptcha(DocHTML, ifrCaptcha)

        If bolCaptchaVisivel = False Then
            If strSrcCaptcha <> ifrCaptcha.src Then bolCaptchaValidado = True
        End If

    Loop Until bolCaptchaValidado = True Or bolCaptchaVisivel = True

    Set ifrDocHTML = ifrCaptcha.document

    Debug.Print ifrDocHTML.Title ' Returns the main page title
    Debug.Print ifrDocHTML.InnerHtml ' Returns the main page HTML

End Sub

Function ExibindoCaptcha(DocHTML As HTMLDocument, ifrCaptcha As HTMLIFrame) As Boolean

    If ifrCaptcha Is Nothing Then
        ExibindoCaptcha = False

    ElseIf ifrCaptcha.parentElement Is Nothing Then ' The page I'm working in has the captcha inside a div nested in another div, both of which VBA returns as non-existing when reCaptcha isn't showing (even I seeing both exists in browser, in Inspector mode)
        ExibindoCaptcha = False

    ElseIf ifrCaptcha.parentElement.parentElement Is Nothing Then
        ExibindoCaptcha = False

    Else
        If ifrCaptcha.parentElement.parentElement.Style.visibility = "visible" Then
            ExibindoCaptcha = True
        Else
            ExibindoCaptcha = False
        End If
    End If

End Function

Function PegarCaptcha(DocHTML As HTMLDocument) As HTMLIFrame

    Dim ifrCont As HTMLIFrame

    For Each ifrCont In DocHTML.getElementsByTagName("iframe")
        If ifrCont.Title = "desafio reCAPTCHA" Then Exit For
    Next ifrCont

    If ifrCont Is Nothing Then
        Set PegarCaptcha = Nothing

    Else
        Set PegarCaptcha = ifrCont

    End If

End Function

Кто-то там может помочь мне сослаться на документ, содержащийся в iframe капчи?

Заранее спасибо за любую помощь!

...