无法访问iframe中存储的内容

时间:2018-07-23 20:12:59

标签: vba excel-vba selenium selenium-webdriver web-scraping

在过去的几个小时中,我一直在尝试解决一个简单的问题,但无法弄清楚我要去哪里。有一个网页,其中要填充two srarch boxes以填充结果;一个用于street number,另一个用于street name。我下面的脚本中的.SendKeys中已经设置了两个搜索词,以便您可以按原样运行它。

需要处理三个iframes才能到达内容。第一个iframe会出现在search boxes所在的登录页面中。我已经切换了。但是,最后两个nested iframes出现在结果页面中。我已经切换了第一个(从结果页面),但是无法切换最后一个以达到我想要的内容。我正在尝试在标题为VANDREUMEL SILVIA HERNANDEZ的表标题下提取Ownership History这个名称。

当切换第二个iframe(命名为quickframe的{​​{1}}时,会引发错误id。我如何解决此问题才能获得element not found error

  

再次,搜索字词是:

     

owner name应该是street no.

     

10023应该是street name

     

然后点击搜索按钮以填充结果。

这是我到目前为止的尝试:

HARDISON LN

顺便说一句,如果您手动尝试链接以查看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 ,则需要单击search boxes才能显示该search by address

2 个答案:

答案 0 :(得分:2)

您已经在正确的框架中

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

仅输出名称:

CSS selector

name only


标头的输出

th标签包含名称和地址

css query

Output

答案 1 :(得分:1)

尽管问题已经解决,但我还是决定提出一个可靠的解决方案。如果按照我在下面尝试的方法进行操作,则不必担心iframes。您要做的就是使用适当的POST和适当的headers发送ActiveX请求,您将在其中获得cookie支持。但是,Microsoft WinHTTP Services是您实现相同目标的正确选择。

这是您可以去的方式:

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

要添加到库中的引用:

Microsoft HTML Object Library
Microsoft WinHTTP Services, version 5.1

输出:

enter image description here