用Python控制Chrome瀏覽器 — Selenium初體驗

Sean Yeh
Python Everywhere -from Beginner to Advanced
13 min readAug 13, 2020
Photo by Franck V. on Unsplash

身處現代社會的我們,每天不論是工作或者是娛樂等大小事,都會在網路上進行。換句話說,我們幾乎每天都不可避免的要操作網頁瀏覽器。此外,如果您是網頁應用App的開發者,免不了都要測試做出來App的使用者介面,這項工作可以說是非常繁雜且耗時費力的,同樣的步驟必須重複數次,而且也非常容易遺漏與出錯。您可曾想過,有沒有什麼方式可以模擬自己操作瀏覽器的步驟,這樣子就可以把麻煩而重複的開啟網頁,找尋資料的過程讓程式自動的幫您代勞?

Python中的Selenium模組可以模擬人類在瀏覽器操作的過程。幫我們寫出較為人性化的爬蟲,來擷取網路上面的資訊。本篇就要來體驗看看,要如何透過Selenium模組來自動化網頁瀏覽的一些程序。

安裝與啟用

安裝Selenium

在使用Selenium執行網站的操作前,首先需先確認是否已經安裝Selenium套件。我們可以使用pip安裝Selenium,或者是直接在Anaconda裡面安裝套件。下面是透過pip安裝的指令:

pip install selenium

匯入Selenium套件

使用的第一步就是在程式碼中匯入selenium套件。由於套件中的 webdriver可以幫助我們透過selenium開啟各種不同的瀏覽器驅動程式,好讓我們可以操作該瀏覽器的行為。我們直接使用from…import…的方式,匯入webdriver。

from selenium import webdriver

可以驅動的瀏覽器包括Microsoft的IE、Mozilla的Firefox以及Google 的 Chrome。在這裡我們會使用Google Chrome來進行說明。

Selenium可用的瀏覽器

下載Chrome WebDriver

由於selenium在Google Chrome 瀏覽器中操作必須透過Chrome WebDriver程式,我們必須先安裝該驅動程式。驅動程式可以到下面的網址下載適合自己作業系統的Chrome WebDriver驅動程式。

https://chromedriver.chromium.org/

依照Current Releases裡面的說明,確認自己目前使用的Chrome 瀏覽器版本後(目前我使用的版本是84.0.4147.xx),點進去:

再依照自己的作業系統( Windows、Mac或者是Linux)下載適當的檔案。

下載完畢後,將檔案放在專案裡面(目前我把檔案放在driver資料夾裡面)。如此,我們就可以使用webdriver.Chrome()建立一個Chrome瀏覽器物件。

然後我們用driver變數,標示webdriver.Chrome()物件。(當然,您也可以用別的名稱當變數。)括弧裡面放置剛剛下載的檔案路徑,可以參考如下:

driver = webdriver.Chrome('/your_path/your_project/driver/chromedriver')

您也可以用下面方式使用Chrome Webdriver:

#Simple assignment
from selenium.webdriver import Chrome
driver = Chrome()
#Or use the context manager
from selenium.webdriver import Chrome
with Chrome() as driver:
#your code inside this indent

開啟網頁

我們試著透過selenium來模擬瀏覽 google網頁的程序。

先使用url作為網址的變數,url裡面標示著google網頁的網址(這裡可以放任何欲瀏覽的網址)。

url ='https://www.google.com.tw'

接著使用webdriver.Chrome()物件的get方法來瀏覽網頁,由於我們已經用driver變數表示物件了,所以只要使用driver.get()就可以。

driver.get(url)

您可以試著執行上面的程式碼,如果一切正確的話,預期應該會在您的chrome瀏覽器開啟google首頁。

關閉網頁

如果希望關閉chrome瀏覽器的話,則使用close方法。我們可以把get()改成close()。

driver.close()

在執行看看,瀏覽器是不是已經關閉了?

尋找網頁上特定的元素

前面已經說明了要如何開啟與關閉瀏覽器,接下來我們要進一步模擬一般人瀏覽網頁的行為。

回想自己在google頁面上搜尋關鍵字時,是如何進行的?是不是先打開瀏覽器在網址列輸入google網址,待google頁面出現後再將欲查詢的關鍵字輸入搜尋框裡面?如果要透過Python模擬這樣子的行為,首先需要對元素進行「定位」,才可以繼續操作網頁的其他行為。

易言之,若要模擬在網頁上瀏覽並且點擊按鈕、超連結或輸入文字等瀏覽行為,我們必須先取得該網頁元素,才可以對這些特定的網頁元素進行操作。

Selenium提供多種取得網頁元素的方法。從Selenium提供的獲取網頁元素語法來看,我們可以大致上歸納為兩大類型:

(1). find_element_by_[元素類型]

(2). find_elements_by_[元素類型]

這兩種之間只有一個字母的差距(s)。其中單數的敘述,只會返回一個元素,也就是第一個符合條件的元素。而複數的敘述,則返回所有符合條件的元素,並且以list的形式回傳。

在此我們試試幾個方法:

我們先以中央氣象局的網站作為示範,網址是鄉鎮預報裡面的台北市信義區。

以id尋找

我們可以使用id來尋找。比如說,若要找尋網頁中id為table_top的標籤。方法如下:

driver.find_element_by_id('table_top')

執行後結果:

如果要顯示標籤內文字,可以使用text,結果如下:

以class名稱尋找

我們也可以使用class的名稱來尋找,並且使用text顯示內容。

driver.find_element_by_class_name('data-title').text

結果會顯示第一個符合class條件的內容。

此外,我們知道element加上s的複數敘述可以返回所有符合條件的元素,並且以list的形式回傳。我們使用 find_elements_by_class_name 來試試取得頁面上所有class名稱符合data-title的標籤,並且使用一個for迴圈來把內容顯示出來:

datas = driver.find_elements_by_class_name('data-title')
for data in datas:
print(data.text)

顯示的結果如下:

以CSS選擇器尋找

我們可以使用css的選擇器來尋找。例如我們要找一個表格(<table></table>)元素 <tr> 的class為uvi_wrap裡面的第一個<td>裡面<p>所包含的文字:

我們可以使用find_element_by_css_selector(element為單數)來尋找:

driver.find_element_by_css_selector('.uvi_wrap td p').text

顯示的結果如下:

以HTML標籤尋找

使用HTML的標籤來尋找,例如我們要尋找頁面中的第一個<h2>標籤。

driver.find_element_by_tag_name('h2').text

顯示的結果如下:

以name尋找

使用name來尋找。例如:

driver.find_element_by_name('PID')

結果:

以超連結文字尋找

除了上面說明的選擇器外,我們也可以直接使用超連結裡面的文字來尋找。從下面的原始檔案來看,假設要找尋的按鈕為「逐三小時預報」與「過去24小時」時,可以使用find_element_by_link_text 這個選定超連結文字的方式。

我們在這裡試著找到元素,並且使用click來點擊該元素。

e1 = driver.find_element_by_link_text('逐三小時預報')
e1.click()
e2 = driver.find_element_by_link_text('過去24小時')
e2.click()

測試的上面程式碼時候,您應該會觀察到超連結上面的橘色框框從「逐三小時預報」移動到「過去24小時」的現象。出現橘色框框的原因是超連結按鈕<a>被對焦(foucus)到的關係。

Webdriver的一些屬性與方法

此外webdriver,還提供很多屬性與方法,下面分幾個類型說明:

與網址相關

  • get(url) :瀏覽網址,url就是我們要瀏覽的網址。
  • current_url:取得目前的網址。例如:
driver.current_url

與讀取網頁相關

  • title:讀取網頁的title標題。例如:
driver.title
  • page_source:讀取網頁原始碼。例如:
driver.page_source
  • text:讀取元素內容。這個前面已經示範過多次,在此省略。
  • size:回傳元素大小。例如取得<h2>標籤的大小:
driver.find_element_by_tag_name('h2').size

結果顯示<h2>標籤寬與高的大小尺寸。

與視窗相關

  • get_window_position():取得瀏覽器視窗的位置,視窗以左上角開始計算。例如:
position = driver.get_window_position() 
x01 = position.get('x')
y01 = position.get('y')

印出結果為1440與 114。您可以移動視窗位置後,再試著執行上面的程式碼,看看印出的數字是否改變?

  • set_window_position(x, y):設定瀏覽器視窗以左上角的位置。例如:
driver.set_window_position(0, 0)

當位置座標設為(0,0)的時候(如上面程式碼),畫面會與螢幕的左上角對齊。您可以試試下面的程式碼,看看視窗會有什麼反應?是不是會上下跳動?

for i in range(0,300,40):
for j in range(0,300,100):
driver.set_window_position(i, j)
  • maximize_window():最大化瀏覽器視窗。例如:
driver.maximize_window()
  • minimize_window():最小化瀏覽器視窗。例如:
driver.minimize_window()
  • fullscreen_window():瀏覽器視窗全螢幕。例如:
driver.fullscreen_window()
  • get_window_size():取得瀏覽器視窗的大小。
driver.get_window_size()

執行後,會取得瀏覽器視窗的寬度與高度。您也可以單獨的取得寬度與高度:

width = driver.get_window_size().get("width") 
height = driver.get_window_size().get("height")
  • set_window_size(x, y):設定瀏覽器視窗的大小,寬度與高度。例如:
driver.set_window_size(1024, 768)

與網頁操作相關

  • refresh():重新整理網頁。例如:
driver.refresh()
  • back():返回上一頁。例如:
driver.back()
  • forward():進入下一頁。例如:
driver.forward()
  • close():關閉瀏覽器或者是瀏覽器Tab標籤。例如:
driver.close()
  • quit():關閉瀏覽器,並且退出驅動程式的程序。例如:
driver.quit()

與網頁元素相關

  • send_keys():鍵盤輸入。例如:
search_box.send_keys("foo")
  • submit():送交。例如:
driver.find_element_by_id("Btn").submit()

以上是webdriver的一些屬性與方法,大家可以發揮想像力,透過這些屬性與方法,來設計出適合自己的網頁自動化程序。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。