• python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]


    背景:

    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)GoogleChromeApplicationchromedriver.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()切换,定位成功

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

  • 相关阅读:
    VirtualApp
    python安装包遇到问题解决
    NMS_非极大值抑制的作用
    解释残差结构的有效性
    使用tcpdump命令抓取sql
    linux进程绑定cpu内核
    查询表空间占用情况
    数据库表分区
    Windows下如何使用ab命令做并发测试
    TCP协议
  • 原文地址:https://www.cnblogs.com/reseelei-despair/p/11064908.html
Copyright © 2020-2023  润新知