If statement Applescript命令在关闭chrome窗口后遇到错误

If statement Applescript命令在关闭chrome窗口后遇到错误,if-statement,applescript,repeat,If Statement,Applescript,Repeat,所以我一直在做一个项目,和我的一些编码朋友混在一起。我正在尝试制作一个AppleScript应用程序,它告诉Chrome在运行时返回一个页面,我希望它一直运行。我不得不根据chrome是否打开了一个活动窗口来判断它,到目前为止我设法让它工作,但当我重复输入“返回”命令时,它会出现一条错误消息,说无法获取窗口1 这是我正在使用的代码。我正在使用High Sierra,如果这有什么不同的话 repeat if application "Google Chrome" is running th

所以我一直在做一个项目,和我的一些编码朋友混在一起。我正在尝试制作一个AppleScript应用程序,它告诉Chrome在运行时返回一个页面,我希望它一直运行。我不得不根据chrome是否打开了一个活动窗口来判断它,到目前为止我设法让它工作,但当我重复输入“返回”命令时,它会出现一条错误消息,说无法获取窗口1

这是我正在使用的代码。我正在使用High Sierra,如果这有什么不同的话

repeat
    if application "Google Chrome" is running then
        repeat
            tell application "Google Chrome"
                if exists (window 1 of application "Google Chrome") then
                    repeat while exists (window 1 of application "Google Chrome")
                        go back tab of window 1
                    end repeat
                end if
            end tell
        end repeat
    end if
end repeat

不。这不是实现保持打开脚本的方法。做无休止的重复循环,却没有办法退出,这只会吞噬系统资源,使谷歌浏览器无法使用,直到脚本被迫退出

此外,代码也很可怕:大量冗余语句和混乱的语法

您最好通过创建一个名为“保持打开”的应用程序脚本来实现目标,该脚本将每隔几秒钟左右使用
idle
处理程序来处理命令。顾名思义,脚本将保持打开状态并执行命令,直到您告诉它退出

首先声明一个属性,该属性确定调用
idle
处理程序的频率。这在底部定义,在
run
处理程序之后,该处理程序在脚本运行时执行,并调用
idle
处理程序

    property idleTime : 20 --seconds


    on run

        idle

    end run


    on idle

        tell application "Google Chrome"
            if it is not running then return idleTime

            tell window 1 to if it exists then ¬
                tell its active tab
                    if its URL contains "disney" then ¬
                        tell me to quit

                    set its URL to "chrome://newtab/"
                end tell
        end tell

        return idleTime

    end idle
我稍微修改了你对朋友开的玩笑,因为
往回走
在你走到历史的尽头之前只会起作用很多次,没有人能再往回走了。相反,我告诉tab每20秒加载一次新的tab起始页,我相信这会让用户非常困惑

为了让它正常启动和运行,您需要将脚本保存为应用程序,并选中将其标记为保持打开脚本的框。然后只需双击运行它


有两种方法可以终止此脚本:① 打开活动监视器并从正在运行的进程列表中终止其进程;或② 使用Chrome浏览器访问(或任何迪斯尼网站)并等待20秒。

只需将此代码保存为保持打开的应用程序即可

on idle
    tell application "Google Chrome"
        if it is not running then return 10 -- seconds to wait before repeating
        tell window 1 to if it exists then ¬
            try
                go back active tab
            end try
    end tell
    return 10  -- seconds to wait before repeating
end idle

回到在社区驱动的exchange站点上回答问题这一严肃话题,我意识到我在投稿时没有做到的一件事是真正确定并解释OP脚本抛出它所犯的特定错误的原因,即:无法获取
窗口1
?我想说的是,它与测试它是否存在的方式有关:
if exists window 1
,而不是
告诉window 1它是否存在。但我无法合理解释为什么一个可行而另一个不行。你怎么认为?你有什么想法吗?在我将要在我的答案中发布的脚本的一个变体中,根据你使用quit命令的示例,我无法从dock退出保持打开应用程序,除非我添加了quit handler如果窗口1存在,那么告诉它的窗口1,告诉它的活动选项卡。。将正常工作。。换句话说,只是检查窗口1是否存在。。。我们仍然需要告诉窗口1告诉它的活动选项卡。。。鉴于告诉窗口1它是否存在。。。目标是窗口1。。。这不是我的问题,也不是OP的问题。我看不出有任何混淆需要将命令指向
窗口1
(以及随后的选项卡)。OP的错误消息是沿着
window 1
无法检索/引用/等的路线。这意味着对
window 1
的引用使用了错误的语法(例如,在寻址之前忽略了对其父级的寻址);或者在没有
窗口1
的点进行引用。继续…OP按顺序引用了对象层次结构,所以不太可能是前一个原因造成的。这使得由
窗口1
引起的问题不存在,例如当Chrome没有运行时。然而,他测试窗口1是否以类似于您和我的方式存在,但略有不同。我想知道是不是这种语法上的差异导致了这个问题,如果是的话,为什么会这样。也就是说,OP检查
窗口1是否存在的方式是否存在内在错误?如果有,我就看不到。@JosiahHolgate不客气。如果你高兴,我能请你选择我的答案来感谢我吗?