【发布时间】:2021-05-05 03:23:26
【问题描述】:
我需要以编程方式从 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() 或c.notebook.getKernel().restart(),但问题始终相同:这些命令的根对象是什么?我尝试了document. 和window.,但结果是“未定义”或“不是函数”。我认为我可以在如下字符串中调用 runall() 命令:
document.**SOMETHING I DONT KNOW**.runAll()
我对前端/js 很不好,而且很难在混淆代码中找到一些东西,但是如果我们在连接到所需菜单项的 javascript 代码中具有 .runAll() 这样的功能,我就可以以编程方式运行它从控制台或 javascript 注入
或者也许可以将键盘事件Ctrl + F9 分派给某个元素以运行此命令,因此问题是分派键盘事件所需的对象是什么
【问题讨论】:
标签: javascript python frontend google-colaboratory dispatchevent