利用selenium进行QQ空间模拟登录以及滑动验证
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import user_msg
def wait(driver, xpath):
"""等待页面某个元素加载完毕!"""
while True: # 等待页面加载完毕
time_number = 0
iframe = driver.find_element_by_xpath(xpath=xpath) # 定位iframe 元素
if iframe:
return iframe
else:
time.sleep(0.5)
time_number += 0.5
if time_number > 5:
raise Exception("TimeOut")
driver = webdriver.Chrome() # 打开浏览器
driver.get("https://qzone.qq.com/") # 访问页面
# 等待页面某个元素加载完毕!selenium中的方法。
# iframe = WebDriverWait(driver=driver, timeout=5).until(EC.presence_of_element_located((By.XPATH, '//iframe')))
iframe = wait(driver=driver, xpath='//iframe')
driver.switch_to_frame(iframe) # 切换到iframe
driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click() # 定位“账号密码登录”元素
time.sleep(2)
user_input = driver.find_element_by_xpath('//*[@id="u"]') # 定位账号输入框
user_input.clear() # 清除内容
user_input.send_keys(user_msg.user) # 输入账号
time.sleep(1)
password_input = driver.find_element_by_xpath('//*[@id="p"]') # 定位密码输入框
password_input.clear() # 清空内容
password_input.send_keys(user_msg.password) # 输入密码
time.sleep(1)
login_button = driver.find_element_by_xpath('//*[@id="login_button"]') # 定位登陆按钮
login_button.click() # 点击登录按钮
time.sleep(3)
iframe = wait(driver=driver, xpath='//iframe') # 定位 iframe
driver.switch_to_frame(iframe) # 切换到 iframe
time.sleep(2)
test_button = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_thumb"]') # 定位滑动块
action = ActionChains(driver) # 实例一个动作链对象
# action对象调用的所有动作(方法),都会按照被调用的先后顺序存储到一个队列中
action.click_and_hold(test_button).perform() # perform表示执行所有动作
action.reset_actions() # 重置动作
time.sleep(1)
action.move_by_offset(170, 0).perform() # 向右滑动170px
action.release().perform() # 松开滑动块
还有很多改进的地方,比如:滑动距离(轨迹)不对,导致验证失败。可以设置一个循环,验证失败后自动调整滑动距离,再次滑动,直到验证成功。