一个脚本来点击两个不同页面上的按钮?

One script to click buttons on two different pages?

我管理的网站有多个嵌入式网页。它是一种用于提交票证的 Mantis Bug Tracker 形式。创建工单后,它会获得几个按钮,关闭,分配等。我正在寻找 Select 关闭按钮,我已经可以这样做,然后单击我能够根据关闭确定的关闭注释区域了解元素并使用 document.querySelectorAll("input[value=Close]")[0].click()

这行得通。但是,它是使用两个脚本完成的。

我想把它压缩成一个脚本。

我已经尝试添加第二页的包含和特定页面所需的脚本,但是在现实世界中这并不完全有效。

脚本 1:

document.onkeyup = function(e) {
    if (e.which == 117) {
        document.querySelectorAll("input[value=Close]")[0].click();
    } else if (e.ctrlKey && e.which == 66) {
        alert("Ctrl + B shortcut combination was pressed");
    } else if (e.ctrlKey && e.altKey && e.which == 89) {
        alert("Ctrl + Alt + Y shortcut combination was pressed");
    }
}


脚本 2:

var EffectiveDate = "";
document.onkeyup = function(e) {
    if (e.which == 117) {
        document.querySelectorAll("textarea[name=bugnote_text]")[0].value = " ";
        document.querySelectorAll("input[value='Close Ticket']")[0].click();

    } else if (e.ctrlKey && e.which == 66) {
        alert("Ctrl + B shortcut combination was pressed");
    } else if (e.ctrlKey && e.altKey && e.which == 89) {
        alert("Ctrl + Alt + Y shortcut combination was pressed");
    }
}

第一组代码是为第一个初始页面设计的,它只需要找到一个特定的按钮并按下它。一旦处理完毕。我想让第二组代码在新页面加载后无缝 运行 但截至目前,这是两个独立的脚本,它们成功地完成了我想要的事情。

我能够找到所需的元素并且能够正确地执行所述的过程只是为了将脚本简化为一个脚本。这当然不是运行,因为它已经给出,但它确实在单独的用户脚本中工作。这可能吗?

您可以使用 Selenium。它有许多不同语言的库,因为它是一个专门用于测试自动化的工具,它可能会帮助你。

您也可以尝试 Selenium IDE 并记录您的工作流程,以便稍后在需要时重播。

希望对您有所帮助!

  1. 要让脚本在 2 个不同的页面上执行 相同的事情,只需调整 @match and/or @include 指令即可在两个页面上。
  2. 要让一个脚本在 2 个不同的页面上执行不同的事情
    A) 确保它在每个步骤 1 的两个页面上触发。
    B) 测试 location 属性以确定触发哪个代码。

例如:

// ==UserScript==
// @name     _Click on two pages
// @match    *://YOUR_SERVER.COM/PATH_FOO/*
// @match    *://YOUR_SERVER.COM/PATH_BAR/*
// @grant    none
// ==/UserScript==

document.addEventListener ("keydown", zEvent => {
    if (zEvent.which == 117) {  //  F6
        zEvent.preventDefault();
        if (location.pathname.includes("/PATH_FOO/") ) {
            document.querySelectorAll("input[value=Close]")[0].click();
        }
        else if (location.pathname.includes("/PATH_BAR/") ) {
            document.querySelectorAll("textarea[name=bugnote_text]")[0].value = " ";
            document.querySelectorAll("input[value='Close Ticket']")[0].click();
        }
    }
    else if (zEvent.ctrlKey && zEvent.which == 66) {
        zEvent.preventDefault();
        alert("Ctrl + B shortcut combination was pressed");
    }
    else if (zEvent.ctrlKey && zEvent.altKey && zEvent.which == 89) {
        zEvent.preventDefault();
        alert("Ctrl + Alt + Y shortcut combination was pressed");
    }
} );

问题代码的其他一些问题:

  1. 它使用已定义的浏览器热键(因浏览器和 OS 而异)。因此,请使用 .preventDefault() 来避免副作用和额外操作。
  2. 同样,在 keyup 上触发会触发得太晚而无法阻止默认操作(主要在 keydown 上触发)。
  3. 不要使用 .on... 事件处理程序,使用 addEventListener.
  4. alert() 的调试很烦人而且有问题(它掩盖了一些问题并可能导致其他问题)。使用 console.log.