天天看點

web端自動化——selenium3用法詳解

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

web端自動化——selenium3用法詳解

具體例子代碼如下:

#導入子產品

#選擇浏覽器

#打開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子產品提供。

web端自動化——selenium3用法詳解

當執行到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 ()類似,前者用于不同視窗的切換,後者用于不同表單之間的切換。

web端自動化——selenium3用法詳解

(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:将文本發送至警告框。

web端自動化——selenium3用法詳解

(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

web端自動化——selenium3用法詳解
1檢視代碼如下:      
web端自動化——selenium3用法詳解
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...