[py001]《30分鐘快速掌握Python Selenium Web自動化》共4章

網(wǎng)址:http://u6.gg/rKqTr

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

1.1、Selenium是什么?

??Selenium是一個Web自動化測試軟件。

1.2、在Python中安裝Selenium

    pip install selenium

1.3、下載瀏覽器驅(qū)動程序

??Selenium需要通過瀏覽器的驅(qū)動程序(webdriver)來連接和啟動一個瀏覽器。如果使用Firefox,那么需要geckodriver;如果使用Chrome,那么需要chromedriver;
??在這里,我們選擇谷歌的Chrome瀏覽器作為講解演示,所以我們需要下載chromedriver。
??網(wǎng)址:http://npm.taobao.org/mirrors/chromedriver/

??選擇版本-->選擇平臺-->下載解壓-->得到“chromedriver.exe“

1.4、總結(jié)

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

二、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("汪繼超 數(shù)據(jù)結(jié)構(gòu)")
  ''' 運行上述代碼,電腦會自動啟動Chrome瀏覽器,并打開百度的首頁,
  定位百度的輸入框,在其中輸入“汪繼超 數(shù)據(jù)結(jié)構(gòu)” '''

2.2 用例代碼解釋

??從selenium中導(dǎo)入和webdriver子模塊,webdriver提供了所有的瀏覽器驅(qū)動程序的實現(xiàn)調(diào)用方式:
?? 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()方法來清除輸入框中的內(nèi)容(雖然輸入框中并沒有內(nèi)容),然后使用send_keys()方法,將一個字符串發(fā)送到輸入框中:
?? inputs.clear()
?? inputs.send_keys("汪繼超 數(shù)據(jù)結(jié)構(gòu)")

2.3 總結(jié)

??這章,我們通過一個簡單的示例——操縱Chrome瀏覽器打開百度首頁,在輸入框中輸入搜索詞,完成了Selenium的初步介紹。Selenium還有更多的用法,在接下來的章幅中我們會一一介紹到。

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

??使用Selenium進行自動化操作,首先要做的就是通過webdriver的get()方法打開一個URL鏈接。在打開鏈接,完成頁面加載之后,就可以通過Selenium提供的接口,在頁面上進行各種操作了,下面我們來了解一下如何在查找元素。

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

??在上一章的示例中,我們就演示了如何通過find_element_by_id()方法,根據(jù)元素的id值來定位頁面元素。除了根據(jù)元素的id值來查找元素外,Selenium還提供了很多查找元素的方法。Selenium提供了近二十個find_element族的方法來供我們在頁面中查找元素,其中包括id、name、類名、css選擇器、鏈接文本、標(biāo)簽名、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

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

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文檔中查找節(jié)點的一種語言。對于Xpath的知識,在此不做介紹,有需要的同學(xué)看看專門介紹Xpath的網(wǎng)站或教程,比如:W3schhool Xpath教程。
??在此我們簡單介紹一下如何快速地通過瀏覽器獲取到頁面元素的Xpath路徑。在瀏覽器中打開網(wǎng)頁調(diào)試控制臺,在需要定位的元素上,單擊鼠標(biāo)右鍵,會出現(xiàn)一個選項欄,在“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 通過標(biāo)簽名來定位元素

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

  # 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 通過鏈接標(biāo)簽文字定位元素

??除了上述的元素定位方式,我們還可以通過a標(biāo)簽上的文字進行元素定位,使用的是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總結(jié)

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

四、使用Selenium在網(wǎng)頁上進行操作

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

4.1 模擬鍵盤鍵入

4.1.1 輸入文本

??在定位到元素之后,我們一般會做什么?如果定位的是input輸入框,那么我們可能需要在其中輸入一些值。想要實現(xiàn)這個功能,在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就會操縱瀏覽器在input輸入框內(nèi)輸入“汪繼超 數(shù)據(jù)結(jié)構(gòu)”

4.1.2 清除文本

??如果,輸入錯了,嗯,沒關(guān)系,我們可以使用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("汪繼超 數(shù)據(jù)結(jié)構(gòu)")
  inputs.clear()
4.1.3 實現(xiàn)點擊

??在input輸入框輸入了內(nèi)容之后,我們可能需要點擊“百度一下”按鈕進行搜索。這時候,我們可以定位到按鈕元素,再對按鈕元素執(zhí)行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("汪繼超 數(shù)據(jù)結(jié)構(gòu)")
  search_btn = driver.find_element_by_id('su')
  search_btn.click()

??這樣就完成了從輸入搜索詞,到點擊搜索的過程。除此之外,還有另外一種方法。

4.1.4 鍵盤功能鍵的鍵入

??另外一種方法就是,可以在輸入input輸入框的值之后,直接模擬回車鍵(因為百度提供了回車直接搜索的功能)。
??要模擬鍵入鍵盤上的回車,我們首先需要導(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)頁上使用鼠標(biāo)進行一些拖動操作,比如把一個元素拖動到另一個元素里面,把一個元素拖動到另一個位置上。
??在selenium中,有一個專門用于鼠標(biāo)行為的類名為ActionChains:
????from selenium.webdriver import ActionChains

其中定義了很多的鼠標(biāo)動作操作方法,比如:
click:鼠標(biāo)左鍵點擊;
click_and_hold:在元素上按住鼠標(biāo)左鍵;
context_click:在元素上執(zhí)行鼠標(biāo)右擊;
double_click:在元素上執(zhí)行鼠標(biāo)雙擊;
drag_and_drop:拖拽一個元素到另一個元素上;
drag_and_drop_by_offset:拖拽一個元素到另一個偏移量上;
move_by_offset:移動鼠標(biāo)指定的偏移量;
move_to_element:將鼠標(biāo)移動到某個元素上;
move_to_element_with_offset:通過指定元素的偏移量移動鼠標(biāo);
release :釋放一個元素上的鼠標(biāo)按鈕;
perform : 執(zhí)行定義的所有鼠標(biāo)動作;

??我們可以通過ActionChains類下面的方法進行豐富的鼠標(biāo)操作。
??先來看一個例子:http://sahitest.com/demo/dragDropMooTools.htm


??是一個自動化測試的demo,里面包含了一個可拖拽對象,我們可以通過它來測試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)
  # 移動dragger到目標(biāo)1
  action.drag_and_drop(dragger, item1).perform() 

4.3 切換窗口與框架

??如果我們使用Selenium打開了多個窗口,使用switch_to.window()方法可以很方便地對窗口進行切換。我們來看一個實際的例子,我們在搜狗的微信搜索中搜索“笑話”,然后點擊第一個搜索結(jié)果。如何將當(dāng)前的窗口切換回之前的搜索結(jié)果頁呢?看看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
  # 定位第一個搜索結(jié)果并新窗口打開
  article = driver.find_element_by_css_selector("div.txt-box > h3 > a")
  article.click()
  time.sleep(5)
  # 切換回第一個窗口
  driver.switch_to.window(window_1)

五、結(jié)語

??找不到說的,O(∩_∩)O哈哈~,就想告訴你:”恭喜學(xué)完《30分鐘快速掌握Python Selenium Web自動化》“。

??[1].代碼截止2019-03-11調(diào)試無誤。
??讓知識或技術(shù)實現(xiàn)其最大的價值,歡迎收藏自用、轉(zhuǎn)載分享,轉(zhuǎn)載請注明原文出處,謝謝!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,914評論 2 372