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()

具體例子代碼如下:
#導入子產品
#選擇浏覽器
#打開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鍵(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 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':'[email protected]|1541488878|1|mail126|00&99|gud&1541488546&mail126#gud&440100#10#0#0|&0|mail126|[email protected]'}
mailUser = {'path':'/','domain':'.126.com','name':'nts_mail_user', 'value':'[email protected]:-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驗證碼圖檔技術處理
這種方法需要研究驗證碼技術處理。
May there be enough clouds in your life to make a beautiful sunset...