如何用 js 实现抽奖页面的二次点击(关闭抽奖失败的提醒)?

2017-09-06 14:20:22 +08:00
 Vkin

有一个抽奖页面,每天能抽 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 一步完成这个两个功能? 点击自动抽奖按钮,然后关闭抽奖后弹出的提醒,然后继续循环?

3388 次点击
所在节点    JavaScript
13 条回复
Vkin
2017-09-06 14:43:25 +08:00
顶顶。
ituren
2017-09-06 14:44:12 +08:00
因为你 lottery[0].onclick();之后去做网络请求了呀
请求回来才会弹出提示让你关闭
懒人做法 : var lotteryClose = document.getElementsByName("close"); lotteryClose[0].onclick(); 这段加上 timeout
Vkin
2017-09-06 15:24:19 +08:00
@ituren 加了 settimeout 就可以了。有没有办法做个判断呀,当这个窗弹出时,自动调用关闭代码? 原谅我刚接触 js 一天。
invoke
2017-09-06 16:07:14 +08:00
不是太理解。既然你有网络请求那么就把关闭弹窗的函数放到网络请求的返回执行里面不就好了吗?
Vkin
2017-09-06 16:18:55 +08:00
@invoke 哪里不太理解? 放到网络请求的返回执行?能否具体点呀?,我对 js 是小白的小白。。
ituren
2017-09-06 16:22:28 +08:00
看一下网站的具体处理逻辑,如果关闭按钮只是把弹出框隐藏掉的话就不用管它了
lottery[0].onclick(); * 100 就可以了
autoxbc
2017-09-06 16:57:14 +08:00
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

如果不想深入学习,那就用上面的延时吧,不过延时是不可靠的
zgx030030
2017-09-06 17:07:52 +08:00
selenium 自动化。。。
wxsm
2017-09-06 21:56:17 +08:00
为什么你要关闭这个提醒。它应该并不妨碍你继续执行 lottery[0].onclick(),有可能只是“看起来妨碍了”而已
Vkin
2017-09-06 22:10:39 +08:00
@wxsm 不清楚影不影响,但是不及时关闭,会一直弹弹弹,然后到时候也是一样要关闭。。。。。
kyuuseiryuu
2017-09-06 22:35:51 +08:00
直接用将弹窗的 CSS display:none !important;
popok
2017-09-06 22:48:23 +08:00
如果请求简单,直接抓包,发请求包
如果复杂,就继续模拟点击,那个弹窗可能只是一个遮挡而已,不影响你执行点击的事件。

如果那个弹窗确实能限制你点击抽奖,那就照 7 楼,监听事件

实在不行,只能延时了。
codermagefox
2017-09-07 01:20:36 +08:00
楼主,这就是你开始学习 js 异步的机会啊!或者用 se 也行,se 是有内置的等候方法的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/388608

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX