【问题标题】:One script to click buttons on two different pages?一个脚本可以单击两个不同页面上的按钮?
【发布时间】:2019-05-15 20:03:59
【问题描述】:

我管理一个包含多个嵌入式网页的网站。它是 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");
    }
}

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

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

【问题讨论】:

  • 您是否尝试过将共享逻辑剥离到一个 JavaScript 文件中,然后导入到两个页面中?
  • 我不确定你的意思。我的意思是我已经尝试让两个页面都匹配,并将两个任务的代码放在同一个文件中,但是我在 JavaScript 中太新了,我确信我在这个过程中搞砸了一些东西。据我了解,每项任务都需要自己的功能正确吗?所以初始关闭需要自己的功能,而二次关闭需要自己的功能,对吗?但如果是这样的话,它会在运行时抛出错误吗?在用户脚本文件的设置中,我让它匹配正在使用的两个网页。但话又说回来,我很迷茫,可以做一些基本的事情。

标签: javascript tampermonkey userscripts


【解决方案1】:
  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

【讨论】:

  • 非常感谢。我能够启动并运行它以满足我的需要。现在我只需要添加所有剩余的东西,但现在这让我朝着正确的方向前进。我真的很感激。
【解决方案2】:

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

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

希望对你有帮助!

【讨论】:

  • 我不确定这如何解决任何问题,因为我的问题不是测试问题,因为我在测试我正在做的事情时没有问题。它只是弄清楚我到底没有做什么来让这个用户脚本同时处理这两个过程。一个简单的 IDE 无关紧要,因为我会遇到同样的情况,试图弄清楚如何让它按预期工作。
  • 您提供的关于您的核心问题的信息很少。如果您控制这两个站点,则可以随意在它们之间进行交互(但这很可能需要在两个站点上进行更改)。如果您有 2 个现有站点并且只想自动化某些工作流程,我可以再次推荐 Selenium。即使您不使用它进行测试!如果您愿意,您可以使用它在亚马逊上自动购买商品。抱歉,如果这不能解决您的问题,但您需要更具体才能获得适当的帮助!
  • 我认为我说得很具体,但我很抱歉。我管理一个完整的站点。该站点有多个嵌入式网页,即。一个按钮将您带到特定的网页。我使用的网站是一种用于提交工单的 Mantis Bug Tracker。创建票证后,会给出几个按钮,关闭,分配等。我正在寻找选择关闭按钮,我已经可以这样做,然后单击关闭注释区域,我可以根据了解元素来确定并使用 document.querySelectorAll("input[value=Close]")[0].click()。这行得通。但是它使用两个脚本完成。
  • 我正在尝试减少自动关闭票证和消息所需的脚本数量,然后单击一个完全不同的按钮,称为关闭票证,该按钮位于同一站点的嵌入式网页上。我可以通过单独的脚本让这两个进程工作,如果您希望将其称为问题,我的主要进程只是希望将其全部压缩为一个脚本。
  • 我目前对此没有解决方案。您可能希望使用刚刚发布的其他信息来更新您的问题。它可能有助于其他人为您提供正确答案而无需滚动浏览 cmets。
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 2015-07-20
相关资源
最近更新 更多