【问题标题】:How do I wait for Google Chrome to load a webpage before continuing in AutoHotkey?如何在继续使用 AutoHotkey 之前等待 Google Chrome 加载网页?
【发布时间】:2014-07-05 02:12:35
【问题描述】:

我正在编写一个 AutoHotkey 脚本,该脚本在 Google Chrome 中执行重复性工作。每次我单击脚本中的链接时,我都必须让脚本在页面加载时进入睡眠状态。

我想知道 AHK 中是否有办法让我告诉脚本等待浏览器完成页面加载,而不是休眠一段时间。这可能吗?

【问题讨论】:

  • 唯一的方法可能是检查页面加载图标是否存在。通过像素搜索,您可以检查颜色,如果颜色不是加载图标的颜色,则加载它。 autohotkey.com/board/topic/…
  • 是的,您可以采用其他方式,但它需要一个用户脚本,如您所见,如果您想确定页面是否已加载,那么开发人员应该为每个可能的浏览器编写代码,这不是最好的,你也可以试试用户脚本,这就是我给你发链接的原因,下次使用谷歌。

标签: google-chrome automation autohotkey


【解决方案1】:

虽然Karthik's answer 比睡眠命令更好,而且它可以在许多网站上运行得相当好,但我发现有一些问题可能会蔓延,尤其是如果你经常使用它。

我自己需要一个可靠的解决方案,我相信我终于找到了。转到 Chrome 网上应用店并添加名为 Control Freak 的 Google Chrome 扩展程序。这很容易让您设置可以在单个页面、整个域或任何站点/页面上触发的代码块。

Control Freak Chrome Extension

加载后,单击您现在为扩展程序提供的齿轮按钮。在您需要进行页面加载检测的相应上下文/空间中单击弹出窗口的顶部。即All

现在您可以单击 Libs 选项卡。向下滚动到 jQuery。您可以从列表中选择任何您喜欢的版本,但我选择了最新的。请注意,CDN 的 url 添加在底部。现在,在您单击底部的Save 按钮后,无论选择什么上下文,您都将始终可以使用 jQuery。

切换回 JavaScript 选项卡并添加此代码,然后修改为您喜欢的方式:

jQuery(function() {
  prompt("Diagnostic: Page Status", "loaded");
});

单击保存后,此代码将在 jQuery Ready 事件时执行。现在您有了一种可靠的方法来检测页面加载,AHK 可以使用它!

有了这个,您可以让 AutoHotkey 等待一个窗口,该窗口的标题以“The page at”开头,这无疑是我们的提示,预先填充了我们的单词“loaded”。你可以告诉 AHK 发送一个 Control+c 来复制它,然后检查它的值,或者只是假设你看到了它,那么你可能得到了你所期望的。下面的 AHK 代码可以等待提示弹出(顺便说一句,这可以很容易地完成)。

clipboard=
WinWait, The page at
WinWaitActive
Send ^c
ClipWait
WinClose
; The rest here is entirely optional tooltip code, but can be useful.
tooltip, The diagnostic data provided was: %clipboard%,0,0
sleep, 1000
tooltip

所以让我们对其进行优化,并将其放入一个可以反复调用的函数中:

功能定义:

waitForPageLoad()
{
  WinWait, The page at
  WinWaitActive
  WinClose
}

函数调用:

waitForPageLoad()

其他想法..

现在我注意到即使页面没有真正更改或重新加载时也会触发此代码,例如页面 URL 可能更改时,但他们专门将其编码为不离开页面,通常您在那里查看新内容。这非常适合我的目的,但是可以通过设置某种变量并检查它是否已经设置(在 Control Freak 中添加的 JavaScript 代码中)来过滤掉。

【讨论】:

  • 我应该补充一点,我一直在不知疲倦地寻找像这样强大的解决方案,但没有找到。我不觉得这个问题的任何答案都以一种始终如一的可靠方式是足够的。这促使我开发了这个解决方案。我觉得这是真正正确的最佳方法。如果可以在 SO 此处更改选择的答案,并且您同意,那么请选择我的答案,这将帮助其他人找到它并为他们节省很多痛苦。谢谢
  • 也许还值得一提的是,它可以被改装以使用任何其他可检测事件,例如鼠标光标更改,您可以在其中使用某人在 AHK 论坛上提供的 AHK 光标更改检测代码.
  • 我选择这个作为答案是因为鼠标光标状态对我不起作用...
  • 如果您不想出现对话框,您可以自定义您输入到 javascript 选项卡的 javascript 代码,例如 jQuery(document).ready(function () { CurrentDomain = "my.domeain.com" $(document).prop('title', 'loaded - ' + CurrentDomain ); });准备就绪后 - 使用以下命令查询加载的屏幕: SetTitleMatchMode 2 SetTitleMatchMode Fast WinWait, loaded
【解决方案2】:

这是我用来检查页面是否已加载的代码。它检查由 x,y 定义的特定像素位置的颜色。 如果像素颜色匹配,则函数退出循环回到主脚本。

功能定义:

waitForPageLoad(x, y, color)
{
  Loop
  {
    PixelGetColor, Loaded, %x%, %y%
    if Loaded = %color%
      break
  }
}

函数调用:

waitForPageLoad(399, 265, "0xE4C2A2")

【讨论】:

  • 是否可以添加最长等待时间以防止脚本陷入死循环?
【解决方案3】:

您可以像这样使用鼠标光标状态:

Sleep, 200
while (A_Cursor = "AppStarting" or A_Cursor = "Wait") ; Wait for browser to be ready (page loaded)
    continue
Sleep, 200
while (A_Cursor = "AppStarting" or A_Cursor = "Wait") ; Wait for browser to be ready (page loaded)
    continue

我这样做了两次,只是为了确保鼠标光标的短暂状态变化不会返回错误的数据。

【讨论】:

  • 我担心我的鼠标在加载页面时没有显示加载图标。带有 Chrome 的 Windows 8.1...虽然 +1 确实是个好主意
  • 很遗憾得知 Windows 8 不再支持此功能。我在 Windows 7 和 Chrome 上使用它,但现在对你没有帮助。
【解决方案4】:

我已修改 Karthik S's function 以添加可选的 seconds 参数。如果指定,这将设置最大等待时间,以防止函数陷入无限循环。我还将颜色比较更改为 RGB,以便与 Window Spy 兼容。 (之前比较为 BGR)

参数说明:

  • x, y:要等待的像素的 X 和 Y 坐标。
  • color:在指定坐标处等待的 RGB 十六进制颜色。 (例如:0xBBCFE3)
  • :在超时并将ErrorLevel 设置为1 之前等待多少秒。

功能定义:

; Wait for page to load by checking pixel color at specified x,y coordinates
WaitForPageLoadByColor(x, y, color, seconds:=-1)
{
   start := A_TickCount
   while ( (seconds = -1) || (A_TickCount-start <= seconds*1000) )
   {
      PixelGetColor, Loaded, %x%, %y%, RGB
      if Loaded = %color%
         return
   }
   ErrorLevel := 1 ; Page failed to load
}

函数调用:

waitForPageLoad(399, 265, "0xBBCFE3", 10)

【讨论】:

    【解决方案5】:

    我在寻找目标页面上出现的控件方面取得了一些成功。当然取决于页面的内容。我使用 WinSpy 找出了一个合适的目标。

    这是对我有用的代码:

    loaded := false
    check_count := 0
    MAX_CHECKS := 20
    
    while !loaded {
        Sleep, 100
        ControlGetPos, x, y, ,,Chrome Legacy Window
        if x == ""
            loaded := false
        else
            loaded := true
    
        check_count++
        if (check_count >= MAX_CHECKS) {
            Exit
        }
    }
    

    【讨论】:

      【解决方案6】:

      以下脚本可用于获取加载页面上 (x, y) 处的颜色

      !q::
          x := 100
          y := 200
          msgbox, start
          mousemove, x, y
          PixelGetColor, pColor, x, y, RGB
          Msgbox, Pixel color %pcolor% at %x% %y%
      return
      

      以下脚本可用于等待页面加载

      !z::
          x := 100
          y := 200
          loop
               { 
               sleep, 500
               PixelGetColor, pColor, x, y, RGB
               If (pColor = "0x4285F4")
                  {
                  msgbox, found color: %pcolor%
                  break
                  }
               }
          ;The next script comes here
          send, {enter}
          ;...
      return
      

      参考:https://www.autohotkey.com/boards/viewtopic.php?t=65554

      【讨论】:

        猜你喜欢
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        相关资源
        最近更新 更多