利用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() # 鬆開滑動塊
還有很多改進的地方,比如:滑動距離(軌跡)不對,導致驗證失敗。可以設置一個循環,驗證失敗後自動調整滑動距離,再次滑動,直到驗證成功。