2 votes

Impossible d'atteindre le contenu stocké dans les iframes

Ces dernières heures, j'ai essayé de résoudre un problème simple, mais je n'arrive pas à comprendre où je me trompe. Il y a une page web dans laquelle il y a two srarch boxes à remplir pour alimenter le résultat ; une pour street number et l'autre pour street name . Les deux termes de recherche sont déjà définis dans l .SendKeys dans mon script ci-dessous afin que vous puissiez l'exécuter tel quel.

Il y a trois iframes à traiter pour atteindre le contenu. D'abord iframe apparaît dans la page de renvoi dans laquelle l search boxes sont. Je l'ai échangé. Cependant, les deux dernières nested iframes apparaissent dans la page de résultats. J'ai commuté le premier (depuis la page de résultats) mais je n'arrive pas à commuter le dernier pour atteindre le contenu que je recherche. J'essaie d'extraire VANDREUMEL SILVIA HERNANDEZ ce nom sous le tableau intitulé avec l'en-tête Ownership History .

Quand il s'agit de changer le deuxième iframe (nommé comme quickframe qui est le id ), une erreur se produit element not found error . Comment puis-je résoudre ce problème afin d'obtenir la owner name ?

Encore une fois, les termes de recherche sont :

street no. qui devrait être 10023

street name qui devrait être HARDISON LN

Cliquez ensuite sur le bouton de recherche pour afficher les résultats.

Voici ma tentative jusqu'à présent :

Sub CollectInformation()
    Dim post As Object

    With New ChromeDriver
        .get "http://hcad.org/quick-search/"
        .SwitchToFrame .FindElementByTag("iframe", Timeout:=7000)
        .FindElementById("s_addr", Timeout:=7000).Click
        .FindElementByCss("input[name='stnum']", Timeout:=7000).SendKeys "10023"
        .FindElementByCss("input[name='stname']", Timeout:=7000).SendKeys "HARDISON LN"
        .FindElementByCss("input[value='Search']", Timeout:=10000).Click
        .SwitchToFrame .FindElementByCss("iframe", Timeout:=7000)
        .SwitchToFrame .FindElementById("quickframe", Timeout:=10000) ''error thrown here
        For Each post In .FindElementsByCss("th", Timeout:=7000)
            If InStr(1, post.Text, "VANDREUMEL", 1) > 0 Then R = R + 1: Cells(R, 1) = post.Text: Exit For
        Next post
        Stop
    End With
End Sub

Btw, si vous essayez manuellement le lien pour voir la search boxes puis vous devez cliquer sur search by address pour que search boxes pour se montrer.

2voto

QHarr Points 24420

Vous êtes déjà dans le bon cadre

Option Explicit
Public Sub CollectInformation()
    With New ChromeDriver
        .get "http://hcad.org/quick-search/"
        .SwitchToFrame .FindElementByTag("iframe", timeout:=7000)
        .FindElementById("s_addr", timeout:=7000).Click
        .FindElementByCss("input[name='stnum']", timeout:=7000).SendKeys "10023"
        .FindElementByCss("input[name='stname']", timeout:=7000).SendKeys "HARDISON LN"
        .FindElementByCss("input[value='Search']", timeout:=10000).Click
        .SwitchToFrame .FindElementByCss("iframe", timeout:=7000)

        Debug.Print .FindElementByCss("input[name=searchval]", timeout:=7000).Attribute("value")  '<== Just the name

        ' Debug.Print .FindElementByCss("tbody th:nth-child(2)", timeout:=7000).Text  '<== Header i.e. Name and address

    End With
End Sub

Sortie pour le nom seulement :

CSS selector

name only


Sortie pour l'en-tête :

Ce th contient le nom et l'adresse

css query

Output

1voto

SIM Points 9725

Bien que le problème ait déjà été résolu, j'ai décidé de proposer une solution robuste. Si vous suivez la méthode que j'ai essayée ci-dessous, vous n'aurez plus à vous soucier de la iframes . Il vous suffit d'envoyer POST en utilisant le formulaire headers ainsi que le formulaire approprié ActiveX dans lequel vous obtiendrez cookie soutien. Cependant, Microsoft WinHTTP Services est le candidat idéal pour vous permettre d'atteindre le même objectif.

C'est comme ça que vous pouvez y aller :

Sub CollectInformation()
    Dim Http As New WinHttp.WinHttpRequest, Html As New HTMLDocument
    Dim oelem As Object

    With Http
        .Open "POST", "https://public.hcad.org/records/QuickSearch.asp", False
        .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .send "search=addr"
    End With

    With Http
        .Open "POST", "https://public.hcad.org/records/QuickRecord.asp", False
        .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .setRequestHeader "Referer", "https://public.hcad.org/records/QuickSearch.asp"
        .send "TaxYear=2018&stnum=10023&stname=HARDISON+LN"
        Html.body.innerHTML = .responseText
    End With

    Set oelem = Html.querySelector("input[name=searchval]")
    If Not oelem Is Nothing Then
        MsgBox oelem.getAttribute("value")
    End If
End Sub

Référence à ajouter à la bibliothèque :

Microsoft HTML Object Library
Microsoft WinHTTP Services, version 5.1

Sortie :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X