簡體   English   中英

自動單擊瀏覽器中的每個選項卡,然后單擊提交按鈕

[英]Automatically click on each tab in webbrowser and click on submit button

鑒於在瀏覽器中打開的一組網頁都來自同一個網站,每個網頁都有一個提交按鈕,是否可以依次向每個選項卡編寫 go 的內容並單擊提交按鈕?

我想知道是否可以使用用戶腳本管理器(如 Greasemonkey 或 Tampermonkey)來完成類似的操作。

或者,是否有某種方法可以在打開網頁而不是僅僅打開頁面時打開它,等待它加載,然后按下提交按鈕?

該網頁是通過form打開的,而不是使用window.open()

<form target="_blank" action="https://acoustid.org/edit/toggle-track-mbid" method="POST">
    <input name="state" value="1" hidden="">
    <input name="track_id" value="9509889" hidden="">
    <input name="mbid" value="6573f01d-0df5-442d-90c3-a69783c217c3" hidden="">
    <input type="submit" value="Unlink">
</form>

這是網站 點擊Unlink打開一個新的 window 並查看表格(您需要一個帳戶):

取消鏈接 MBID 表單

其 HTML 為:

<form method="POST" action="/edit/toggle-track-mbid">

    <div class="form-group">
      <label for="note_i">Comment:</label>
      <textarea class="form-control" name="note" id="name_i"></textarea>
    </div>
    
    <input type="hidden" name="mbid" value="b3350a3b-b8e0-45c0-8289-006451788849">
    <input type="hidden" name="track_id" value="12211538">
    <input type="hidden" name="state" value="1">
    <input type="hidden" name="submit" value="1">
    <input type="submit" class="btn btn-default" value="Submit">

</form>

給定index.html和 HTML 文件位於同一來源,名為other.html與此 Z4C4AD5FCA2E03A3F74DBB1AACED

<button onclick="alert('other window button pushed')">Click me</button>

index.html 中的index.html將打開另一個窗口/選項卡並單擊按鈕,該按鈕應打開警報。

const win = window.open('other.html', 'Other');
win.onload = () => {
  const button = win.document.querySelector('button');
  button.click();
}

無需在新選項卡中實際打開另一個form即可提交表單。 UnlinkSubmit forms 的區別在於后者有兩個新值: submit設置為1 (即在表單提交時取消鏈接)和note ,用於解釋取消鏈接的注釋。

但是,由於發布了問題,您已將submit=1參數添加到第一個表單,以便可以通過單擊Unlink按鈕直接取消鏈接軌道。

這是一個使該過程稍微自動化的解決方案:

// ==UserScript==
// @name         Submit all forms
// @version      0.1
// @description  see https://stackoverflow.com/questions/70227065
// @author       double-beep
// @match        http://reports.albunack.net/*.html
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';

    async function submitAllForms() {
        const forms = document.querySelectorAll('table > tbody > tr > :nth-child(2) > form');

        const formPromises = [...forms].map(form => {
            const formData = new FormData(form);
            if (!formData.get('submit')) { // old version of the website
                formData.set('submit', '1');
            }

            return new Promise((resolve, reject) => {
                GM_xmlhttpRequest({
                    method: 'POST', // post
                    url: form.action,
                    data: formData,
                    onload: resolve,
                    onerror: reject
                });
            });
        });

        await Promise.all(formPromises);
    }

    const submitButton = document.createElement('input');
    submitButton.value = 'Submit forms';
    submitButton.type = 'submit';
    submitButton.addEventListener('click', async () => {
        submitButton.disabled = true;
        submitButton.innerText = 'Please wait...';

        await submitAllForms();

        submitButton.disabled = false;
        submitButton.value = 'Re-submit forms';
    });

    document
        .querySelector('table')
        .previousElementSibling
        .insertAdjacentElement('beforebegin', submitButton);
});

唯一的問題是 - track_id不匹配,用戶腳本對此無能為力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM