【问题标题】:Access next webpage after clicking点击后访问下一个网页
【发布时间】:2015-03-09 07:43:06
【问题描述】:

要求:点击下方$ie.Navigate 命名的网页后。我需要访问下一个打开的网页的 HTML / OuterHTML 源代码。

例如:当我打开 https://www.healthkartplus.com/search/all?name=Sporanox(通过设置 $control = Sporanox)时,下面的代码只需单击第一个匹配链接。点击链接后,我需要访问结果页面的 HTML。

更新:提到另一个 SO 问题并了解到我们可以搜索适当的窗口。代码似乎适用于某些场景,但并非适用于所有场景。对于 $ie2,我在访问 Document 属性时遇到问题。

function getStringMatch
 {
    # Loop through all 2 digit combinations in the $path directory
    foreach ($control In $controls)
    {
        $ie = New-Object -COMObject InternetExplorer.Application
        $ie.visible = $true
        $site = $ie.Navigate("https://www.healthkartplus.com/search/all?name=$control")
        $ie.ReadyState

        while ($ie.Busy -and $ie.ReadyState -ne 4){ sleep -Milliseconds 100 }

        $link = $null
        $link = $ie.Document.get_links() | where-object {$_.innerText -eq "$control"}
        $link.click()

        while ($ie.Busy -and $ie.ReadyState -ne 4){ sleep -Milliseconds 100 }

       $ie2 = (New-Object -COM 'Shell.Application').Windows() | ? {
       $_.Name -eq 'Windows Internet Explorer' -and $_.LocationName -match "^$control"
       }

        # NEED outerHTML of new page. CURRENTLY it is working for some.

        $ie.Document.body.outerHTML > d:\med$control.txt
    }
}

$controls = "Sporanox"

getStringMatch

【问题讨论】:

  • 在您第一次导航到的页面中,您有两个 Sporanox 链接,您想要两个目标的 HTML 吗?只有一个?

标签: regex html powershell dom


【解决方案1】:

我认为问题在于您在第一页中查找链接时。 链接 innerText 不等于 $control,它包含 $control,即 innerText 是“Sporanox (100mg)”。

以下可能会有所帮助:

$link = $ie.Document.get_links() | where-object {if ($_.innerText){$_.innerText.contains($control)}}

编辑

这是我正在使用的完整代码:

function getStringMatch
{
    # Loop through all 2 digit combinations in the $path directory
    foreach ($control In $controls)  
    {
        $ie = New-Object -COMObject InternetExplorer.Application
        $ie.visible = $true
        $site = $ie.Navigate("https://www.healthkartplus.com/search/all?name=$control")
        $ie.ReadyState

        while ($ie.Busy -and $ie.ReadyState -ne 4){ sleep -Milliseconds 100 }   

        $link = $null
        $link = $ie.Document.get_links() | where-object {if ($_.innerText){$_.innerText.contains($control)}}
        $link.click()

        while ($ie.Busy)
        { 
            sleep -Milliseconds 100 
        }

        # NEED outerHTML of new page. CURRENTLY it is working for some.

        $ie.Document.body.outerHTML > d:\med$control.txt
    }
}

$controls = "Sporanox"

getStringMatch

【讨论】:

  • 是的,当点击找到的 $link 时,OuterHTML 包含新页面。我可以在创建的文件中看到“检查可用性”以及“1 条带 304.50 卢比(每个 4 粒胶囊)”,它们不在第一页中。
  • 请确认一次。这很令人困惑,因为我仍然看到旧的 outerHTML 页面没有“检查可用性”的东西。
  • 是的,这只是时间问题,它会在页面加载之前保存,我正在研究它。
  • 我想我找到了问题所在。 While 循环从未起作用。
  • 这真的很奇怪:while ($ie.Busy -and $ie.ReadyState -ne 4){ sleep -Milliseconds 100 } 这对我来说是有效的,但是它不起作用。虽然这 while ($ie.Busy -ne $false) { sleep -Milliseconds 100 } 有效
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 2023-03-23
  • 2012-02-07
  • 2015-02-15
相关资源
最近更新 更多