您好,登錄后才能下訂單哦!
這篇文章主要介紹了怎么使用selenium模擬登錄解決滑塊驗(yàn)證問題的實(shí)現(xiàn),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
1.登錄入口
我是通過點(diǎn)擊打開鏈接來當(dāng)做登錄入口的
部分代碼實(shí)現(xiàn):
driver = webdriver.Chrome() driver.get(url)
2.點(diǎn)擊“賬號密碼登錄”
selenium可以實(shí)現(xiàn)對網(wǎng)頁元素的定位,我這里是通過id屬性來定位“帳號密碼登錄”按鈕的。這里需要注意的是,有時(shí)候可能會因?yàn)榫W(wǎng)絡(luò)不好等問題導(dǎo)致加載登錄入口頁會很慢,所以在點(diǎn)擊“帳號密碼登錄”按鈕前,需要做一個(gè)判斷:判斷代表“帳號密碼登錄”的HTML元素是否已經(jīng)加載完成。
“賬號密碼登錄”按鈕的id屬性截圖:
部分代碼實(shí)現(xiàn):
element = WebDriverWait(driver, 5, 0.5).until( EC.presence_of_element_located((By.ID, "switcher_plogin")) ) # from selenium.webdriver.common.by import By element.click()
3.輸入賬號、密碼并點(diǎn)擊登錄
這一步比較簡單,直接上代碼:
driver.find_element_by_id('u').send_keys('123456') # 輸入用戶名 driver.find_element_by_id('p').send_keys('ccccc') # 輸入密碼 driver.find_element_by_id('login_button').click() # 點(diǎn)擊登錄
4.滑塊驗(yàn)證過程
1)簡要說明
因?yàn)橹饕康木褪菫榱四M滑塊驗(yàn)證,所以在輸入用戶名和密碼的時(shí)候直接選擇輸入“123456”和“ccccc”,這樣就必然會跳到滑塊驗(yàn)證的頁面:
接下來的問題就是如何模擬滑動的過程。這里首先要說一下,經(jīng)過多次測試發(fā)現(xiàn),TX的滑塊驗(yàn)證每次需要拖動的距離是有一定范圍的,“缺口”部分的位置基本上都在靠右側(cè)的一面,不像極驗(yàn)的滑塊驗(yàn)證,“缺口”部分可能出現(xiàn)在任意的位置,這樣在實(shí)現(xiàn)“滑動”過程前,就必須判斷每次滑動的距離是多少。所以,對于TX的滑塊驗(yàn)證,只要設(shè)置一個(gè)大概的距離“模擬滑動”即可,失敗的時(shí)候可以通過增減移動距離進(jìn)行重試,后面會進(jìn)一步說明。
2)為什么找不到“藍(lán)色滑塊”
前面已經(jīng)點(diǎn)擊了“登錄”并跳轉(zhuǎn)到“安全驗(yàn)證”的頁面,接著就是去模擬“拖動”截圖中的“藍(lán)色滑塊”,所以首先要告訴driver,代表“藍(lán)色滑塊”的html元素是什么。代表“藍(lán)色滑塊”的html元素截圖:
通過上面的截圖可以知道,id值為"tcaptcha_drag_button"的div標(biāo)簽代表的就是“藍(lán)色滑塊”,所以最開始我是直接嘗試去拖動它,但是這時(shí)候發(fā)現(xiàn)報(bào)錯(cuò)了,部分截圖如下:
報(bào)錯(cuò)的原因很明顯,在當(dāng)前得到的所有html元素中,找不到id值為"tcaptcha_drag_button"的div標(biāo)簽。這是為什么?
3)切換frame
為什么出現(xiàn)上面的問題?通過查找相關(guān)的資料才知道,在跳轉(zhuǎn)到“安全驗(yàn)證”的頁面的時(shí)候,“進(jìn)入”了一個(gè)新的frame,可以理解為,在“登錄頁面”嵌套了一個(gè)“驗(yàn)證頁面”,而當(dāng)前的driver加載的html元素全部都是“登錄頁面”的,想要找到并拖動“藍(lán)色滑塊”,就要先切換到“驗(yàn)證頁面”,這里通過driver.switch_to方法實(shí)現(xiàn):
iframe = driver.find_element_by_xpath('//iframe') # 找到“嵌套”的iframe driver.switch_to.frame(iframe) # 切換到iframe
4)模擬拖動
切換到iframe之后,就可以通過driver.find_element_by_id('tcaptcha_drag_button')找到“藍(lán)色滑塊”并拖動它了。拖動操作會用到selenium.webdriver的ActionChains類,部分代碼如下:
button = driver.find_element_by_id('tcaptcha_drag_button') # 找到“藍(lán)色滑塊” action = ActionChains(driver) # 實(shí)例化一個(gè)action對象 action.click_and_hold(button).perform() # perform()用來執(zhí)行ActionChains中存儲的行為 action.reset_actions() action.move_by_offset(180, 0).perform() # 移動滑塊
5)構(gòu)造移動軌跡
為了使拖動過程模擬的更“真實(shí)”,可以構(gòu)造一個(gè)滑動軌跡,我這里也是參考了別人的代碼看這里,簡單實(shí)現(xiàn)了一下,實(shí)際上TX新聞的滑塊驗(yàn)證對這方面好像要求不是很嚴(yán)格:
def get_track(distance): track = [] current = 0 mid = distance * 3 / 4 t = 0.2 v = 0 while current < distance: if current < mid: a = 2 else: a = -3 v0 = v v = v0 + a * t move = v0 * t + 1 / 2 * a * t * t current += move track.append(round(move)) return track
6)如何確定已經(jīng)“驗(yàn)證成功”了
接下來的問題就是,我如何告訴程序,已經(jīng)“驗(yàn)證成功”了呢?經(jīng)過測試發(fā)現(xiàn),當(dāng)拖動滑塊完成拼圖“驗(yàn)證成功”后,網(wǎng)頁又從“安全驗(yàn)證”的頁面又跳回了“登錄頁面”,滑動前截圖:
滑動驗(yàn)證成功的截圖:
成功后跳轉(zhuǎn)回“登錄”頁面:
通過上面的截圖我們可以知道,在“驗(yàn)證通過”之前,在“安全驗(yàn)證”頁面我們一直可以看到“拖動下方滑塊完成拼圖”的文字提示,也就是說,如果驗(yàn)證沒有通過,那么在當(dāng)前的所有html元素中,我們是可以找到文本為“拖動下方滑塊完成拼圖”的標(biāo)簽的:
通過截圖可以知道,該標(biāo)簽的class為"tcaptcha-title",通過driver.find_element_by_class_name('tcaptcha-title').text來判斷驗(yàn)證是否成功。
7)重試
前面說了,我們可以通過提前設(shè)置一個(gè)“可能的”值當(dāng)初始距離來移動滑塊,如果移動的距離“過長”,就減小該值當(dāng)做下次移動的距離,所以可以加一個(gè)while循環(huán)。以上過程實(shí)現(xiàn)的完整代碼如下:
# encoding=utf8 from time import sleep 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 url = 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?&low_login=0&appid=636014201&target=self&border_radius=1&maskOpacity=40&s_url=http%3A//www.qq.com/qq2012/loginSuccess.htm' def get_track(distance): track = [] current = 0 mid = distance * 3 / 4 t = 0.2 v = 0 while current < distance: if current < mid: a = 2 else: a = -3 v0 = v v = v0 + a * t move = v0 * t + 1 / 2 * a * t * t current += move track.append(round(move)) return track def main(): driver = webdriver.Chrome() driver.set_window_position(900, 10) driver.get(url) # 檢測id為"switcher_plogin"的元素是否加在DOM樹中,如果出現(xiàn)了才能正常向下執(zhí)行 element = WebDriverWait(driver, 5, 0.5).until( EC.presence_of_element_located((By.ID, "switcher_plogin")) ) element.click() sleep(1) # 輸入用戶名和密碼 driver.find_element_by_id('u').clear() driver.find_element_by_id('u').send_keys('123456') driver.find_element_by_id('p').clear() driver.find_element_by_id('p').send_keys('ccccc') sleep(1) # 點(diǎn)擊登錄 driver.find_element_by_id('login_button').click() sleep(5) # 切換iframe try: iframe = driver.find_element_by_xpath('//iframe') except Exception as e: print 'get iframe failed: ', e sleep(2) # 等待資源加載 driver.switch_to.frame(iframe) # 等待圖片加載出來 WebDriverWait(driver, 5, 0.5).until( EC.presence_of_element_located((By.ID, "tcaptcha_drag_button")) ) try: button = driver.find_element_by_id('tcaptcha_drag_button') except Exception as e: print 'get button failed: ', e sleep(1) # 開始拖動 perform()用來執(zhí)行ActionChains中存儲的行為 flag = 0 distance = 195 offset = 5 times = 0 while 1: action = ActionChains(driver) action.click_and_hold(button).perform() action.reset_actions() # 清除之前的action print distance track = get_track(distance) for i in track: action.move_by_offset(xoffset=i, yoffset=0).perform() action.reset_actions() sleep(0.5) action.release().perform() sleep(5) # 判斷某元素是否被加載到DOM樹里,并不代表該元素一定可見 try: alert = driver.find_element_by_class_name('tcaptcha-title').text except Exception as e: print 'get alert error: %s' % e alert = '' if alert: print u'滑塊位移需要調(diào)整: %s' % alert distance -= offset times += 1 sleep(5) else: print '滑塊驗(yàn)證通過' flag = 1 driver.switch_to.parent_frame() # 驗(yàn)證成功后跳回最外層頁面 break sleep(2) driver.quit() print "finish~~" return flag if __name__ == '__main__': main()
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么使用selenium模擬登錄解決滑塊驗(yàn)證問題的實(shí)現(xiàn)”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。