您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹快速掌握Python Selenium Web自動化,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
一、搭建Selenium環境
1.1 Selenium是什么?
Selenium是一個Web自動化測試軟件。
1.2 在Python中安裝Selenium
pip install selenium
1.3 下載瀏覽器驅動程序
Selenium需要通過瀏覽器的驅動程序(webdriver)來連接和啟動一個瀏覽器。如果使用Firefox,那么需要geckodriver;如果使用Chrome,那么需要chromedriver;
在這里,我們選擇谷歌的Chrome瀏覽器作為講解演示,所以我們需要下載chromedriver。
網址:http://npm.taobao.org/mirrors/chromedriver/
選擇版本-->選擇平臺-->下載解壓-->得到“chromedriver.exe“
1.4 總結
這章簡單介紹了Selenium、在Python中安裝Selenium,以及下載合適的瀏覽器驅動程序。
二、Selenium操縱瀏覽器的最基本用例
2.1 簡單的使用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("汪繼超 數據結構")
''' 運行上述代碼,電腦會自動啟動Chrome瀏覽器,并打開百度的首頁,
定位百度的輸入框,在其中輸入“汪繼超 數據結構” '''
2.2 用例代碼解釋
從selenium中導入和webdriver子模塊,webdriver提供了所有的瀏覽器驅動程序的實現調用方式:
from selenium import webdriver
實例化了一個Chrome瀏覽器的webdriver{在Chrome()方法中,我們通過executable_path指定了之前下載好的chromedriver.exe的路徑。}:
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver的get()方法將操縱瀏覽器打開一個指定的URL,這一步將等待頁面完全加載完成:
driver.get("http://www.baidu.com")
在等待頁面加載完成之后,我們使用find_element_by_id()方法通過元素的ID來定位和查找頁面輸入框元素。在selenium中,webdriver提供了很多個方法來查找元素,其方法的名稱都為find_element_by_ *:
inputs = driver.find_element_by_id('kw')
在通過輸入框的id值定位到百度首頁的輸入搜索框之后,我們接著使用clear()方法來清除輸入框中的內容(雖然輸入框中并沒有內容),然后使用send_keys()方法,將一個字符串發送到輸入框中:
inputs.clear() inputs.send_keys("汪繼超 數據結構")
2.3 總結
這章,我們通過一個簡單的示例——操縱Chrome瀏覽器打開百度首頁,在輸入框中輸入搜索詞,完成了Selenium的初步介紹。Selenium還有更多的用法,在接下來的章幅中我們會一一介紹到。
三、在Selenium中定位查找網頁元素的諸類方法
使用Selenium進行自動化操作,首先要做的就是通過webdriver的get()方法打開一個URL鏈接。在打開鏈接,完成頁面加載之后,就可以通過Selenium提供的接口,在頁面上進行各種操作了,下面我們來了解一下如何在查找元素。
3.1 查找和定位網頁元素
在上一章的示例中,我們就演示了如何通過find_element_by_id()方法,根據元素的id值來定位頁面元素。除了根據元素的id值來查找元素外,Selenium還提供了很多查找元素的方法。Selenium提供了近二十個find_element族的方法來供我們在頁面中查找元素,其中包括id、name、類名、css選擇器、鏈接文本、標簽名、xpath等。
定位單個匹配元素的方法有:
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
定位多個匹配元素的方法有:
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
我們可以根據不同頁面的不同情況來查找定位到我們所需要的頁面元素。
3.2 通過id屬性進行定位
# 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 通過name屬性進行定位
# 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 通過Xpath進行元素定位
XPath是用于在XML文檔中查找節點的一種語言。對于Xpath的知識,在此不做介紹,有需要的同學看看專門介紹Xpath的網站或教程,比如:W3schhool Xpath教程。
在此我們簡單介紹一下如何快速地通過瀏覽器獲取到頁面元素的Xpath路徑。在瀏覽器中打開網頁調試控制臺,在需要定位的元素上,單擊鼠標右鍵,會出現一個選項欄,在“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 通過標簽名來定位元素
我們想通過元素的標簽名稱來定位一個元素時,可以使用find_element_by_tag_name()這個方法,其將返回具有給定標簽名稱的第一個元素:
# 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 通過class類名來定位元素
如果我們想通過元素的class屬性值來定位,那么可以使用find_element_by_class_name()方法。其將返回匹配的第一個元素,如果沒有匹配的元素,同樣會拋出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 通過CSS選擇器進行定位元素
CSS選擇器是一種通過元素的CSS屬性值來定位元素的語法,我們可以使用find_element_by_css_selector()方法通過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 通過鏈接標簽文字定位元素
除了上述的元素定位方式,我們還可以通過a標簽上的文字進行元素定位,使用的是find_element_by_link_text()方法,如果我們需要定位到“視頻”那個鏈接元素上,就可以這樣操作:
# 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 總結
在這章,我們介紹了在使用Selenium打開一個頁面之后,如何通過id屬性、name屬性、class屬性、Xpath路徑、CSS選擇器、標簽名等方式對元素進行查找和地位。成功定位頁面元素是對頁面進行復雜操作的一個重要前提。
四、使用Selenium在網頁上進行操作
在上一章中,我們介紹了如何使用Selenium在頁面中查找定位頁面元素。在定位到頁面元素之后,我們能夠做些什么呢?這章我們就將來簡單了解一下。
4.1 模擬鍵盤鍵入
4.1.1 輸入文本
在定位到元素之后,我們一般會做什么?如果定位的是input輸入框,那么我們可能需要在其中輸入一些值。想要實現這個功能,在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("汪繼超 數據結構")
這樣,selenium就會操縱瀏覽器在input輸入框內輸入“汪繼超 數據結構”
4.1.2 清除文本
如果,輸入錯了,嗯,沒關系,我們可以使用clear()方法,對元素的值進行清除:
# 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("汪繼超 數據結構") inputs.clear()
4.1.3 實現點擊
在input輸入框輸入了內容之后,我們可能需要點擊“百度一下”按鈕進行搜索。這時候,我們可以定位到按鈕元素,再對按鈕元素執行click()方法進行點擊:
# 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("汪繼超 數據結構") search_btn = driver.find_element_by_id('su') search_btn.click()
這樣就完成了從輸入搜索詞,到點擊搜索的過程。除此之外,還有另外一種方法。
4.1.4 鍵盤功能鍵的鍵入
另外一種方法就是,可以在輸入input輸入框的值之后,直接模擬回車鍵(因為百度提供了回車直接搜索的功能)。
要模擬鍵入鍵盤上的回車,我們首先需要導入直接相關的模塊:
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("汪繼超 數據結構",Keys.ENTER) # search_btn = driver.find_element_by_id('su') # search_btn.click()
其他鍵的使用方法也是一樣的。
4.2 模擬鼠標行為
除了在輸入框中輸入文本,我們可能還經常需要在網頁上使用鼠標進行一些拖動操作,比如把一個元素拖動到另一個元素里面,把一個元素拖動到另一個位置上。
在selenium中,有一個專門用于鼠標行為的類名為ActionChains:
from selenium.webdriver import ActionChains
其中定義了很多的鼠標動作操作方法,比如:
click:鼠標左鍵點擊;
click_and_hold:在元素上按住鼠標左鍵;
context_click:在元素上執行鼠標右擊;
double_click:在元素上執行鼠標雙擊;
drag_and_drop:拖拽一個元素到另一個元素上;
drag_and_drop_by_offset:拖拽一個元素到另一個偏移量上;
move_by_offset:移動鼠標指定的偏移量;
move_to_element:將鼠標移動到某個元素上;
move_to_element_with_offset:通過指定元素的偏移量移動鼠標;
release :釋放一個元素上的鼠標按鈕;
perform : 執行定義的所有鼠標動作;
我們可以通過ActionChains類下面的方法進行豐富的鼠標操作。
先來看一個例子:http://sahitest.com/demo/dragDropMooTools.htm
是一個自動化測試的demo,里面包含了一個可拖拽對象,我們可以通過它來測試Selenium的鼠標拖拽事件:
# 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') # 目標元素 item1 = driver.find_element_by_xpath('//div[text()="Item 1"]') time.sleep(3) action = ActionChains(driver) # 移動dragger到目標1 action.drag_and_drop(dragger, item1).perform()
4.3 切換窗口與框架
如果我們使用Selenium打開了多個窗口,使用switch_to.window()方法可以很方便地對窗口進行切換。我們來看一個實際的例子,我們在搜狗的微信搜索中搜索“笑話”,然后點擊第一個搜索結果。如何將當前的窗口切換回之前的搜索結果頁呢?看看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) # 獲取第一個窗口 window_1 = driver.current_window_handle # 定位第一個搜索結果并新窗口打開 article = driver.find_element_by_css_selector("div.txt-box > h4 > a") article.click() time.sleep(5) # 切換回第一個窗口 driver.switch_to.window(window_1)
關于快速掌握Python Selenium Web自動化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。