首页 > 技术文章 > python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]

reseelei-despair 2019-06-21 15:33 原文

背景:

Dnf的周年庆活动之一,游戏在6月22日 06:00~6月23日 06:00之间登陆过游戏后可以于6月25日 16:00~7月04日 06:00领取奖励

目标:连续四天自动运行脚本,自动领取所有奖励,每天领取一个

进度:当前未知登陆后是否还有选择区服弹窗,故当前仅处理到成功点击为止

思路:

python+selenium自动化点击,程序定时运行

实现方法:timer_exerice.py编写死循环定时器,30s判断一次是否到达相应时间,若到达时间,开始执行selenium_exerice.py,自动打开网页,登录账号,点击领取按钮

 

代码:

编写定时器。每日调整next_time即可

调用os模块是为了执行selenium_exerice.py,这方法比较简单粗暴

import datetime
import os
import time
def time_timer(now_time):
    next_time = datetime.datetime.strptime("2019-6-21 15:17:00", "%Y-%m-%d %H:%M:%S")
    timer_start_time = (next_time - now_time).total_seconds()
    return timer_start_time

def time_main():
    while True:
        now_time = datetime.datetime.now()
        d = time_timer(now_time)
        if d > 0:
            print("距离目标时间还有%s秒" % (int(d)))
            time.sleep(30)
        else:
            print("开始执行")
            os.system(r"python D:\\Pyexerice\\selenium_exerice2.py")
            break

if __name__ == "__main__":
    time_main()

 

编写自动登录点击代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import unittest,time
class Dnf_login(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
        self.driver.implicitly_wait(30)
        self.base_url = "https://dnf.qq.com/cp/a20190618login/?e_code=479698&idataid=266454"
        self.verificationErrors = []
        self.accept_next_alert = True
        print("正在访问Dnf11周年庆活动界面")

    def test_dnf_login(self):
        driver=self.driver
        driver.maximize_window()
        driver.get(self.base_url)
        login_Hierarchy1=driver.find_element_by_id("unlogin")
        login_Hierarchy2=login_Hierarchy1.find_element_by_id("btn_qqlogin")
        driver.execute_script("arguments[0].click();",login_Hierarchy2)
        time.sleep(5)
        #授权登录界面点击账号密码登录
        driver.switch_to.frame("loginIframe")
        driver.find_element_by_id("switcher_plogin").click()
        driver.find_element_by_id("u").clear()
        driver.find_element_by_id("u").send_keys("username")
        driver.find_element_by_id("p").clear()
        driver.find_element_by_id("p").send_keys("password")
        driver.find_element_by_id("p").send_keys(Keys.ENTER)
        print("登录成功")
        time.sleep(5)
        # 点击领取按钮
        # 按层查找按钮所在位置,处理点击
        draw_Hierarchy1 = driver.find_element_by_class_name("dan-con")
        draw_Hierarchy2 = draw_Hierarchy1.find_element_by_id("lotteryBtn1")
        driver.execute_script("arguments[0].click();", draw_Hierarchy2)
        print("点击成功")
        time.sleep(5)


    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
        print("已关闭游览器")

if __name__ == "__main__":
    unittest.main()

 

采坑过程

1.Selenium中单击Element:ElementClickInterceptedException报错

如上图所示,最一开始的时候我的写法是

login_Hierarchy1=driver.find_element_by_id("unlogin")
login_Hierarchy2=login_Hierarchy1.find_element_by_id("btn_qqlogin").click()

然后报错信息如标题,不会处理找百度,参考

https://blog.csdn.net/qq_41424519/article/details/87906207

修改代码后可以成功点击登录按钮

 

2.登录授权界面switch_to.frame()

和1一样,一开始直接定位报错,百度查资料发现登录按钮在iframe上,

所以switch_to.frame()切换,定位成功

 

因为还没开放领取,不知道后面是不是还有填写区服的界面,所以暂时没有处理后续,仅到执行完点击后关闭界面,执行结果如下

 

推荐阅读