溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

快速掌握Python Selenium Web自動(dòng)化

發(fā)布時(shí)間:2020-09-23 11:02:56 來(lái)源:億速云 閱讀:257 作者:Leah 欄目:編程語(yǔ)言

這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹快速掌握Python Selenium Web自動(dòng)化,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

一、搭建Selenium環(huán)境

1.1 Selenium是什么?

Selenium是一個(gè)Web自動(dòng)化測(cè)試軟件。

1.2 在Python中安裝Selenium

pip install selenium

1.3 下載瀏覽器驅(qū)動(dòng)程序

Selenium需要通過(guò)瀏覽器的驅(qū)動(dòng)程序(webdriver)來(lái)連接和啟動(dòng)一個(gè)瀏覽器。如果使用Firefox,那么需要geckodriver;如果使用Chrome,那么需要chromedriver;

在這里,我們選擇谷歌的Chrome瀏覽器作為講解演示,所以我們需要下載chromedriver。

網(wǎng)址:http://npm.taobao.org/mirrors/chromedriver/

快速掌握Python Selenium Web自動(dòng)化

選擇版本-->選擇平臺(tái)-->下載解壓-->得到“chromedriver.exe“

1.4 總結(jié)

這章簡(jiǎn)單介紹了Selenium、在Python中安裝Selenium,以及下載合適的瀏覽器驅(qū)動(dòng)程序。

二、Selenium操縱瀏覽器的最基本用例

2.1 簡(jiǎn)單的使用Selenium

# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.clear()
inputs.send_keys("汪繼超 數(shù)據(jù)結(jié)構(gòu)")

''' 運(yùn)行上述代碼,電腦會(huì)自動(dòng)啟動(dòng)Chrome瀏覽器,并打開(kāi)百度的首頁(yè),

定位百度的輸入框,在其中輸入“汪繼超 數(shù)據(jù)結(jié)構(gòu)” '''

2.2 用例代碼解釋

從selenium中導(dǎo)入和webdriver子模塊,webdriver提供了所有的瀏覽器驅(qū)動(dòng)程序的實(shí)現(xiàn)調(diào)用方式:

from selenium import webdriver

實(shí)例化了一個(gè)Chrome瀏覽器的webdriver{在Chrome()方法中,我們通過(guò)executable_path指定了之前下載好的chromedriver.exe的路徑。}:

driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")

driver的get()方法將操縱瀏覽器打開(kāi)一個(gè)指定的URL,這一步將等待頁(yè)面完全加載完成:

driver.get("http://www.baidu.com")

在等待頁(yè)面加載完成之后,我們使用find_element_by_id()方法通過(guò)元素的ID來(lái)定位和查找頁(yè)面輸入框元素。在selenium中,webdriver提供了很多個(gè)方法來(lái)查找元素,其方法的名稱都為find_element_by_ *:

inputs = driver.find_element_by_id('kw')

在通過(guò)輸入框的id值定位到百度首頁(yè)的輸入搜索框之后,我們接著使用clear()方法來(lái)清除輸入框中的內(nèi)容(雖然輸入框中并沒(méi)有內(nèi)容),然后使用send_keys()方法,將一個(gè)字符串發(fā)送到輸入框中:

inputs.clear()
inputs.send_keys("汪繼超 數(shù)據(jù)結(jié)構(gòu)")

2.3 總結(jié)

這章,我們通過(guò)一個(gè)簡(jiǎn)單的示例——操縱Chrome瀏覽器打開(kāi)百度首頁(yè),在輸入框中輸入搜索詞,完成了Selenium的初步介紹。Selenium還有更多的用法,在接下來(lái)的章幅中我們會(huì)一一介紹到。

三、在Selenium中定位查找網(wǎng)頁(yè)元素的諸類方法

使用Selenium進(jìn)行自動(dòng)化操作,首先要做的就是通過(guò)webdriver的get()方法打開(kāi)一個(gè)URL鏈接。在打開(kāi)鏈接,完成頁(yè)面加載之后,就可以通過(guò)Selenium提供的接口,在頁(yè)面上進(jìn)行各種操作了,下面我們來(lái)了解一下如何在查找元素。

3.1 查找和定位網(wǎng)頁(yè)元素

在上一章的示例中,我們就演示了如何通過(guò)find_element_by_id()方法,根據(jù)元素的id值來(lái)定位頁(yè)面元素。除了根據(jù)元素的id值來(lái)查找元素外,Selenium還提供了很多查找元素的方法。Selenium提供了近二十個(gè)find_element族的方法來(lái)供我們?cè)陧?yè)面中查找元素,其中包括id、name、類名、css選擇器、鏈接文本、標(biāo)簽名、xpath等。

定位單個(gè)匹配元素的方法有:

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector

定位多個(gè)匹配元素的方法有:

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

我們可以根據(jù)不同頁(yè)面的不同情況來(lái)查找定位到我們所需要的頁(yè)面元素。

3.2 通過(guò)id屬性進(jìn)行定位

# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')

3.3 通過(guò)name屬性進(jìn)行定位

# coding:utf-8
from selenium import webdriver         
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_name('wd')

3.4 通過(guò)Xpath進(jìn)行元素定位

XPath是用于在XML文檔中查找節(jié)點(diǎn)的一種語(yǔ)言。對(duì)于Xpath的知識(shí),在此不做介紹,有需要的同學(xué)看看專門介紹Xpath的網(wǎng)站或教程,比如:W3schhool Xpath教程。

在此我們簡(jiǎn)單介紹一下如何快速地通過(guò)瀏覽器獲取到頁(yè)面元素的Xpath路徑。在瀏覽器中打開(kāi)網(wǎng)頁(yè)調(diào)試控制臺(tái),在需要定位的元素上,單擊鼠標(biāo)右鍵,會(huì)出現(xiàn)一個(gè)選項(xiàng)欄,在“copy”中選擇“Copy XPath”即可:

# coding:utf-8
from selenium import webdriver            
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_xpath('//*[@id="kw"]')

3.5 通過(guò)標(biāo)簽名來(lái)定位元素

我們想通過(guò)元素的標(biāo)簽名稱來(lái)定位一個(gè)元素時(shí),可以使用find_element_by_tag_name()這個(gè)方法,其將返回具有給定標(biāo)簽名稱的第一個(gè)元素:

# coding:utf-8
from selenium import webdriver          
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_tag_name('input')

3.6 通過(guò)class類名來(lái)定位元素

如果我們想通過(guò)元素的class屬性值來(lái)定位,那么可以使用find_element_by_class_name()方法。其將返回匹配的第一個(gè)元素,如果沒(méi)有匹配的元素,同樣會(huì)拋出NoSuchElementException異常:

# coding:utf-8
from selenium import webdriver             
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_class_name('s_btn')

3.7 通過(guò)CSS選擇器進(jìn)行定位元素

CSS選擇器是一種通過(guò)元素的CSS屬性值來(lái)定位元素的語(yǔ)法,我們可以使用find_element_by_css_selector()方法通過(guò)css選擇器定位元素:

# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_css_selector('input.s_btn')

3.8 通過(guò)鏈接標(biāo)簽文字定位元素

除了上述的元素定位方式,我們還可以通過(guò)a標(biāo)簽上的文字進(jìn)行元素定位,使用的是find_element_by_link_text()方法,如果我們需要定位到“視頻”那個(gè)鏈接元素上,就可以這樣操作:

# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_link_text('視頻')

3.9 總結(jié)

在這章,我們介紹了在使用Selenium打開(kāi)一個(gè)頁(yè)面之后,如何通過(guò)id屬性、name屬性、class屬性、Xpath路徑、CSS選擇器、標(biāo)簽名等方式對(duì)元素進(jìn)行查找和地位。成功定位頁(yè)面元素是對(duì)頁(yè)面進(jìn)行復(fù)雜操作的一個(gè)重要前提。

四、使用Selenium在網(wǎng)頁(yè)上進(jìn)行操作

在上一章中,我們介紹了如何使用Selenium在頁(yè)面中查找定位頁(yè)面元素。在定位到頁(yè)面元素之后,我們能夠做些什么呢?這章我們就將來(lái)簡(jiǎn)單了解一下。

4.1 模擬鍵盤鍵入

4.1.1 輸入文本

在定位到元素之后,我們一般會(huì)做什么?如果定位的是input輸入框,那么我們可能需要在其中輸入一些值。想要實(shí)現(xiàn)這個(gè)功能,在Selenium中,我們可以使用send_keys()方法,在上一章文章定位input元素的示例中,我們稍微演示了一下send_keys()的使用:

# coding:utf-8
from selenium import webdriver
             
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.send_keys("汪繼超 數(shù)據(jù)結(jié)構(gòu)")

這樣,selenium就會(huì)操縱瀏覽器在input輸入框內(nèi)輸入“汪繼超 數(shù)據(jù)結(jié)構(gòu)”

4.1.2 清除文本

如果,輸入錯(cuò)了,嗯,沒(méi)關(guān)系,我們可以使用clear()方法,對(duì)元素的值進(jìn)行清除:

# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.send_keys("汪繼超 數(shù)據(jù)結(jié)構(gòu)")
inputs.clear()

4.1.3 實(shí)現(xiàn)點(diǎn)擊

在input輸入框輸入了內(nèi)容之后,我們可能需要點(diǎn)擊“百度一下”按鈕進(jìn)行搜索。這時(shí)候,我們可以定位到按鈕元素,再對(duì)按鈕元素執(zhí)行click()方法進(jìn)行點(diǎn)擊:

# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.send_keys("汪繼超 數(shù)據(jù)結(jié)構(gòu)")
search_btn = driver.find_element_by_id('su')
search_btn.click()

這樣就完成了從輸入搜索詞,到點(diǎn)擊搜索的過(guò)程。除此之外,還有另外一種方法。

4.1.4 鍵盤功能鍵的鍵入

另外一種方法就是,可以在輸入input輸入框的值之后,直接模擬回車鍵(因?yàn)榘俣忍峁┝嘶剀囍苯铀阉鞯墓δ埽?/p>

要模擬鍵入鍵盤上的回車,我們首先需要導(dǎo)入直接相關(guān)的模塊:

from selenium.webdriver.common.keys import Keys

我們可以直接在send_keys()方法中使用:

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
         
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.send_keys("汪繼超 數(shù)據(jù)結(jié)構(gòu)",Keys.ENTER)
# search_btn = driver.find_element_by_id('su')
# search_btn.click()

其他鍵的使用方法也是一樣的。

4.2 模擬鼠標(biāo)行為

除了在輸入框中輸入文本,我們可能還經(jīng)常需要在網(wǎng)頁(yè)上使用鼠標(biāo)進(jìn)行一些拖動(dòng)操作,比如把一個(gè)元素拖動(dòng)到另一個(gè)元素里面,把一個(gè)元素拖動(dòng)到另一個(gè)位置上。

在selenium中,有一個(gè)專門用于鼠標(biāo)行為的類名為ActionChains:

from selenium.webdriver import ActionChains

其中定義了很多的鼠標(biāo)動(dòng)作操作方法,比如:

click:鼠標(biāo)左鍵點(diǎn)擊;

click_and_hold:在元素上按住鼠標(biāo)左鍵;

context_click:在元素上執(zhí)行鼠標(biāo)右擊;

double_click:在元素上執(zhí)行鼠標(biāo)雙擊;

drag_and_drop:拖拽一個(gè)元素到另一個(gè)元素上;

drag_and_drop_by_offset:拖拽一個(gè)元素到另一個(gè)偏移量上;

move_by_offset:移動(dòng)鼠標(biāo)指定的偏移量;

move_to_element:將鼠標(biāo)移動(dòng)到某個(gè)元素上;

move_to_element_with_offset:通過(guò)指定元素的偏移量移動(dòng)鼠標(biāo);

release :釋放一個(gè)元素上的鼠標(biāo)按鈕;

perform : 執(zhí)行定義的所有鼠標(biāo)動(dòng)作;

我們可以通過(guò)ActionChains類下面的方法進(jìn)行豐富的鼠標(biāo)操作。

先來(lái)看一個(gè)例子:http://sahitest.com/demo/dragDropMooTools.htm

快速掌握Python Selenium Web自動(dòng)化

是一個(gè)自動(dòng)化測(cè)試的demo,里面包含了一個(gè)可拖拽對(duì)象,我們可以通過(guò)它來(lái)測(cè)試Selenium的鼠標(biāo)拖拽事件:

# coding:utf-8 
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://sahitest.com/demo/dragDropMooTools.htm')
# 被拖拽元素
dragger = driver.find_element_by_id('dragger')  
# 目標(biāo)元素
item1 = driver.find_element_by_xpath('//div[text()="Item 1"]') 
time.sleep(3)
action = ActionChains(driver)
# 移動(dòng)dragger到目標(biāo)1
action.drag_and_drop(dragger, item1).perform()

4.3 切換窗口與框架

如果我們使用Selenium打開(kāi)了多個(gè)窗口,使用switch_to.window()方法可以很方便地對(duì)窗口進(jìn)行切換。我們來(lái)看一個(gè)實(shí)際的例子,我們?cè)谒压返奈⑿潘阉髦兴阉鳌靶υ挕?,然后點(diǎn)擊第一個(gè)搜索結(jié)果。如何將當(dāng)前的窗口切換回之前的搜索結(jié)果頁(yè)呢?看看switch_to.window()的方法:

# coding:utf-8
import time
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://weixin.sogou.com/')
inputs = driver.find_element_by_id('query')
inputs.clear()
inputs.send_keys("笑話")
submit = driver.find_element_by_css_selector("input.swz")
submit.click()
time.sleep(3)
# 獲取第一個(gè)窗口
window_1 = driver.current_window_handle
# 定位第一個(gè)搜索結(jié)果并新窗口打開(kāi)
article = driver.find_element_by_css_selector("div.txt-box > h4 > a")
article.click()
time.sleep(5)
# 切換回第一個(gè)窗口
driver.switch_to.window(window_1)

關(guān)于快速掌握Python Selenium Web自動(dòng)化就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI