【问题标题】:Identifying a DOM element without an ID value识别没有 ID 值的 DOM 元素
【发布时间】:2021-01-21 17:59:33
【问题描述】:

我经常使用 Invisalign® 的网络应用程序来设置正畸病例。我使用 Keyboard Maestro 通过激活 JavaScript 在应用内制作键盘快捷键。

键盘大师触发的JavaScript示例:

document.getElementById('myButton').click();

网络应用最近更新,不再有按钮 ID。因此,getElementByID 不再起作用。

我尝试了以下方法,但它不起作用:

document.getElementByClass('myClass').click();

(我试过c01143和c0012)

页面的 HTML 示例如下:

<div class='c0012'>
        <button type="button" tabindex="-1" data-qa-name="lower" data-qa-toggled="false" class="c0180 c01149 c01151">
            <div class="c01143">
                <svg class="c0189 c0191" viewBox="0 0 24 24"><path d="M2,13 L22,13 L22,16 L2,16 L2,13 Z M8,8 L16,8 L16,11 L8,11 L8,8 Z"></path></svg>
            </div>
        <span class="c01142">Lower</span>
    </button>
</div>

我也试过了:

document.getElementBydata-qa-name('lower').click();

这也行不通。希望有人可以提供一个非常简单的解决方案。虽然我知道一些 HTML 和 CSS,但我的 JavaScript 几乎不存在。

【问题讨论】:

  • 怎么样 document.getElementsByClassName('c0180 c01149 c01151')[0].click(); developer.mozilla.org/fr/docs/Web/API/Document/…
  • 您可能需要小心自动化这些事情 - 检查他们的服务条款以确保它是允许的。他们重新设计网站以消除 ID 可能是有原因的...

标签: javascript html keyboard-shortcuts keyboard-maestro


【解决方案1】:

使用document.querySelector(),您可以使用 CSS 样式选择器来定位元素。在下面的示例中,它选择具有.c0012 类的元素内的第一个按钮。

document.querySelector('.c0012 button').click();

【讨论】:

  • 虽然发布的 HTML sn-p 在技术上是正确的,但这些类很可能是动态生成的,并且会经常更改。
【解决方案2】:

非描述性的类名(例如,c0012c01143)强烈表明,在网站堆栈的某处,正在动态编译/生成 HTML/CSS/JS。因此,您应该预料到这些标识符可能会发生剧烈且相当频繁的变化,并且您不应该在 sn-p 中依赖它们。


方法 #1 - document.querySelector() 使用 data-qa-name

您可以使用document.querySelector()方法根据button标签、buttontype值以及自定义data-qa-name属性进行识别。下面演示了此方法可以在不依赖类名或(不再存在的)ID 值的情况下识别元素:

(() => {
  console.log(document.querySelector("button[type='button'][data-qa-name='lower']"));
})();
<div class='c0012'>
  <button type="button" tabindex="-1" data-qa-name="lower" data-qa-toggled="false" class="c0180 c01149 c01151">
            <div class="c01143">
                <svg class="c0189 c0191" viewBox="0 0 24 24"><path d="M2,13 L22,13 L22,16 L2,16 L2,13 Z M8,8 L16,8 L16,11 L8,11 L8,8 Z"></path></svg>
            </div>
        <span class="c01142">Lower</span>
    </button>
</div>

您只需在已识别的元素上调用 click() 即可解除和转移上述内容,就像您之前所做的那样:

document.querySelector("button[type='button'][data-qa-name='lower']").click();

方法 #2 - document.querySelectorAll(),使用 .innerText 值过滤

虽然从您发布的内容来看,没有任何强烈迹象表明此 data-qa-name 属性的名称或值会发生变化,但您也可以根据其 innerText 值定位该元素,类似于以下内容:

[...document.querySelectorAll("button[type='button']")].find(function (ele) {return ele.innerText === "Lower"})).click();

以下 sn-p 虽然看起来很简洁,但执行以下步骤:

  1. 将具有type 属性button 的所有button 元素枚举到一个数组结构中。
  2. 查找并返回数组中的第一个元素,该元素的innerText 属性等于字符串Lower
  3. 对已识别的按钮执行click() 方法。

this 特定 sn-p 无法满足您的要求的唯一情况是,如果在 DOM 树中的某处出现在预期按钮元素之前的按钮也具有 @987654350 @属性等于字符串“Lower”。您必须执行少量测试,以确认这些 sn-ps 中的哪一个在您的场景中最能始终如一地工作。


进一步阅读

考虑到您自称对 JavaScript 的理解有限,您可能希望查阅以下 MDN 文档页面,以更好地掌握上述方法和语言约定:

【讨论】:

  • 非常感谢您。我刚刚和病人一起结束了我的一天并尝试了方法 1。它就像一个魅力。我将查看方法 2 并做一些建议的进一步阅读。一个简单的正畸医生,冒险走出我的泡沫并学习新东西很有趣。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多