今天想用利用python和selenium框架來練習下自動化登錄,看了好多網站登錄需要驗證碼對博主剛入門的人還是有點難度,因此想找一個不需要驗證碼的網站登錄,實在不好找,想着網易的產品還是做得很好的,所以去查看了網易相關的網站,發現網易嚴選登錄是不需要驗證碼的,不過還是遇到了坑(iframe切換)
從郵箱登錄界面開始:
找到了郵箱賬號輸入框的元素,如果你之前都依賴與用右鍵直接copy瀏覽器自動生成的xpathname,在這里一定不會奏效,這也告訴我們一定要自己學會寫xpath。在網易嚴選的這個登錄界面僅僅寫對xpath還是沒有用的,因為這里有一個坑,就是iframe框架,我們要的元素都是在這個框架下,因此要先切換到iframe才能繼續定位元素。你可以簡單認為iframe框架下的元素和背后的頁面不在同個界面里,因此我們無法直接定位到這個彈窗里的元素(這么說不一定合適)。
第一步:先定位iframe
如果iframe里有唯一的屬性,例如id和name,我們可以直接使用driver.switch_to_frame("id/name")就解決問題了,然后繼續用xpath進行元素定位。當然,如果你能確定這個頁面中有幾個iframe的時候,你可以直接用索引的方式來切換,如果這個頁面中有三個iframe,這個iframe處於第二個,可以寫成driver.switch_to_frame(1),從0開始的
在網易嚴選的這個頁面中,注意iframe的name=0,id是那么一串數字還有小數,很明顯是動態的id,刷新下就變了,因此不具備唯一的屬性,所以不能依靠屬性直接切換到iframe。所以我們先用xpath定位到iframe,在進行切換。仔細觀察下,發現iframe的父節點div具有唯一屬性的id=j-yx-mailLoginWrap,因此根據屬性匹配和絕對路徑的方式寫xpath:ele=driver.find_element_by_xpath("//*[@id='j-yx-mailLoginWrap']/iframe"),(當然也可以用其他很多方法來定位)。再執行driver.switch_to_frame(ele)就可以成功切換到iframe了。
第二步:xpath定位郵箱賬號輸入框
發現這個input的屬性非常多,這時候要注意屬性的唯一性,有的可能並不是唯一就會導致定位不准確,博主在這選擇了class屬性,下邊還有一個密碼輸入框,把它點開對比了下它們的class值。選用class作為屬性匹配,xpath寫成ele=driver.find_element_by_xpath("//*[@class='j-inputtext dlemail']"),這時候就大功告成了!
網易嚴選自動化郵箱賬號登錄python腳本代碼(博主在python自帶的集成開發環境下寫的,好處是可以看到每一步的變化):
python版本3.5
>>>from selenium import webdriver #導入webdriver
>>> b = webdriver.Firefox() #用的火狐瀏覽器
>>> b.get("http://you.163.com") #輸入url
>>> ele = b.find_element_by_xpath("//*[@class='j-yx-cp-topLogin']") #定位登錄按鈕
>>> ele.click() #點擊登錄按鈕
>>> ele = b.find_element_by_xpath("//*[@id='j-yx-loginFormWrap']/div/div[1]/div[1]/div[3]") #定位郵箱登錄按鈕
>>> ele.click() #點擊郵箱登錄按鈕切換到郵箱登錄
>>> ele1 = b.find_element_by_xpath("//*[@id='j-yx-mailLoginWrap']/iframe") #定位到iframe
>>> b.switch_to_frame(ele1) #切換到iframe
>>> ele2 = b.find_element_by_xpath("//*[@class='j-inputtext dlemail']") #定位賬號輸入框
>>> ele2.send_keys("xxx@163.com") #輸入郵箱賬號
>>>ele3 = b.find_element_by_xpath("//*[@class='j-inputtext dlpwd']") #定位密碼輸入框
>>> ele3.send_keys("xxx") #輸入密碼
>>> ele4 = b.find_element_by_xpath("//*[@id='dologin']") #定位登錄按鈕
>>> ele4.click() #點擊登錄按鈕