有一个抽奖页面,每天能抽 100 次,用 js 实现自动点击抽奖按钮(name:go):
var lottery = document.getElementsByName("go"); lottery[0].onclick();
不管抽没抽中奖,点击一次之后,页面就会弹出提醒,比如 「未抽中,再抽一次」( name:close )",然后又写继续写一个点击,关闭这个提醒:
var lotteryClose = document.getElementsByName("close"); lotteryClose[0].onclick();
我想当然的以为:
第一个 js 代码是 「点击抽奖按钮」、第二个 js 代码是「关闭抽奖之后页面弹出的提醒」。然后只要把这两段代码放在一起,用 setInterval ()不停的循环就行了。
但让人郁闷的是,这两段代码合并后,放在 chrome 的 console 里跑起来却不是我想要的功能,第二段代码似乎并没有运行,也就是说,无法关闭抽奖之后弹出的弹窗。
当弹窗弹出后,我在 console 里再运行一次 var lottery = document.getElementsByName("close");lotteryClose[0].onclick();弹窗却能正常关闭,说明这段代码可以实现关闭按钮的点击。
求教:如何用 js 一步完成这个两个功能? 点击自动抽奖按钮,然后关闭抽奖后弹出的提醒,然后继续循环?
1
Vkin OP 顶顶。
|
2
ituren 2017-09-06 14:44:12 +08:00 1
因为你 lottery[0].onclick();之后去做网络请求了呀
请求回来才会弹出提示让你关闭 懒人做法 : var lotteryClose = document.getElementsByName("close"); lotteryClose[0].onclick(); 这段加上 timeout |
3
Vkin OP @ituren 加了 settimeout 就可以了。有没有办法做个判断呀,当这个窗弹出时,自动调用关闭代码? 原谅我刚接触 js 一天。
|
4
invoke 2017-09-06 16:07:14 +08:00 1
不是太理解。既然你有网络请求那么就把关闭弹窗的函数放到网络请求的返回执行里面不就好了吗?
|
6
ituren 2017-09-06 16:22:28 +08:00 1
看一下网站的具体处理逻辑,如果关闭按钮只是把弹出框隐藏掉的话就不用管它了
lottery[0].onclick(); * 100 就可以了 |
7
autoxbc 2017-09-06 16:57:14 +08:00 1
js 是事件驱动的,基本思路是把所有的操作都和事件关联起来
比如点击关闭按钮的代码,应该挂在按钮出现的事件上 怎么判断按钮出现,可以用突变观察者 http://javascript.ruanyifeng.com/dom/mutationobserver.html https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver 如果觉得观察者比较复杂,可以用事件监听 http://javascript.ruanyifeng.com/dom/event.html 一个元素出现,一般会伴随节点插入事件 DOMNodeInserted 如果是修改现有元素,会伴随属性修改事件 DOMAttrModified 如果不想深入学习,那就用上面的延时吧,不过延时是不可靠的 |
8
zgx030030 2017-09-06 17:07:52 +08:00 1
selenium 自动化。。。
|
9
wxsm 2017-09-06 21:56:17 +08:00
为什么你要关闭这个提醒。它应该并不妨碍你继续执行 lottery[0].onclick(),有可能只是“看起来妨碍了”而已
|
11
kyuuseiryuu 2017-09-06 22:35:51 +08:00
直接用将弹窗的 CSS display:none !important;
|
12
popok 2017-09-06 22:48:23 +08:00
如果请求简单,直接抓包,发请求包
如果复杂,就继续模拟点击,那个弹窗可能只是一个遮挡而已,不影响你执行点击的事件。 如果那个弹窗确实能限制你点击抽奖,那就照 7 楼,监听事件 实在不行,只能延时了。 |
13
codermagefox 2017-09-07 01:20:36 +08:00 via iPhone
楼主,这就是你开始学习 js 异步的机会啊!或者用 se 也行,se 是有内置的等候方法的
|