一个脚本可以单击两个不同页面上的按钮吗?

时间:2019-05-15 20:04:00

标签: javascript tampermonkey userscripts

我管理一个具有多个嵌入式网页的网站。它是Mantis Bug Tracker的一种形式,用于提交故障单。创建票证后,将为其提供一些按钮,包括“关闭”,“分配”等。我希望选择“关闭”按钮,我已经可以执行此操作,然后单击“结束记录”区域,根据我对元素的了解即可确定该区域。并使用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");
    }
}

第一组代码是为第一个初始页面设计的,它只需要找到一个特定的按钮并按一下即可。一旦处理完毕。我希望在加载新页面后让第二组代码无缝运行,但到目前为止,这是两个单独的脚本,可以成功完成我的期望。

我能够找到所需的元素,并且只需将脚本简化为一个脚本就可以正确执行所述过程。当然,它不会像给出的那样运行,但是可以在单独的用户脚本中运行。这可能吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Selenium。它具有适用于多种不同语言的库,并且由于它是专门用于测试自动化的工具,因此可能会帮助您。

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

希望对您有帮助!

答案 1 :(得分:0)

  1. 要使脚本在2个不同的页面上执行相同的操作,只需调整@match和/或@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. 它使用已经定义的浏览器热键(因浏览器和操作系统而异)。因此,请使用.preventDefault()避免产生副作用和采取其他措施。
  2. 同样,在keyup上触发将触发得太晚,无法阻止默认操作(主要在keydown上触发)。
  3. 不要使用.on...事件处理程序,请使用addEventListener
  4. alert()进行调试很烦人且有问题(它掩盖了某些问题,并可能导致其他问题)。使用console.log