python+selenium+Chrome(headless) 实现自动赠送虎牙礼物

前几日,在虎牙关注了个主播,领了一个一级狗牌。
然后发现虎牙会每天给粉丝送10个虎粮的免费礼物,不用就过期了。
赠送礼物会增加亲密度,给狗牌升级。
而7天没有亲密度增长的话,亲密度还会掉。
我就在想,不如写一个脚本,每天自动赠送免费礼物给关注的主播。
不用自己管,亲密度也往上涨不是美滋滋

听说selenium自动化测试比较强大,就去了解了一下。
关于简单的在python中使用,自己测试运行以后已经记了下来。安装Chrome(Headless)并在python中使用

先实现虎牙登录

因为并不了解selenium,就去搜了一下有没有关于selenium实现虎牙登录的前人脚步。还真搜到一篇
Selenium怎样定位虎牙直播登录
是java的代码,不过无所谓。修改为python就好
划重点 swtich了解一下

一般登录之后页面都会跳转到新的网页上,如何获取新的网页呢?这里有个窗口句柄的概念,通过切换窗口句柄来完成。
注意!有时候元素在一个frame里面的时候,也需要通过swtich切换。

贴上这部分python代码:

#coding=utf-8
from selenium import webdriver
import time 

option = webdriver.ChromeOptions()
option.add_argument('headless')
driver = webdriver.Chrome(chrome_options=option)
#driver = webdriver.Chrome()
driver.get('https://www.huya.com')
time.sleep(5)
driver.set_window_size(2000,2000)
driver.maximize_window()
time.sleep(5)
#点击登录
login = driver.find_element_by_xpath('//*[@id="nav-login"]').click()
time.sleep(5)

#切换到登录框里面
driver.switch_to.frame('udbsdk_frm_normal')
time.sleep(3)
#输入账号
driver.find_element_by_xpath('//*[@id="m_commonLogin"]/div[1]/span/input').send_keys('name')
#输入密码
driver.find_element_by_xpath('//*[@id="m_commonLogin"]/div[2]/span/input').send_keys('password')
#点击登录
driver.find_element_by_xpath('//*[@id="m_commonLogin"]/div[5]/a[1]').click()
time.sleep(5)

赠送虎粮

这个就比较简单了,通过find_element_by_xpath元素所在位置,单击赠送

#点击虎粮礼物
driver.find_element_by_xpath('//*[@id="player-face"]/div[1]/ul/li[1]').click()
time.sleep(2)

#选择个数,点击赠送
driver.find_element_by_xpath('//*[@id="player-face"]/div[3]/div[1]/input').clear()
driver.find_element_by_xpath('//*[@id="player-face"]/div[3]/div[1]/input').send_keys('1')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="player-face"]/div[3]/div[1]/span[2]').click()
time.sleep(2)

遇到的坑

  1. 刚开始直接用的headless模式,没有直观的看到页面。运行后一直报错: Element is not clickable at point
    解决方法: 解决Selenium报错“Element is not clickable at point...”的四种方法
    我的原因: “不在视窗里,需要拉滚动条”。
    将页面打开后,就直观地看到了,selenium打开的是一个不完全的窗口,登录按钮不在窗口的显示范围内将窗口最大化就解决了。
    最大化窗口: driver.maximize_window()
  2. 重新改回headless模式后,同样报错。截图后发现,在headless下,窗口并没有最大化, 原因不明,解决方法未知。
    只好手动设置了下窗口尺寸。
    设置窗口大小:
    driver.set_window_size(2000,2000)
    selenium页面截图: driver.save_screenshot('now.png')

附上完整代码
点击查看

发表评论

邮箱地址不会被公开。 必填项已用*标注