Selenium是什么?一句話,自動化測試工具。它支持各種瀏覽器,包括 Chrome,Safari,F(xiàn)irefox 等主流界面式瀏覽器,python有selenium庫可以專門用來操縱瀏覽器,下面我用火狐瀏覽器為例介紹代碼登錄郵箱和空間的過程。
環(huán)境配置
首先安裝selenium,在終端執(zhí)行pipinstall selenium即可。 然后安裝火狐瀏覽器,如果本地有火狐瀏覽器即可忽略本操作。 安裝火狐驅(qū)動程序,F(xiàn)irefox的驅(qū)動geckodriver下載地址: https://github.com/mozilla/geckodriver/releases/ 下載解壓后把geckodriver.exe(linux是geckodriver文件)發(fā)到Python的安裝目錄的Scripts文件夾里面就可以了。
注:不使用火狐瀏覽器也可以使用谷歌瀏覽器Chrome,下載安裝Chrome,在 http://chromedriver.storage./index.html 或者 http://npm./mirrors/chromedriver/ 下載對應(yīng)的webdriver,對應(yīng)表如下

然后將chromedriver.exe文件放到python安裝目錄下的Scripts文件夾下即可
登錄qq郵箱
from selenium import webdriver
driver=webdriver.Firefox() driver.implicitly_wait(3) #設(shè)定隱式等待時間 driver.get('https://mail.qq.com/')
user='qq賬號' password='qq密碼'
webdriver提供八種元素定位方法,如表
方法 | 解釋 | find_ element_ by_id() | 通過id定位 | find_ element_ by_ name() | 通過name定位 | find_ element by_ class_ name() | 通過class name定位 | find_ element_ by_tag_ name() | 通過標(biāo)簽名定位 | find_ element_ by_link_text() | 通過文本鏈接定位 | find_ element_ by_ partial link_ text() | 通過文本鏈接的一部分定位 | find_ element_ by_xpath() | 通過絕對路徑定位 | find_ element_ by_ css_ selector() | 通過css選擇器定位 |
我在這里發(fā)現(xiàn)xpath(絕對路徑定位)比較方便,尤其是在使用工具的情況下,在火狐瀏覽器附加插件中,如圖

搜索xpath,選擇第一個插件

如圖,點擊圖片看原圖,這就是xpath的操作指南

這樣,我們就可以避免看復(fù)雜的網(wǎng)頁源代碼查找相關(guān)元素了,尤其是在網(wǎng)頁很復(fù)雜的情況下,合理使用xpath插件可以提高效率。 選擇基本版后,網(wǎng)頁變成這樣

好了,繼續(xù)補(bǔ)上代碼,如下
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/a[1]').click() #選擇 基本版 driver.implicitly_wait(3) driver.find_element_by_xpath('//*[@id='u']').clear() driver.find_element_by_xpath('//*[@id='u']').send_keys(user) #輸入賬號 driver.find_element_by_xpath('//*[@id='p']').clear() driver.find_element_by_xpath('//*[@id='p']').send_keys(password) #輸入密碼 driver.find_element_by_xpath('//*[@id='go']').click() #登錄
程序運行結(jié)果如下動態(tài)圖

登錄QQ空間
在qq空間的登錄界面,如圖,我們發(fā)現(xiàn),沒有基本版這個選擇捷徑了,就只能在中間那選擇二維碼登錄或者賬號密碼登錄
使用xpath定位的時候發(fā)現(xiàn)無法定位,如圖

但是別忘了,沒法定位是有原因的,鼠標(biāo)右鍵單擊這發(fā)現(xiàn)其實這是一個框架,選擇“查看框架源代碼”,在地址欄下刪除“view-source:” 回車,然后再用xpath重新定位,如圖


代碼如下: from selenium import webdriver
driver=webdriver.Firefox() driver.implicitly_wait(3) driver.get('https://qzone.qq.com/')
user='qqzhanghao' password='qqmima'
frame=driver.find_element_by_id('login_frame') driver.switch_to.frame(frame) driver.find_element_by_xpath('//*[@id='switcher_plogin']').click() #選擇賬號密碼登錄 driver.find_element_by_xpath('//*[@id='u']').clear() driver.find_element_by_xpath('//*[@id='u']').send_keys(user) driver.find_element_by_xpath('//*[@id='p']').clear() driver.find_element_by_xpath('//*[@id='p']').send_keys(password) driver.find_element_by_xpath('//*[@id='login_button']').click()
程序運行結(jié)果:

圖中程序點擊登陸的時候突然出現(xiàn)了網(wǎng)絡(luò)繁忙之類的,我馬上再點擊一下補(bǔ)了一刀,哈哈哈,完美。 寫在最后
登錄QQ空間和QQ郵箱的時候有可能要輸驗證碼,但是一直叫輸驗證碼肯定是異常情況,賬號或者密碼錯誤。 使用自己經(jīng)常使用的電腦一般不會輸驗證碼,但是自動化登錄頻率多了會。 其他瀏覽器在插件里輸入xpath發(fā)現(xiàn)工具還挺多,當(dāng)發(fā)現(xiàn)生成的絕對路徑很長的時候多半也是對的 當(dāng)?shù)卿浟薗Q可以直接點擊QQ頭像的那個圖標(biāo),使用自動化程序也是可以的,只是絕對路徑需要換一個工具查找,因為使用xpath finder的時候點一下圖標(biāo),路徑?jīng)]出現(xiàn),但是……已經(jīng)登錄了。
我的困惑:
在登錄QQ空間的時候我發(fā)現(xiàn)登錄界面是在一個框架里面的,在查網(wǎng)頁源代碼的時候我驚訝的發(fā)現(xiàn)框架竟然是被注釋掉了,如圖:

那么問題是,這段被注釋掉的代碼是如何執(zhí)行的呢?我是非常非常非常的驚訝,懇請大佬們回答,解決我目前最大的困惑。
|