2019年4月13日 星期六

樹莓派安裝 Selenium 自動化套件

之前曾在 Windows 上測試過 Python 自動化模組 Selenium 模組, 參考 :

# Python 學習筆記 : Selenium 模組瀏覽器自動化測試 (一)
Python 學習筆記 : Selenium 模組瀏覽器自動化測試 (二)

在樹莓派上也可以安裝 Selenium 來自動執行網頁操作, 對於網路爬蟲無法企及, 必須模擬人工實際操作瀏覽器才能獲取的資料就必須仰賴 Selenium 了, 樹莓派的好處就是低功耗可全年開機運作, 身為 Automata 控的我怎會放過它呢, 哈哈哈.

pi@raspberrypi:~ $ pip3 install selenium   
Collecting selenium
  Downloading https://files.pythonhosted.org/packages/80/d6/4294f0b4bce4de0abf13e17190289f9d0613b0a44e5dd6a7f5ca98459853/selenium-3.141.0-py2.py3-none-any.whl (904kB)
Collecting urllib3 (from selenium)
  Using cached https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl
Installing collected packages: urllib3, selenium
Successfully installed selenium-3.141.0 urllib3-1.24.1

然後需安裝樹莓派預設瀏覽器 Chromium 的網頁驅動程式 (webdriver) :  chromium-chromedriver, 參考下面這兩篇文章 :

树莓派 python+selenium+chromium 安装及使用
Success: How to run Selenium Chrome webdriver on Raspberry pi

可找到 chromium-chromedriver 的下載網頁 :

https://launchpad.net/ubuntu/trusty/+package/chromium-chromedriver





樹莓派應下載 armhf (Updates) 的版本, 用 wget 下載 deb 檔 (2.7 MB) :

pi@raspberrypi:~ $ wget http://launchpadlibrarian.net/361669488/chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb 
--2019-04-12 21:07:14--  http://launchpadlibrarian.net/361669488/chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb
正在查找主機 launchpadlibrarian.net (launchpadlibrarian.net)... 91.189.89.229, 91.189.89.228, 2001:67c:1560:8003::8008, ...
正在連接 launchpadlibrarian.net (launchpadlibrarian.net)|91.189.89.229|:80... 連上了。
已送出 HTTP 要求,正在等候回應... 200 OK
長度: 2787410 (2.7M) [application/x-debian-package]
Saving to: ‘chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb’

chromium-chromedriv 100%[===================>]   2.66M   251KB/s    in 14s   

2019-04-12 21:07:28 (197 KB/s) - ‘chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb’ saved [2787410/2787410]

然後用 sudo dpkg 指令來安裝 deb 檔 :

pi@raspberrypi:~ $ sudo dpkg -i chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb 
選取了原先未選的套件 chromium-chromedriver。
(讀取資料庫 ... 目前共安裝了 139090 個檔案和目錄。)
Preparing to unpack chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb ...
Unpacking chromium-chromedriver (65.0.3325.181-0ubuntu0.14.04.1) ...
設定 chromium-chromedriver (65.0.3325.181-0ubuntu0.14.04.1) ...
pi@raspberrypi:~ $

dpkg 會將 chromium-chromedriver 安裝到 /usr/lib/chromium-browser/ 下的 chromedriver 檔 :

pi@raspberrypi:~ $ ls /usr/lib/chromium-browser/chromedriver -ls 
6188 -rwxr-xr-x 1 root root 6334180  3月 23  2018 /usr/lib/chromium-browser/chromedriver 

這樣便可以在 Python 程式中使用 Selenium 來控制 Chromium 瀏覽器了, 參考下面這篇文章 :

树莓派 python+selenium+chromium 安装及使用

不過我用下列指令會出現錯誤 :

browser=webdriver.Chrome(chromedriver,chrome_options=chrome_options)

錯誤訊息如下 :

>>> browser = webdriver.Chrome(chromedriver,chrome_options=chrome_options)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/pi/.local/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot connect to chrome at localhost:9222
from chrome not reachable
  (Driver info: chromedriver=2.35 (0),platform=Linux 4.14.98-v7+ armv7l)

但用下面這個被註解掉的指令卻可以 :

# browser=webdriver.Chrome(executable_path=chromedriver)   

測試紀錄如下 :

pi@raspberrypi:~ $ python3 
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux 
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; from selenium import webdriver 
&gt;&gt;&gt; from selenium.webdriver.chrome.options import Options 
&gt;&gt;&gt; import os   
&gt;&gt;&gt; chromedriver='/usr/lib/chromium-browser/chromedriver'    #Cromium 驅動程式位置
&gt;&gt;&gt; chrome_options=webdriver.ChromeOptions() 
&gt;&gt;&gt; chrome_options.add_experimental_option("debuggerAddress",  "localhost:9222")   #連接已開啟之瀏覽器, 避免每次開啟
&gt;&gt;&gt; os.environ["webdriver.chrome.driver"]=chromedriver    #指定驅動程式位置
&gt;&gt;&gt; browser = webdriver.Chrome(executable_path=chromedriver)    #開啟瀏覽器
&gt;&gt;&gt; browser.get("http://www.google.com")    #連線網站
&gt;&gt;&gt; browser.quit()     #關閉瀏覽器




執行 browser = webdriver.Chrome(executable_path=chromedriver) 指令時即開啟瀏覽器, 並傳回一個 WebDriver 物件. 注意, 這會花一點時間, 大約 5~10 秒左右. 另外, 瀏覽器開啟後, 上方會顯示 "Chrome 目前受到自動測試軟體控制" :




執行 browser.get("http://www.google.com") 指令即連線指定網站 :




呼叫 WebDriver 物件的 quit() 方法會關閉所開啟的瀏覽器.

以 Selenium 開啟瀏覽器後便可以進行操控, 參考之前於 Windows 上的測試 :

Python 學習筆記 : Selenium 模組瀏覽器自動化測試 (二)

以下主要測試操控網頁元素部分, 操作的網頁對象為 :

http://inventwithpython.com/

以下是在 Python Shell 下執行的結果 :

pi@raspberrypi:~ $ python3 
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from selenium import webdriver
>>> from selenium.webdriver.chrome.options import Options
>>> import os
>>> chromedriver='/usr/lib/chromium-browser/chromedriver'
>>> chrome_options=webdriver.ChromeOptions()
>>> chrome_options.add_experimental_option("debuggerAddress",  "localhost:9222")
>>> os.environ["webdriver.chrome.driver"]=chromedriver
>>> browser = webdriver.Chrome(executable_path=chromedriver)
>>> browser.get("http://inventwithpython.com/") 
>>> browser.set_window_size(720, 640)
>>> divEle=browser.find_element_by_id("navbarSupportedContent")
>>> print(divEle.tag_name)
div
>>> print(divEle.get_attribute("class"))
collapse navbar-collapse
>>> print(divEle.location)
{'x': 0, 'y': 0}
>>> print(divEle.text)

>>> classEles=browser.find_elements_by_class_name("nav-link")
>>> for ele in classEles:
...     print(ele.get_attribute("href"))
...
None

None
None
https://www.youtube.com/user/Albert10110
https://www.reddit.com/r/inventwithpython
http://inventwithpython.com/blog
http://inventwithpython.com/#donate
>>> browser.quit()

或者寫成 Python 程式檔案如下 :

#selenium_test.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
chromedriver='/usr/lib/chromium-browser/chromedriver'
chrome_options=webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress",  "localhost:9222")
os.environ["webdriver.chrome.driver"]=chromedriver
browser = webdriver.Chrome(executable_path=chromedriver)
browser.get("http://inventwithpython.com/")
browser.set_window_size(720, 640)
divEle=browser.find_element_by_id("navbarSupportedContent")
print(divEle.tag_name)
print(divEle.get_attribute("class"))
print(divEle.location)
print(divEle.text)
classEles=browser.find_elements_by_class_name("nav-link")
for ele in classEles:
    print(ele.get_attribute("href"))

用 Python3 執行結果 :

pi@raspberrypi:~ $ python3 selenium_test.py 
div
collapse navbar-collapse
{'x': 0, 'y': 0}

None
None
None
https://www.youtube.com/user/Albert10110
https://www.reddit.com/r/inventwithpython
http://inventwithpython.com/blog
http://inventwithpython.com/#donate

瀏覽器會開啟操作後自動關閉, 輸出結果與上面相同.

Bingo! 以後就可以在 24 小時開機的樹莓派上執行自動化的網頁操作了.

參考 :

套件: chromium-chromedriver
树莓派折腾selenium + chrome记录

1 則留言 :

吳傑克 提到...

你好如何與你聯絡呢 我想邀請你來幫我們上課