以编程方式在 Google Colab 中运行“运行所有单元格”命令

Ser*_*ika 6 javascript python frontend dispatchevent google-colaboratory

我需要以编程方式从 Google Colab 菜单“运行时”运行某些命令“运行全部”。它没有任何明显的“onclick”事件处理程序,我可以从该页面上的 JavaScript 代码调用它。页面上的其他“div”可以从js调用,例如,我可以使用js代码连接到运行时:

document.querySelector('#top-toolbar > colab-connect-button').shadowRoot.querySelector('#connect').click();
Run Code Online (Sandbox Code Playgroud)

运行时菜单是一个下拉菜单,我尝试了其中的.click()每个项目,但没有效果。<div>

此外,“运行全部”命令有一个热键Ctrl + F9,但向document元素分派事件没有效果。但我可以Enter使用以下代码将命令发送到笔记本内的任何输入字段:

document.querySelector('input.raw_input').dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'}))
Run Code Online (Sandbox Code Playgroud)

使用 Chrome 代码检查器,Ctrl + Shift + I我查看了“Run all”命令,它看起来像:

<div command="runall" class="goog-menuitem" role="menuitem" id=":1w" style="user-select: none;"><div class="goog-menuitem-content" style="user-select: none;">Run all<span class="goog-menuitem-accel">Ctrl+F9</span></div></div>
Run Code Online (Sandbox Code Playgroud)

因此,我在页面上检查器代码的“源”选项卡内进行搜索,并在https://colab.research.google.com/v2/external/external_polymer_binary.js文件中发现“runall”的出现:

, Eja = X(new W({
        id: "runall",
        description: "Run all cells in notebook",
        shortcut: IG(120)
Run Code Online (Sandbox Code Playgroud)

F9顺便说一句,120 - 是按钮的键码。我还发现我认为所需菜单项的确切位置被称为:

        case "runall":
            d.runAll();
            break;
Run Code Online (Sandbox Code Playgroud)

但我几乎不可能理解它是什么d.以及它的参考在哪里!

我还发现了许多其他有趣且有用的命令,例如this.notebook.getKernel().isRunning()orc.notebook.getKernel().restart()但问题始终相同:这些命令的根对象是什么?我尝试过document.window.但结果是“未定义”或“不是函数”。我认为我可以在字符串中调用 runall() 命令,例如:

document.**SOMETHING I DONT KNOW**.runAll()
Run Code Online (Sandbox Code Playgroud)

我对前端/js 很不擅长,很难在​​混淆的代码中找到一些东西,但如果我们有像.runAll()javascript 代码这样的功能,它连接到所需的菜单项,我很厚,可以从控制台或 javascript 注入以编程方式运行它

或者也许可以将键盘事件分派Ctrl + F9到某个元素以便运行此命令,因此问题是分派键盘事件所需的对象是什么

pax*_*416 1

出于类似的原因,我花了一些时间梳理该 javascript 文件,最终弄清楚了如何完成这项工作。

这是一个以编程方式运行所有单元格的函数:

function runAll() {
  const F9Event = {key: "F9", code: "F9", metaKey: true, keyCode: 120};
  document.dispatchEvent(new KeyboardEvent("keydown", F9Event));
}
Run Code Online (Sandbox Code Playgroud)

请注意,KeyboardEvent.keyCode已弃用KeyboardEvent.code但您仍然需要在此处提供它(截至 2021 年 5 月 18 日),因为它是 Colab 用于检查键盘输入的属性。

无论平台如何,您都可以互换使用metaKey: true和,因为 Colab 只是检查是否存在需要它们的快捷方式。ctrlKey: trueKeyboardEvent.metaKeyKeyboardEvent.ctrlKey

我还发现了许多其他有趣且有用的命令,例如this.notebook.getKernel().isRunning()orc.notebook.getKernel().restart()但问题始终相同:这些命令的根对象是什么?

有一个全局colab对象提供对某些(但不是全部)功能的访问。大多数事情都可以通过 访问colab.global,例如要重新启动内核,您可以使用:

colab.global.notebook.kernel.restart()
Run Code Online (Sandbox Code Playgroud)