Selenium 4 和 Selenium 3 主要有兩大差異, 以下分別說明。
WebDriver
從 Selenium 4.6 開始, 已經內建 Selenium manager, 它會在 PATH 指定的路徑下找不到 WebDriver 的執行檔時自動配置 WebDriver, 完全不需要自己下載檔案以及設定 PATH, 以下以 Firefox 為例:
>>> from selenium import webdriver
>>> driver = webdriver.Firefox()
即可自動配置 WebDriver 並開啟安裝的 Firefox 瀏覽器。
使用 Selenium manager 是最簡單方便的作法, 但如果你被迫使用較舊的版本, 必須自行下載安裝 WebDriver, 也要注意在建立 webdriver 物件時, 如果你的 WebDriver 執行檔並不在 PATH 指定的路徑下, 過去用來指定路徑的 executable_path
參數已經被棄用, 要改用 Service 物件。
不過自己要管理 WebDriver 執行檔其實有點麻煩, 不但要設定路徑, 還要跟著瀏覽器版本更新檔案, 比較簡單的方式是使用 webdriver-manager
pip install webdriver-manager
安裝後即可如下建立 webdriver 物件, 此處以 Windows 內建的 Edge 瀏覽器為例:
>>> from selenium import webdriver
>>> from webdriver_manager.microsoft import EdgeChromiumDriverManager
>>> from selenium.webdriver.edge.service import Service
>>> driver = webdriver.Edge(
... service=Service(EdgeChromiumDriverManager().install()))
這個 webdriver-manager 套件也可以用在 Selenium 3 上, 以 Firefox 為例:
>>> from selenium import webdriver
>>> from webdriver_manager.firefox import GeckoDriverManager
>>> driver = webdriver.Firefox(executable_path=GeckoD
... riverManager().install())
如果你的瀏覽器並不是安裝在預設的路徑上, 就必須自行在建立 webdriver 物件時以對應瀏覽器的 Option 物件指定瀏覽器執行檔的路徑。例如我有一個可攜式的 Chrome 位於 d:\apps\PortableApps\GoogleChromePortable\App\Chrome-bin\chrome.exe, 就可以透過以下方式建立 webdriver 物件:
>>> from selenium.webdriver.chrome.options import Options
>>> o = Options()
>>> o.binary_location = "d:\\apps\\PortableApps\\GoogleChromePortable\\App\\Chrome-bin\\chrome.exe"
>>> driver = webdriver.Chrome(options=o)
取得元素
Selenium 4 不提供 find_element_by_XXX
的方法, 只提供取得第一個元素 find_element
或是所有元素的 find_elements
方法, 可以搭配 By
類別指定找尋元素的依據。
此處以 https://www.w3schools.com/html/html_tables.asp 為例:
>>> driver.get("https://www.w3schools.com/html/html_tables.asp")
其中的表格 id 為 "customers", 若要取得格中的第一個儲存格, 可以這樣做:
>>> from selenium.webdriver.common.by import By
>>> td = driver.find_element(By.CSS_SELECTOR, "#customers td")
>>> td.text
'Alfreds Futterkiste'
或是也可以分段先取得表格元素, 再取出表格中的所有儲存格, 然後再取出其中的第一個儲存格:
>>> tab = driver.find_element(By.ID, "customers")
>>> tds = tab.find_elements(By.TAG_NAME, "td")
>>> len(tds)
18
>>> tds[0].text
'Alfreds Futterkiste'
Top comments (0)