当前位置: 首页 > 知识库问答 >
问题:

使用带有Chrome的脚本桥强制展开错误

蒯坚白
2023-03-14

我正在尝试苹果的脚本桥,与谷歌浏览器进行交互。我从 https://stackoverflow.com/a/24147285 的代码开始

我通过使用 sdefsdp 命令创建了 .h 文件。

我已经包含了该文件,并在桥接头中创建了桥接头和导入chrome的头文件。但问题是在Swift中使用了头文件。代码很旧,Swift发生了很大变化。

我的快速文件:

import Cocoa
import ScriptingBridge


var chromeObject = SBApplication.init(bundleIdentifier: "com.google.Chrome")! as AnyObject

print(chromeObject.closeable)

我收到一个错误消息说

致命错误:展开可选值时意外发现零

我做错了什么?

共有2个答案

司空锋
2023-03-14
匿名用户

文档的 SB 应用程序.init?(捆绑标识符:)

< code > s application 子类的初始化共享实例,表示包标识符为< code>ident的目标应用程序。如果找不到这样的应用程序或者应用程序没有脚本接口,则返回< code>nil。

您应该在强制解开包装之前检查 init 方法是否返回实例,例如:

if let chromeObject = SBApplication.init(bundleIdentifier: "com.google.Chrome") as? AnyObject {
    print(chromeObject.closeable)
}

胡和煦
2023-03-14

SBApplication返回Application对象。您可以在中看到不同的interfaces。h文件。

@interface ChromeApplication : SBApplication
@interface ChromeWindow : SBObject <ChromeGenericMethods>
@interface ChromeApplication (ChromiumSuite)
@interface ChromeTab : SBObject <ChromeGenericMethods>
@interface ChromeBookmarkFolder : SBObject <ChromeGenericMethods>
@interface ChromeBookmarkItem : SBObject <ChromeGenericMethods>

因此,< code > s application 返回您的< code>ChromeApplication。您可以调用< code>ChromeApplication中定义的任何属性。你自己试试。你不会得到任何错误。

问题是你称之为可关闭的,这是铬窗口的一部分。

来自Apple文档:

AppleScript和对象

AppleScript是一种面向对象的语言。当您编写、编译和执行脚本时,您使用的一切都是对象。对象是类定义的实例化,它可以包括属性和操作。AppleScript为您最常用的对象定义类,从顶级脚本对象开始,这是您正在使用的总体脚本。

..............

……………………

最重要的是,

脚本对象中的内容

当您在“脚本编辑器”的“脚本”窗口中输入AppleScript语句时,您是在顶级脚本对象中工作。所有脚本对象定义都遵循相同的语法,只是顶级脚本对象没有标记其开始和结束的语句。

脚本对象可以包含以下内容:

属性定义(可选):属性是存储值的带标签的容器。

显式运行处理程序(可选):运行处理程序包含AppleScript在脚本运行时执行的语句。(有关详细信息,请参阅运行处理程序。)

隐式运行处理程序(可选):隐式运行处理程序由任何包含的处理程序或脚本对象之外的任何语句组成。

其他处理程序(可选):处理程序等效于子例程。(有关详细信息,请参阅关于处理程序。

其他脚本对象(可选):脚本对象可以包含嵌套脚本对象,每个脚本对象的定义方式与顶级脚本对象类似,只是嵌套脚本对象用标记其开头和结尾的语句括起来。(有关详细信息,请参阅脚本对象。

所以,简单来说,Application是一个包含Window的对象,它是一个包含Tab对象的对象……

您需要从Application中检索Windowobject/element才能使用0.05。

您应该在每个接口中都有 SB 元素数组。你需要得到它。

实例

// The application's top-level scripting object.
@interface ChromeApplication : SBApplication

- (SBElementArray<ChromeWindow *> *) windows;

@property (copy, readonly) NSString *name;  // The name of the application.
@property (readonly) BOOL frontmost;  // Is this the frontmost (active) application?
@property (copy, readonly) NSString *version;  // The version of the application.

- (void) open:(NSArray<NSURL *> *)x;  // Open a document.
- (void) quit;  // Quit the application.
- (BOOL) exists:(id)x;  // Verify if an object exists.

@end

您应该检索-(SBElementArray

例如,在AppleScript中获取每个选项卡的URL和标题:

tell application "Google Chrome"

    set a to ""
    repeat with w in windows
        repeat with t in tab in w  // Getting tab object from window
            set a to a & linefeed & title of t & " -URL: " & URL of t
        end repeat
    end repeat

end tell

Swift的等效值为:

import Cocoa
import ScriptingBridge


var chromeObject: AnyObject = SBApplication.init(bundleIdentifier: "com.google.Chrome")!

var f = chromeObject.windows() // get the windows from application
for i in f!
{
    var t = (i as AnyObject).tabs() // get the tabs from windows
    for j in t!
    {
        print(((j as AnyObject).title as String) + " -URL: " + ((j as AnyObject).url as String))
    }
}

希望有帮助!

 类似资料:
  • 问题内容: 我想知道是否有可能告诉bash 分别对stdout / stderr的所有调用或随后的后续调用? 一种快速而又肮脏的解决方案是编写自己的printf实现,并使用它代替内置的任何实现,但是在我看来,我可能不需要这样做。 我正在编写同时运行的多个构建脚本,出于调试的需要,我 确实 需要查看它们按顺序编写的消息。 问题答案: 如果命令使用stdio并连接到终端,则会按行刷新它们。否则,您需要

  • 问题内容: 我想知道是否有任何方法可以使用Javascript / jQuery制作脚本来下载(打开下载对话框)图像,以便浏览器不仅仅显示它。 问题答案: 您需要为此使用服务器端脚本。 或者,您的服务器可能允许您通过配置动态更改标头。 带有mod_headers的Apache解决方案 将可下载的图像放在目录中。在此目录中,创建一个包含以下内容的文件: 测试要求: 测试回应: HTML5解决方案 您

  • Puppeteer 可以用来测试 Chrome 扩展 注意 Chrome / Chromium 扩展当前只能在非无头模式下使用。 下面的代码用来处理扩展的 background page,该扩展的代码在 ./my-extension: const puppeteer = require('puppeteer'); (async () => { const pathToExtension =

  • 问题内容: 我正在尝试让我的Chrome扩展程序在加载新页面时运行该功能,但是在尝试了解如何执行此操作时遇到了麻烦。据我了解,我需要在background.html中执行以下操作: 使用来检查时,页面变更 使用运行的脚本。 这是我的代码: 我还想知道init()函数是否可以访问位于其他JS文件中的其他函数? 问题答案: Chrome扩展程序中的JavaScript代码可以分为以下几类: 扩展代码-

  • 问题内容: 如何避免使用!进行力解开的操作,因为使用此方法通常是错误的选择。 如下所示的代码中有什么更好的选择,使用它可以使代码看起来更简单,并且可以通过if检查变量!被调用永远不会为零,因此不会崩溃。 我的教练向我们介绍了bang(!)运算符,然后告诉我们不要再使用它了。告诉我们原因,如果可选为nil,它将使我们的应用程序崩溃。 但是,我发现自己处于类似bang运算符似乎是最简洁和最安全的选择的

  • 一开始我对强制展开和隐式展开非常困惑。现在,以下是我自学的体会: 没有可用于隐式展开的操作,但有一种称为隐式展开选项的东西。隐式展开选项和普通选项都是选项,区别在于当访问隐式展开选项时,您可以自信地知道引擎盖下有一个有效值并可供使用。如果让绑定或强制展开()操作,普通选项需要