selenium中文學習文檔鏈接:https://selenium-python-zh.readthedocs.io/en/latest/getting-started.html
selenium3+Python3安裝詳看鏈接:https://www.cnblogs.com/linxiu-0925/p/9597634.html
sublime text3安裝詳看鏈接:https://www.cnblogs.com/linxiu-0925/p/9636301.html
selenium3、sublime text3安裝過程在這就不細說了。
前提:
對於初學者來說,python自帶的IDLE,精簡又方便,不過一個好的編輯器能讓python編碼變得更方便,更加優美些。
不過呢,也可以自己去下載其他更好用的代碼編輯器,在這推薦:
PyCharm,這是一個專門為python而開發設計的編輯器,功能齊全,方便實用。
Sublime Text,它不僅僅提供python編譯,上面可以運行多種語言。畫面精簡美觀,功能特別強大,可以自己設計一些參數調試編輯器功能。不過對於初次接觸的人,安裝python編譯環境比較麻煩。
我前期使用的是python自帶的IDLE編寫代碼,后面使用sublime Text、pycharm來編寫代碼。
#1導入模塊
from selenium import webdriver
#2選擇瀏覽器
browser = webdriver.Chrome()
browser = webdriver.Firefox()
brower = webdriver.IE()
具體例子代碼如下:
#導入模塊
from selenium import webdriver
#選擇瀏覽器
browser = webdriver.Chrome()
#打開url
browser.get("http://www.baidu.com")
#關閉
browser.close()
3、查找元素
在一個頁面中有很多不同的策略可以定位一個元素。在你的項目中, 你可以選擇最合適的方法去查找元素。Selenium提供了下列的方法給你:
- find_element_by_id 定位唯一屬性id。
- find_element_by_name 定位帶有屬性name。
- find_element_by_xpath XPath是一種在XML文檔中定位元素的語言(比較難*)。
- find_element_by_link_text 定位文本鏈接。
- find_element_by_partial_link_ textpartial link定位是對 link定位的一種補充,有些文本鏈接會比較長,這個時候我們可以取文本鏈接的一部分定位,只要這一部分信息可以唯一地標識這個鏈接。
- find_element_by_tag_name 如打開任意一個頁面,查看前端都會發現大量的<d i v>、<input>, <a>等tag ,所以很難通過標tag name去區分不同的元素。
- find_element_by_class_name 定位帶有屬性class。
- find_element_by_css_selector CSS是一種語言,它用來描述HTML和XML文檔的表現。CSS使用選擇器來為頁面元素綁定屬性。(比較難*)
-
1.9 用By定位元素
針對前面介紹的8種定位方法,WebDriver還提供了另外一套寫法,即統一調用 find_element()方法 ,通過By來聲明定位的方法,並且傳入對應定位方法的定位參數。具體如下:
find_element(By.id,"kw")
find_element(By.name,"wd")
find_element(By.class_name,"s_ipt")
find_element(By.tag_name,"input")
find_element(By.link_text,"新 聞 ")
find_element(By.partial_link_text," 新 ")
find_element(By.XPath,"//* [@class = ‘bg s_btn’ ]")
find_element(By.CSS_selector,"span .bg s_btn_wr>input#su")
find_element()方法只用於定位元素。它需要兩個參數,第一個參數是定位的類型,由By提供;第二個參數是定位的具體方式。在使用By之前需要將By類導入。
from selenium.webdriver.common.by import By
一次查找多個元素 (這些方法會返回一個list列表):
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
除了上述的公共方法,下面還有兩個私有方法,在你查找也頁面元素的時候也許有用。 他們是 find_element 和 find_elements 。
另外還有通過BY元素屬性來查找元素。
例子:
在引用from selenium import webdriver的基礎上,還得引用from selenium.webdriver.common.by import By。
代碼如下:環境【selenium3+Python3+sublime text3】,
1、在sublime text3編寫代碼自動化登錄進入主頁的過程:輸入正確的賬號密碼,然后點擊登錄,進入測試網址的主頁面。
2、接着保存為py文件,如:openChrome.py,保存在D盤的py文件路徑下,
3、然后通過Windows電腦的cmd命令行運行python命令:python D:\py\openChrome.py,即可
selenium用法講解:
(1)瀏覽器操作:
WebDriver提供了maxmize_window()方法使打開的瀏覽器全屏顯示,其用法與set_window_sizeO相同, 但它不需要參數。
WebDriver提供了back()和forward()方法來模擬后退和前進按鈕。
WebDriver提供了refresh()方法模擬刷新。
WebDriver提供了截圖函數get_screenshot_as_file()來截取當前窗口。
如:driver.get_screenshot_as_file(r"C:\Users\baidu.png")
WebDriver還提供了close()方法,用來關閉當前窗口。
WebDriver還提供了quit()方法,用來退出驅動並關閉所有關聯的窗口。
(2)元素基本操作
clear(): 清除文本
send_keys ( * value): 模擬按鍵輸入
click(): 單擊元素
submit(): 提交表單
size: 返回元素的尺寸
text: 獲取元素的文本
current_url: 獲取當前URL
title: 獲取元素的標題
get_attribute(name):獲得屬性值
is_displayed():判斷該元素是否用戶可見
(3)鼠標事件
在WebDriver,將這些關於鼠標操作的方法封裝在ActionChains類提供:
click(on_element=None) ——單擊鼠標左鍵
click_and_hold(on_element=None) ——點擊鼠標左鍵,不松開
context_click(on_element=None) ——點擊鼠標右鍵
double_click(on_element=None) ——雙擊鼠標左鍵
drag_and_drop(source, target) ——拖拽到某個元素然后松開
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某個坐標然后松開
move_by_offset(xoffset, yoffset) ——鼠標從當前位置移動到某個坐標
move_to_element(to_element) ——鼠標移動到某個元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移動到距某個元素(左上角坐標)多少距離的位置
perform() ——執行鏈中的所有動作
release(on_element=None) ——在某個元素位置松開鼠標左鍵
send_keys(*keys_to_send) ——發送某個鍵到當前焦點的元素
send_keys_to_element(element, *keys_to_send) ——發送某個鍵到指定元素
使用的時候需導入:from selenium.webdriver.common.action_chains import ActionChains
(4)鍵盤事件
key_down(value, element=None) ——按下某個鍵盤上的鍵
key_up(value, element=None) ——松開某個鍵
send_keys(Keys.BACK_SPACE) 刪除鍵(backspace)
send_keys( Keys. SPACE) 空格鍵(space)
send_keys( Keys.TAB) 制表鍵(Tab)
send_keys( Keys. ESCAPE) 回退鍵(esc)
send_keys( Keys. ENTER) 回車鍵(enter)
send_keys(Keys.CONTROL,’a’) 全選(ctrl+A)
send_keys(Keys.CONTROL,’c’) 復制(ctrl+C)
send_keys(Keys.CONTROL,’x’) 剪切(ctrl+X)
send_keys(Keys.CONTROL,’v’) 粘貼(ctrl+v)
send_keys(keys.F1) 鍵盤F1
……
send_keys(keys.F12) 鍵盤F12
使用的時候需導入:from selenium.webdriver.common.keys import Keys
(5)設置元素等待
Webdriver提供了兩種類型的等待:顯式等待和隱式等待。
5.1)顯式等待
顯式等待使Webdriver等待某個條件成立時繼續執行,否則在達到最大時長時拋出超時異常(TimeoutException)。
WebDriverWait類是由WebDirver提供的等待方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間檢測不到則拋出異常。具體格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored__exceptions=None)
driver :瀏覽器驅動。
timeout :最長超時時間,默認以秒為單位.
poll__frequency:檢測的間隔(步長)時間,默認為0.58。
ignored_exceptions :超時后的異常信息,默認情況下拋NoSuchElementException異常。
WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的說明。
until(method,message=‘’)
調用該方法提供的驅動程序作為一個參數,直到返回值為True。
until_not(method, message=‘’)
調用該方法提供的驅動程序作為一個參數,直到返回值為False。
通過as關鍵字將expected_conditions重命名為EC,並調用presence_of_element_located()方法判斷元素是否存在。
記得導入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
5.2)隱式等待
隱式等待是通過一定的時長等待頁面上某元素加載完成。如果超出了設置的時長元素 還沒有被加載,則拋出 NoSuchElementException 異常。WebDriver 提供了 implicitly_wait() 方法來實現隱式等待,默認設置為0。
implicitly_wait()默認參數的單位為秒,本例中設置等待時長為10秒。首先這10秒並非一個固定的等待時間,它並不影響腳本的執行速度。其次,它並不針對頁面上的某一元素進行等待。當腳本執行到某個元素定位時,如果元素可以定位,則繼續執行;如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。假設在第6秒定位到了元素則繼續執行,若直到超出設置時長(10秒)還沒有定位到元素,則拋出異常。
記得導入:
from selenium.common.exceptions import NoSuchElementException
from time import *
5.3)休眠等待
腳本在執行到某一位置時做固定時間的休眠,尤其是在腳本調試過程中。這時可以使用sleep()方法,需要說明的是,sleep()方法由Python的time模塊提供。
當執行到sleep()方法時會固定休眠一定的時長,然后再繼續執行。sleep()方法默認參數以秒為單位,如果設置時長小於1秒,則可以用小數表示,如sleep(0.5)表示休眠0.5秒。
記得導入:
from time import * #from time import sleep
(6)復選框
Len()方法可以用來計算元素的個數;
click()方法是對某個元素進行勾選;
pop().click(),其實是對某個元素取消勾選。
如果只想勾選一組元素中的某一個該如何操作呢?
pop()或pop(-1): 默認獲取一組元素中的最后一個。
pop(0): 默認獲取一組元素中的第一個。
pop(1): 默認獲取一組元素中的第二個。
這樣就可以操作這一組元素中的任意一個元素了,只需數一數需操作的元素是這一組中的第幾個。
(7)多表單切換
switch_to_frame()默認可以直接取表單的id或name屬性,如果iframe沒有可用的id和name屬性,則可以通過下面的方式xpath進行定位。
xf=driver.find_element_by_xpath("//div[@id='loginDiv']/iframe")
driver.switch_to.frame(xf)
補充:
switch_to.parent_content()跳出當前一級表單;
switch_to.default_content()跳回最外層的頁面。
(8)多窗口切換
Webdriver提供了switch_to_window()方法,可以實現在不同的窗口之間切換。
current_window_handle:獲得當前窗口句柄。
window_handles:返回所有窗口的句柄到當前會話。
switch_to.window();用於切換到相應的窗口,與上一節的switch_to.frame ()類似,前者用於不同窗口的切換,后者用於不同表單之間的切換。
(9)警告框處理
在WebDriver中處理JavaScript所生成的alert、confirm以及prompt十分簡單,具體做法是使用switch_to_alert()方法定位到 aler/confim/prompt,然后使用 text/accept/dismiss/send_keys等方法進行操作。
1) text:返回aler/confirm/prompt中的文字信息。
2) accept():接受現有警告框。
3) dismiss():解散現有警告框。
4) send_keys(keysToSend): 發送文本至警告框。keysToSend:將文本發送至警告框。
(10)文件上傳、下載
對於Web頁面的上傳功能實現一般有以下兩種方式。
1) 普通上傳:普通的附件上傳是將本地文件的路徑作為一個值放在input標簽中,通過form表單將 這個值提交給服務器。
2) 插件上傳:一般是指Flash、Javascript、Ajax等技術所實現的上傳功能。
send_keys實現上傳
對於通過input標簽實現的上傳功能,可以將其看作是一個輸入框,即通過send_keys()指定本地文件路徑的方式實現文件上傳。
記得導入:import os
file_path='file:///'+os.path.abspath('upfile.html')
driver.get(file_path)
upfile.html就是文件名稱。
AutoIt實現上傳
AutoIt目前最新版本是v3,它是一個使用類似BASIC腳本語言的免費軟件,它被設計用來進行Windows GUI(圖形用戶界面)的自動化測試。它利用模擬鍵盤按鍵,鼠標移動和窗口/控件的組合來實現自動化任務。
官方網站:https://www.autoitscript.com/site/。
這種方式不推薦使用,因為生成的exe文件不在python里面,不可控。
文件下載
WebDriver允許我們設置默認的文件下載路徑,也就是說,文件會自動下載並且存放到設置的目錄中。
為了讓Firefox瀏覽器能實現文件下載,我們需要通過FirefoxProfile()對其做一些設置。
browser.download.folderList
設置成0代表下載到瀏覽器默認下載路徑,設置成2則可以保存到指定目錄。
browser.download.manager.showWhenStarting
是否顯示開始;True為顯示,Flase為不顯示。
browser.download.dir
用於指定所下載文件的目錄。Os.getcwd()函數不需要傳遞參數,用於返回當前的目錄。 browser.helperApps.neverAsk.saveToDisk
指定要下載頁面的Content_type值,“application/octet-stream”為文件的類型。
HTTP Content-type 常用對照表:http://tool.oschina.net/commons
#下載文件
from selenium import webdriver
import os
from time import *
from selenium.webdriver.common.action_chains import ActionChains
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",True)
fp.set_preference("browser.download.useDownloadDir","F:\\下載")
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")#下載文件的類型
driver = webdriver.Firefox(firefox_profile=fp)
driver.get("https://www.python.org/")#下載文件的URL
driver.implicitly_wait(10)
download = driver.find_element_by_link_text("Downloads")
ActionChains(driver).move_to_element(download).perform()
driver.find_element_by_link_text("Windows").click()
driver.find_element_by_link_text("Latest Python 3 Release - Python 3.7.1").click()
print("正在下載中")
sleep(10)
driver.quit()
(11)操作cookie
WebDriver操作cookie的方法:
1)get_cookiess():獲得所有 cookie 信息。
1) get_cookie(name):返回字典的 key 為“name” 的 cookie 信息。
2) add_cookie(cookie_dict):添加cookie。“cookie_dict”指字典對象,必須有name和value值。
4)delete_cookie(name,optionsString):刪除cookie信息。“name”是要刪除的cookie的名稱,“optionsString”是該cookie的選項,目前支持的選項包括“路徑”,“域”。
5)delete_all_cookies():刪除所有 cookie 信息。
from selenium import webdriver
from time import *
driver = webdriver.Chrome()
driver.get("http://www.youdao.com")
cookie = driver.get_cookies()
print(cookie)
driver.add_cookie({'name':'key-aaa','value':'value-bbb'})
cookie = driver.get_cookies()
for cookie in driver.get_cookies():
print("%s -> %s" % (cookie['name'], cookie['value']))
sleep(5)
driver.quit()
(12)滾動條操作
瀏覽器滾動條並沒有提供相應的操作方法。在這種情況下,就可以借助JavaScript來控制瀏覽器的滾動條。 WebDriver提供了execute_script()方法來執行JavaScript代碼。
js="window.scrollTo(100,450);"
driver.execute_script(js)
(13)HTML5的視頻播放
test_video.py
from selenium import webdriver
from time import *
driver=webdriver.Chrome()
driver.get("http://videojs.com/")
video=driver.find_element_by_xpath(".//*[@id='preview-player_html5_api']")
#返回文件的播放地址
url=driver.execute_script("return arguments[0].currentSrc;",video)
print(url)
print("start")
driver.execute_script("return arguments[0].play();",video)
#播放15秒
sleep(15)
print("stop")
driver.execute_script("arguments[0].pause();",video)
sleep(5)
driver.quit()
JavaScript函數有個內置的對象叫做arguements。arguements對象包含了函數調用的參數數組,[0]表示取對象的第1個值。
currentSrc熟悉返回當前音頻/視頻的URL。如果未設置音頻/視頻,則返回空字符串。
load()、play()、 pauseO等控制着視頻的加載、播放和暫停。
(14)驗證碼處理
記得導入:from random import randint
14.1去掉驗證碼
14.2設置萬能驗證碼
例子如下:
from selenium import webdriver
from random import randint
from time import *
verify = randint(1000,9999)
print("生成的隨機數:%d" %verify)
number = input("請輸入隨機數:")
print(number)
number = int(number)
if number == verify:
print("登錄成功")
elif number == 132741:
print("登錄成功")
else:
print("驗證碼輸入有誤")
14.3記錄cookie
通過向瀏覽器中添加cookie可以繞過登錄的驗證碼,這是比較有意思的一種解決方案。
使用cookie進行登錄最大的難點是如何獲得用戶名密碼的name ,如果找到不到name 的名字,就沒辦法向value 中輸用戶名、密碼信息。
我建議是可以通過get_cookies()方法來獲取登錄的所有的cookie信息,從而進行找到用戶名、密碼的name 對象的名字;
當然,最簡單的方法還是詢問前端開發人員。
cookie是由path,domain,name,value這些東西組成的。通過登錄之后查看抓取cookie
1查看代碼如下:
2直接可以復制的代碼如下:
from selenium import webdriver
from time import *
#通過添加cookie,記錄cookie信息,繞過登錄
driver = webdriver.Chrome()
driver.get("https://www.126.com")
for x in driver.get_cookies():
print(x)
#cookie是由path,domain,name,value這些東西組成的
#NTES_PASSPORT = {'path':'/','domain':'.126.com','name':'NTES_PASSPORT', 'value':'jGuQ23xnmeJG6.AeIMt26vpdD4VlM5yEuwyaIN9NiSciVQXFV_orx577QnRoUj9EBwk8vmaaKeGTVow.w0PyLqqDs1MMxO6sUjd1slzQOV6MCoUVcTOplG5PwYsdxyBtcJA2fYTIawueAA2nS2KV_i1HUny7ocH9PyJQwDIFFlqPR4DtPsqNrrignV_iShGt5'}
NTES_PASSPORT = {'path':'/','domain':'.126.com','name':'NTES_PASSPORT', 'value':'_zQyTK2ggkkMbFdViAGXlawfvSstsFHZRuCG3vvmENzi5EnP5.MfeYbbEcuMC_2tjpoTA1yy3hIB5MpUpqlzX66VvJOOeDGvCNk.E1G6unLqMiwhVTJA5BV0j6ggfC3OgHHs_bKmWvD6Gv53sNAmxVUATBfxfq_fLTyJTBo3tezVSz4RGiO6hDKfA00U4dweD'}
P_INFO = {'path':'/','domain':'.126.com','name':'P_INFO', 'value':'lili1505115417@126.com|1541488878|1|mail126|00&99|gud&1541488546&mail126#gud&440100#10#0#0|&0|mail126|lili1505115417@126.com'}
mailUser = {'path':'/','domain':'.126.com','name':'nts_mail_user', 'value':'lili1505115417@126.com:-1:1'}
driver.add_cookie(NTES_PASSPORT)
driver.add_cookie(P_INFO)
driver.add_cookie(mailUser)
sleep(1)
driver.get("https://www.126.com")
print("dengluhou")
for x in driver.get_cookies():
print(x)
sleep(5)
driver.quit()
14.4驗證碼圖片技術處理
這種方法需要研究驗證碼技術處理。