我需要以编程方式从 Google Colab 菜单“运行时”运行某些命令“全部运行”。它没有任何明显的“onclick”事件处理程序,我可以从该页面上的 javascript 代码调用它。页面上的其他“div”可以从 js 调用,例如,我可以使用 js 代码连接到运行时:
document.querySelector('#top-toolbar > colab-connect-button').shadowRoot.querySelector('#connect').click();
运行时菜单是一个下拉菜单,我尝试了其中的.click()
每个<div>
项目,但没有效果。
“全部运行”命令也有一个热键,Ctrl + F9
但向document
元素分派事件无效。但是我可以Enter
使用以下代码向笔记本内的任何输入字段发送命令:
document.querySelector('input.raw_input').dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'}))
使用 Chrome 代码检查器,Ctrl + Shift + I
我查看了“全部运行”命令,它看起来像:
<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>
所以我在页面上检查器代码的 Sources 选项卡中搜索,发现在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)
120 -F9
顺便说一句,是按钮的键码。我还发现我认为需要的菜单项的确切位置被称为:
case "runall":
d.runAll();
break;
但我几乎不可能理解d.
它是什么以及它的参考在哪里!
我还发现了许多其他有趣和有用的命令,例如this.notebook.getKernel().isRunning()
orc.notebook.getKernel().restart()
但问题一直都是一样的:这些命令的根对象是什么?我试过了document.
,window.
但结果是“未定义”或“不是函数”。我认为我可以在如下字符串中调用 runall() 命令:
document.**SOMETHING I DONT KNOW**.runAll()
我对前端/js 很不满意,很难在混淆代码中找到一些东西,但如果我们有这样的功能,比如.runAll()
连接到所需菜单项的 javascript 代码,我可以从控制台或 javascript 注入以编程方式运行它
或者也许可以将键盘事件分派Ctrl + F9
给某个元素以运行此命令,因此问题是分派键盘事件所需的对象是什么
出于类似的原因,我花了一段时间梳理了那个 javascript 文件,最后想出了如何使这个工作正常进行。
这是一个以编程方式运行所有单元格的函数:
function runAll() {
const F9Event = {key: "F9", code: "F9", metaKey: true, keyCode: 120};
document.dispatchEvent(new KeyboardEvent("keydown", F9Event));
}
需要注意的是KeyboardEvent.keyCode
已被弃用的青睐KeyboardEvent.code
,但你仍然需要在此处提供(截至21年5月18日),因为它是Colab用来检查键盘输入的属性。
无论平台如何,您也可以交替使用metaKey: true
和ctrlKey: true
,因为 Colab 只检查需要它们的快捷方式是否存在KeyboardEvent.metaKey
或KeyboardEvent.ctrlKey
。
我还发现了许多其他有趣和有用的命令,例如
this.notebook.getKernel().isRunning()
orc.notebook.getKernel().restart()
但问题一直都是一样的:这些命令的根对象是什么?
有一个全局colab
对象可以提供对某些(但不是全部)功能的访问。大多数事情都可以通过 访问colab.global
,例如重新启动内核,您可以使用:
colab.global.notebook.kernel.restart()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句