小白學 Python 爬蟲(28):自動化測試框架 Selenium (下)

小白學 Python 爬蟲(28):自動化測試框架 Selenium (下)

人生苦短,我用 Python


如果我的文章對您有幫助,請關注支持下作者的公眾號:極客挖掘機,您的關注,是對小編堅持原創的最大鼓勵:)

前文傳送門:

小白學 Python 爬蟲(1):開篇

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門

小白學 Python 爬蟲(5):前置準備(四)數據庫基礎

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝

小白學 Python 爬蟲(7):HTTP 基礎

小白學 Python 爬蟲(8):網頁基礎

小白學 Python 爬蟲(9):爬蟲基礎

小白學 Python 爬蟲(10):Session 和 Cookies

小白學 Python 爬蟲(11):urllib 基礎使用(一)

小白學 Python 爬蟲(12):urllib 基礎使用(二)

小白學 Python 爬蟲(13):urllib 基礎使用(三)

小白學 Python 爬蟲(14):urllib 基礎使用(四)

小白學 Python 爬蟲(15):urllib 基礎使用(五)

小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖

小白學 Python 爬蟲(17):Requests 基礎使用

小白學 Python 爬蟲(18):Requests 進階操作

小白學 Python 爬蟲(19):Xpath 基操

小白學 Python 爬蟲(20):Xpath 進階

小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)

小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)

小白學 Python 爬蟲(23):解析庫 pyquery 入門

小白學 Python 爬蟲(24):2019 豆瓣電影排行

小白學 Python 爬蟲(25):爬取股票信息

小白學 Python 爬蟲(26):為啥買不起上海二手房你都買不起

小白學 Python 爬蟲(27):自動化測試框架 Selenium 從入門到放棄(一)

小白學 Python 爬蟲(28):自動化測試框架 Selenium (下)

AJAX

在介紹交互之前,我們先簡單瞭解一下新名詞:AJAX 。

AJAX 全寫為 “Asynchronous Javascript And XML” (異步 JavaScript 和 XML),是指一種創建交互式網頁應用的網頁開發技術。

AJAX 是一種在無需重新加載整個網頁的情況下,能夠更新部分網頁的技術。

重點來了,我們如果在網站中使用 AJAX ,可以在整個網頁不刷新的情況下,更夠更新網頁上的顯示信息(DOM 節點),也就是 DOM 節點,這種技術被廣泛的應用到各個網站之中,最開始的時候,大家都只是使用它更新部分的網頁,也不知道是哪位大佬異想天開:既然 AJAX 可以更新部分網頁,那麼能不能用它來更新全部網頁呢?這就產生了現代的前端框架:React 、 Vue 和 Angular。

這種思想,現在被更加廣泛的應用於各大網站之中,因為這種方式,前端頁面上只有最基礎的 DOM 節點,其餘所有的 DOM 節點都是由 JavaScript 動態渲染出來的,而 JavaScript 都是經過打包處理的,可讀性極差。

那麼為什麼要選用前端框架呢? HTML + CSS + JQuery 就不行麼?

當然不是,其實之所以現在我們需要選擇框架,本質上是因為我們面臨的需求變了。大家肯定都明白如果我們只寫一個純展示信息的頁面,沒有任何交互功能的頁面,其實即便是現在,我們也是不需要選擇框架的,我們只需要寫幾行 CSS 和 HTML 就可以完成任務。

所以是因為我們面臨的需求變得複雜了,我們的應用經常需要在運行時做一些交互。

現代的前端開發,我們開發的應用經常需要在運行時來做一些交互,這些交互在早期只是個幻燈片或者 Tab 切換下拉菜單等一些簡單的交互,這些交互用 JQuery 實現完全沒什麼問題。但現代的前端我們的目標是用 Web 去 PK 原生應用,去和 Native 進行 PK 。

emmmmmmmmm,聊偏了,下面我們接著聊 Selenium 。

等待

如今,大多數 Web 應用程序都在使用 AJAX 技術。當瀏覽器加載頁面時,該頁面中的元素可能會以不同的時間間隔加載。這使定位元素變得困難:如果 DOM 中尚不存在元素,則定位函數將引發 ElementNotVisibleException 異常。使用等待,我們可以解決此問題。等待在執行的動作之間提供了一定的鬆弛時間-主要是定位元素或對該元素進行的任何其他操作。

Selenium Webdriver 提供兩種類型的等待-隱式和顯式。顯式等待使 WebDriver 等待特定條件發生,然後再繼續執行。隱式等待使 WebDriver 在嘗試查找元素時輪詢DOM一定時間。

顯式等待

我們可以使用 time.sleep() 來設定等待時間,完全沒有問題,但是它需要將條件設置為要等待的確切時間段。如果我們不知道準確的渲染時間,我們就無法設定一個比較合適的值。

Selenium 為我們提供了 WebDriverWait 與 ExpectedCondition 來完成這件事情,看代碼:

<code>

from

selenium

import

webdriver

from

selenium.webdriver.common.

by

import

By

from

selenium.webdriver.support.ui

import

WebDriverWait

from

selenium.webdriver.support

import

expected_conditions

as

EC driver = webdriver.Chrome() driver.get(

"https://www.jd.com/"

) try: element = WebDriverWait(driver,

10

).

until

( EC.presence_of_element_located((By.ID,

"key"

)) ) finally: driver.quit() /<code>

結果如下:

<code>

<

selenium.webdriver.remote.webelement.WebElement

(

session

=

"b1baacca997d18d7d54447127c844d15"

,

element

=

"a472369e-3196-4456-b43e-4e1b280bf5b9"

)>

/<code>

上面我們使用了 WebDriverWait 來設置最長等待時間,這裡我們選擇獲取 JD 首頁的輸入框,我們限定的等待時間為 10s ,如果它在 10s 內都無法返回結果,將會拋出 TimeoutException 。默認情況下, WebDriverWait 每 500 毫秒調用 ExpectedCondition ,直到成功返回。

隱式等待

隱式等待告訴 WebDriver 在嘗試查找不立即可用的一個或多個元素時在一定時間內輪詢 DOM 。默認設置為 0 。設置後,將在 WebDriver 對象的生存期內設置隱式等待。

<code>

from

selenium

import

webdriver driver = webdriver.Chrome() driver.implicitly_wait(

10

) driver.get(

"https://www.jd.com/"

) key = driver.find_element_by_id(

"key"

)

print

(key) /<code>

節點交互

Selenium 為我們提供了一些節點的交互動作,如輸入文字時可以用 send_keys() 方法,清空文字時可以用 clear() 方法,點擊按鈕時可以用 click() 方法。

<code>from selenium import webdriver
import 

time

driver = webdriver.Chrome() driver.implicitly_wait(

10

) driver.get(

'https://www.taobao.com/'

)

input

= driver.find_element_by_id(

'q'

)

input

.send_keys(

'IPad'

)

time

.sleep(

1

)

input

.clear()

input

.send_keys(

'Surface Pro'

) button = driver.find_element_by_class_name(

'btn-search'

) button.click() /<code>

在上面這個示例中,我們先打開淘寶網,並且開啟了隱式等待,先在搜索框中輸入了 IPad ,在等待 1s 後刪除,再輸入了 Surface Pro ,然後點擊了搜索按鈕,先在淘寶搜索需要用戶登錄才能搜索,所以我們直接跳轉到了登錄頁。

執行 JavaScript

對於某些 Selenium API 沒有提供的操作,我們可以通過模擬運行 JavaScript 的方式來完成,用到的方法是 execute_script() ,比如我們在淘寶首頁將滾動條滑到底部:

<code>

from

selenium

import

webdriver driver = webdriver.Chrome() driver.get(

'https://www.taobao.com/'

) driver.execute_script(

'window.scrollTo(0, document.body.scrollHeight)'

) /<code>

獲取信息

前面我們介紹瞭如何拿到 DOM 節點,那麼最重要的是我們要從 DOM 節點上來獲取我們需要的信息。

因為我們獲取的是 WebElement 類型,而 WebElement 也提供了相關的方法來提取節點信息。

<code>

from

selenium

import

webdriver

from

selenium.webdriver.chrome.options

import

Options chrome_options = Options() chrome_options.add_argument(

'--window-size=1366, 768'

) driver = webdriver.Chrome(chrome_options=chrome_options) url =

'https://www.geekdigging.com/'

driver.get(url) title = driver.find_element_by_xpath(

'//*[@id="text-4"]/div/div/div[1]/div[2]/a'

)

print

(title)

print

(title.get_attribute(

'href'

))

print

(title.text)

print

(title.location)

print

(title.size) /<code>

上面因為 Chrome 默認打開大小有點小,打開小編博客的時候小編選擇的這個 DOM 節點正好看到,所以小編設置了一下 Chrome 瀏覽器打開時的大小。

具體信息的提取小編列出了一部分,都加好註釋了,還有一部分比較有意思的屬性小編列在下面,供大家參考:

  • parent:查找到此元素的WebDriver實例的內部引用。
  • rect:具有元素大小和位置的字典。
  • screenshot_as_base64:以 base64 編碼字符串的形式獲取當前元素的屏幕快照。
  • screenshot_as_png:以二進制數據獲取當前元素的屏幕截圖。

最後這兩個獲取元素屏幕快照,在獲取驗證碼的時候將驗證碼截取出來會很好用的。

前進和後退

我們使用瀏覽器最上面的地方有一個前進和後退按鈕,Selenium 完成這兩個動作使用了 back() 和 forward() 這兩個方法。

<code>

import

time from selenium

import

webdriver browser = webdriver.

Chrome

() browser.

get

('https: browser.

get

('https: browser.

get

('https: browser.back() time.sleep(

1

) browser.forward() /<code>

這個各位同學應該都看的懂,小編就不多囉嗦了。

Cookies

又到了一個重點內容, Cookies ,它是和服務端保持會話的一個重要元素。 Selenium 為我們提供了一些方法,讓我們可以方便的對 Cookies 進行增刪改查等操作。示例如下:

<code>

from

selenium

import

webdriver browser = webdriver.Chrome() browser.get(

'https://www.geekdigging.com/'

)

print

(browser.get_cookies()) browser.add_cookie({

'name'

:

'name'

,

'domain'

:

'www.geekdigging.com'

,

'value'

:

'geekdigging'

})

print

(browser.get_cookies()) browser.delete_all_cookies()

print

(browser.get_cookies()) /<code>

Selenium 的簡單介紹就到這裡了,希望各位同學看完後能自己動手試一試,畢竟並不難。

小白學 Python 爬蟲(28):自動化測試框架 Selenium (下)

示例代碼

本系列的所有代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便大家取用。

示例代碼-Github

示例代碼-Gitee

參考

https://blog.csdn.net/caoxuecheng001/article/details/81290643

https://www.jianshu.com/p/02af89375b54

https://cuiqingcai.com/5630.html


分享到:


相關文章: