1. 程式人生 > 實用技巧 >油猴指令碼:自動檢測元素並點選、休眠、順序執行、單頁面也適用

油猴指令碼:自動檢測元素並點選、休眠、順序執行、單頁面也適用

油猴指令碼-目標:自動檢測元素並點選、休眠、順序執行、填充表單、單頁面也適用

原理:使用setInterval函式檢測元素是否存在,使用Promise鏈式呼叫實現順序執行,

自動指令碼:

  //休眠
  sleep(1)
    //百度首頁
    .then(() => obsPage('www.baidu.com'))
    //休眠
    .then(() => sleep(1))
    //監測存在元素然後點選
    .then(() => obsClick('#s-top-left > a:nth-child(1)'))

效果截圖:

完整程式碼:

// ==UserScript==
// @name 1_test_auto // @namespace http://tampermonkey.net/ // @version 0.1 // @description auto click // @author stumpx // @match http*://www.baidu.com/* // @grant GM_getValue // @grant GM_setValue // ==/UserScript== (function () { 'use strict'; /** * 休眠 * @param time 休眠時間,單位秒 * @param desc * @returns {Promise<unknown>}
*/ function sleep(time, desc = 'sleep') { return new Promise(resolve => { //sleep setTimeout(() => { console.log(desc, time, 's') resolve(time) }, Math.floor(time * 1000)) }) } /** * 監測頁面地址 * @param path 頁面地址片段 * @param desc * @returns {Promise<unknown>}
*/ function obsPage(path, desc = 'page') { return new Promise(resolve => { //obs page let page = setInterval(() => { if (location.href.search(path) > -1) { clearInterval(page) console.log(desc, path) resolve(path) } else { return } }, 100) }) } /** * 監測input節點設定內容 * @param selector CSS選擇器 * @param text 設定的內容 * @param desc * @returns {Promise<unknown>} */ function obsValue(selector, text, desc = 'value') { return new Promise(resolve => { //obs node let timer = setInterval(() => { let target = document.querySelector(selector) if (!!target) { clearInterval(timer) target.value = text console.log(desc, text) resolve(selector) } else { return } }, 100) }) } /** * 監測到節點後點擊 * @param selector CSS選擇器 * @param desc * @returns {Promise<unknown>} */ function obsClick(selector, desc = 'click') { return new Promise(resolve => { //obs node let timer = setInterval(() => { let target = document.querySelector(selector) if (!!target) { clearInterval(timer) target.click() console.log(desc, selector) resolve(selector) } else { return } }, 100) }) } /** * 監測節點是否存在 * @param selector CSS選擇器 * @param desc * @returns {Promise<unknown>} */ function obsHas(selector, desc = 'has') { return new Promise(resolve => { //obs node let timer = setInterval(() => { let target = document.querySelector(selector) if (!!target) { clearInterval(timer) console.log(desc, selector) resolve(selector) } else { return } }, 100) }) } /** * 監測節點內容 * @param selector CSS選擇器 * @param text 節點內容 * @param desc * @returns {Promise<unknown>} */ function obsText(selector, text, desc = 'text') { return new Promise(resolve => { //obs node let timer = setInterval(() => { let target = document.querySelector(selector) if (!!target && target.textContent.trim() == text) { clearInterval(timer) console.log(desc, text) resolve(selector) } else { return } }, 100) }) } /** * 監測節點內容點選 * @param selector CSS選擇器 * @param text 節點內容 * @param desc * @returns {Promise<unknown>} */ function obsTextClick(selector, text, desc = 'text') { return new Promise(resolve => { //obs node let timer = setInterval(() => { let target = document.querySelector(selector) if (!!target && target.textContent.trim() == text) { clearInterval(timer) target.click() console.log(desc, text) resolve(selector) } else { return } }, 100) }) } /** * 監測節點非內容 * @param selector Css選擇器 * @param text 節點內容 * @param desc * @returns {Promise<unknown>} */ function obsNotText(selector, text, desc = 'not text') { return new Promise(resolve => { //obs node let timer = setInterval(() => { let target = document.querySelector(selector) if (!!target) { if (target.textContent.trim() == text) { return } else { clearInterval(timer) console.log(desc, text) resolve(selector) } } else { return } }, 100) }) } /** * 函式返回真繼續執行 * @param func 函式,返回真繼續執行 * @param desc * @returns {Promise<unknown>} */ function obsTrueFunc(func, desc = 'func=>true') { return new Promise(resolve => { if (!!func) { let ret = func() if (ret) { console.log(desc, ret) resolve('func=>true') } } }) } /** * 執行函式 * @param func 函式 * @param desc * @returns {Promise<unknown>} */ function obsFunc(func, desc = 'func') { return new Promise(resolve => { if (!!func) { func() console.log(desc) resolve('func') } }) } /** * 變數為真繼續執行 * @param isTrue bool變數 * @param desc * @returns {Promise<unknown>} */ function obsTrue(isTrue, desc = 'true') { return new Promise(resolve => { if (!!isTrue) { console.log(desc, isTrue); resolve(isTrue) } }) } //休眠 sleep(1) //百度首頁 .then(() => obsPage('www.baidu.com')) //休眠 .then(() => sleep(1)) //監測存在元素然後點選 .then(() => obsClick('#s-top-left > a:nth-child(1)')) })();

本文連結:

https://www.cnblogs.com/stumpx/p/13476123.html