我試圖自動化一個網站上的一些表單條目,我沒有源代碼。找到合適的字段並用js填充並以編程方式提交表單是一項非常簡單的任務。但是該網站是建立在Angular中的,當點擊表單提交時,所有輸入字段的驗證標誌彈出,就好像沒有任何字段被填寫一樣。使用Tampermonkey在AngularJS網站上自動完成表單提交?
瀏覽其他幾個職位,我碰到認識到我需要以某種方式要麼設置變量的作用域裏,就像這樣:
$scope.$apply(function() {
$scope.fieldName = varname;
});
或將字段設置爲髒,像這樣:
$scope.fieldname.$dirty = true;
不幸的是,沒有訪問代碼,我不確定範圍可能是什麼,或者如何適當地告訴Angular表單上的字段已經以編程方式更新。
編輯
我使用Roblox爲這個錯誤的例子。
網站上的不同形式(如註冊表單(以及登錄背後的表單))對其進行驗證,這會引發我提到的錯誤。
這是我做的嘗試使用相同的邏輯,對寄存器腳本登錄腳本的例子:
// ==UserScript==
// @name Roblox Account Create
// @namespace http://roblox.com/
// @version 0.1
// @description Create Roblox Account
// @author You
// @match https://www.roblox.com/
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant none
// ==/UserScript==
/* jshint -W097 */
'use strict';
var _adj = [ 'Cool', 'Masked', 'Bloody', 'Lame' ];
var _animals = [ 'Hamster', 'Moose', 'Lama', 'Duck' ];
var _months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];
var _username = _adj[ parseInt(Math.random() * _adj.length) ], _pass = Math.random().toString(36).substring(2, 10);
_username += _animals[ parseInt(Math.random() * _animals.length) ];
_username += parseInt(Math.random() * 1000);
var _dt_month = _months[ Math.floor(Math.random() * (12) + 0) ];
var _dt_day = Math.floor(Math.random() * (28) + 1);
var _dt_year = Math.floor(Math.random() * (2005 - 1916 + 1) + 1916);
$('#Username').val(_username);
$('#Password').val(_pass);
$('#PasswordConfirm').val(_pass);
$('#MonthDropdown').val(_dt_month);
$('#DayDropdown').val(_dt_day);
$('#YearDropdown').val(_dt_year);
$('#FemaleButton').click();
$('#SignupButton').click();
我已嘗試添加輸入和更改值後更改事件我電話,但在將驗證更新爲添加到輸入字段的值方面沒有任何變化。例如:
$('#Username').val(_username).trigger('input'); // Also .trigger('change')
您可以將它們添加到Tampermonkey,並導航到ssl roblox homepage測試這兩個腳本。
這將是很高興有網頁的URL測試。 – wOxxOm
我正在製作此腳本的網站是受IP限制的白名單。我確實有幾個網站有篡改猴自動登錄頁面加載爲我。其中一個網站也使用angularjs,因此我遇到了同樣的問題:[Roblox](http://www.roblox.com/) – Mike
@BrockAdams,我已更新我的帖子,以包括相關的測試網址以及測試腳本來複制問題。 – Mike