因為chrome console只能訪問當前頁的上下文(以及chrome擴展的上下文),無法訪問其他標簽頁面的上下文,所以局限性較大,僅適用於一些較簡單的操作
經實踐,可以在chrome的一個標簽頁的console中執行javascript,對於window.open打開的新標簽頁的上下文進行操作,詳見情況4
情況1:頁面上有多個url鏈接,每個url的href中包含有 XXXX 字樣,想要一次全部點開
參考代碼:
var a = $$("a[href*='javaScript:openFullWindowHaveBarForWFList']") a.forEach(function(w){w.click()})
情況2:這些鏈接中都包含6個數字,想要提取出來並組成新的URL后,全部點開
參考代碼:
var a = $$("a[href*='javaScript:openFullWindowHaveBarForWFList']") var id =[] a.forEach(function(i){id.push(String(i).match(/[0-9]{6}/)[0])}) id.forEach(function(j){var nw = window.open();nw.location = "http://192.168.132.80/workflow/request/ManageRequestNoForm.jsp?fromFlowDoc=&requestid=" + j +"&isrequest=0&isovertime=0&isaffirmance=&reEdit=1&seeflowdoc=0&isworkflowdoc=0&isfromtab=false";})
這里用window.open打開了新窗口,如果能獲取新窗口的上下文,就可以真正實現自動化了。可惜不行。只有用chrome擴展才行。
情況3:參考上一篇文章,打開新窗口用於循環訪問URL,如果URL對應的zip或DOC等,則可以實現批量下載。
參考代碼:
(function () { var aa=$("a"); var arr=[]; for(var i=0;i<aa.length;i++){ if(/owner=/.test(aa[i].href)){ arr.push(aa[i].href); } } var nw = window.open(); var i = 0; function op() { console.log(arr[i]); nw.location = arr[i]; i++; if (i<arr.length) setTimeout(op, 5000); } op(); })();
情況4:所謂的“真正實現自動化”;如:先在新標簽頁中打開baidu輸入關鍵詞“美女”,提交搜索;再打開sohu在搜索框中輸入“野獸”
參考:https://www.cnblogs.com/laden666666/p/5544572.html https://www.cnblogs.com/yanggl/p/10211930.html 修改 chrome瀏覽器的跨域設置
然而我在chrome 77 上設置后還是沒辦法獲取另一個標簽頁的上下文。
最后只能退而求其次,不跨域(因為我們通常只針對某個網站內部進行自動化操作),所以我在情況4題目上加了“所謂的”三個字
這里將情況4的任務變更為:先在新標簽頁中打開baidu輸入關鍵詞“美女”,提交搜索;再打開baidu搜索框輸入“野獸”
可以考慮延時函數
function sleep(delay) { for(var t = Date.now(); Date.now() - t <= delay;); }
代碼如下(確保代碼在badu.com的console中執行,即保持不跨域):
var nw = window.open(); nw.location ="https://baidu.com"; (pageok = function(){ if(nw.document.getElementById('kw') != null){ //做你想做的的事 nw.document.getElementById('kw').value ="美女"; } else{ //500毫秒輪詢一次 setTimeout(pageok , 500) } })(); (pageok1 = function(){ if(nw.document.getElementById('su') != null){ //做你想做的的事 nw.document.getElementById('su').click(); setTimeout(function(){nw.document.getElementById('kw').value ="野獸"},5000); } else{ //500毫秒輪詢一次 setTimeout(pageok1 , 500) } })();