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

 

具體例子代碼如下:

#導入模塊

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驗證碼圖片技術處理

 這種方法需要研究驗證碼技術處理。

 

 

 

 

 

 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM