note Selenium Webdriver Python Tutorial
繼續閱讀...
利用Selenium package 搞定一些簡單的網頁自動填入
(其實只是公司EIP太煩 每次填一些出差資料跟加班之類的都花滿多時間)
這一篇先簡單介紹Selenium是什麼 怎麼做網頁填入
大多是網路資料整理,參考資料附在最後面
---------
簡單介紹
2004年 Jason Huggins在開發網頁時,覺得有時候在檢查程式碼修正時耗費太多時間,所以用javascript寫了一個模組,可以靠程式語言就幫他作完網頁功能的測試,不用自己開網頁測試。這個模組就叫Selenium。
2006年Google工程師 Simon Stewart,開啟了一個項目叫Webdriver,起源是因為太多Google工程師都仰賴Selenium這個厲害的工具,但是...Because of its Javascript based automation engine and the security limitations browsers apply to Javascript, different things became impossible to do...
但是這兩個項目發展都有他的弱點,所以在2008年的時候這兩個項目就被合併,成為"Selenium 2" (aka. Selenium WebDriver),也就是我們今天在談的Selenium了。
為什麼要介紹這段歷史?因為當我們在學的時候,一定會碰到WebDriver
http://www.51testing.com/zhuanti/webdriver.htm
這個中文網頁有簡單介紹 參考
---------
先用一個簡單的例子介紹(取自techbeamers),Google關鍵字並蒐集搜尋結果
進入正題前
先安裝 selenium
進入終端機 利用pip安裝即可
2017/07/05 安裝 最新版本是 3.4.3
進入正題,開始python編輯。
Step-1.
Selenium webdriver module 支援Firefox, Chrome, Internet Explorer, Safari,這些都已經內建在selenium package裡,所以直接呼叫即可。
此外,我們還需要一個東西叫IEDriver,也就是建立一個內部伺服器,再從這個伺服器開啟網頁,以便處理webdriver跟IE之間的protocol。
* This driver is a standalone server executable which enforces the WebDriver’s wire protocol to work as a link between the test script and Internet Explorer browser.
在selenium的官網上便有官方的iedriver可以下載,http://www.seleniumhq.org/download/,找"The Internet Explorer Driver Server",並把這個exe檔先存在跟你的python腳本同一個地址。
=> from selenium import webdriver
=> import os
透過os模組先設定好exe檔的位置。
=> dir = os.path.dirname(__file__)
=> ie_driver_path = dir + "\IEDriverServer.exe"
Step-2.
現在有了webdriver可以調用瀏覽器api,接下來就是要開始load page,意思就是要給他一個網頁物件,讓他透過selenium的指令去讀取。以IE舉例,我們先要給他一個IE物件,才能調用IE的瀏覽器api。dirver是參數名,代表IE物件。
=> driver = webdriver.Ie(ie_driver_path)
現在開啟了IE,但是還有一些簡單的條件建議都先設好。
=> driver.maximize_window()
=> driver.implicitly_wait(30)
第一行比較簡單,就是把網頁放大。
第二行的目的是等網頁元件完成,除了implicitly wait之外還有其他方式
implicitly Wait: 這種等待通常適用在整個程式的預設等待。因此這樣的等待方式也是最常用的。當網頁元件暫時找不到時,程式會進行等待,等到所指定的timeout為止。
Explicit Wait: 這種等待通常是針對特別指定的網頁元件。通常我們不會每一個網頁元件都做這樣的等待。只要針對”特別”的網頁元件。
Thread.sleep(1000): 等待 1秒,直接利用時間計時。
Step-3.
下一步,利用webdriver的get()方式,讓網頁進入我們想要控制的網址。
當讀取完畢,此時便代表selenium可以控制網頁元件,但是每一個網頁的元件設定/名稱/功能都不同,所以要先找到"那個"元件,才能達成我們目標任務。
=> driver.get("http://www.google.com")
Step-4.
就這個案例,我們要找到google網頁那個搜尋的框框,可以透過網頁原始碼,或chrome的開發者工具,去確定你找的元件是對的。
像這樣
我們現在知道,這個搜尋框框的元件屬性id是 <lst-ib>。
回到selenium,透過尋找id的方式來找元件。(後續介紹不同的搜尋元件方式)
=> search_field = driver.find_element_by_id("lst-ib")
接下來就是把這個textbox 先清除既有資料,再輸入我們要搜尋的資料,輸入完之後submit。
=> search_field.clear()
=> search_field.send_keys("python tutorial")
=> search_field.submit()
submit之後進入result page,取得搜尋結果的list。
(萃取搜尋結果的方式是利用class的名稱去return,直接留原文給大家參考)
*The result page shows a list of entries that match the searched text. Each of the entry in the list is captured in anchor <a> element and can be accessed using “find_elements_by_class_name” method. Using this it will return a list of elements as:
=> lists= driver.find_elements_by_class_name("_Rm")
list就是搜尋結果~ 搭拉~
---------
##補充一
搜尋網頁元件方法(1與2出現在上面範例中)
1. 透過attribute id
<div id="XXX">...</div>
=>find_elements_by_id()
2. 透過class name
<div class="XXX">...</div>
=>find_elements_by_class_name()
3. 透過tag name
<XXX src="...">...</XXX>
=>find_elements_by_tag_name()
4. 透過標籤名稱
<input name="XXX">...</input>
=>find_elements_by_name()
5. 超連結文字
<a href="...">XXX</a>
=>find_elements_by_link_text()
=>find_elements_by_partial_link_text()
定位一組就用elements 單個元件就用element
(但id通常都是用來找單個元件,其他的則不拘)
---------
##補充二
除了輸入資料之外,還可以對網頁作快捷鍵操作
上面就代表了做了 control+a 的全選動作
http://selenium-python.readthedocs.io/api.html
還有一些拖拉、滑鼠點擊等動作可以參考
---------
後續心得...
Selenium對一般網頁操作都很簡單 但是如果有進iframe就會比較麻煩
再來,Selenium 目前對IE的ModalDialog的支援很差
抓不到由ModalDialog所跳出的強制視窗
---------
參考資料
http://www.seleniumhq.org/docs/01_introducing_selenium.jsp#test-automation-for-web-applications
http://www.techbeamers.com/selenium-webdriver-python-tutorial/
http://cuiqingcai.com/2599.html
http://pan.baidu.com/s/1ntE7Zw1
http://selenium-python.readthedocs.io/
http://www.qa-knowhow.com/?p=1832
利用Selenium package 搞定一些簡單的網頁自動填入
(其實只是公司EIP太煩 每次填一些出差資料跟加班之類的都花滿多時間)
這一篇先簡單介紹Selenium是什麼 怎麼做網頁填入
大多是網路資料整理,參考資料附在最後面
---------
簡單介紹
2004年 Jason Huggins在開發網頁時,覺得有時候在檢查程式碼修正時耗費太多時間,所以用javascript寫了一個模組,可以靠程式語言就幫他作完網頁功能的測試,不用自己開網頁測試。這個模組就叫Selenium。
2006年Google工程師 Simon Stewart,開啟了一個項目叫Webdriver,起源是因為太多Google工程師都仰賴Selenium這個厲害的工具,但是...Because of its Javascript based automation engine and the security limitations browsers apply to Javascript, different things became impossible to do...
但是這兩個項目發展都有他的弱點,所以在2008年的時候這兩個項目就被合併,成為"Selenium 2" (aka. Selenium WebDriver),也就是我們今天在談的Selenium了。
為什麼要介紹這段歷史?因為當我們在學的時候,一定會碰到WebDriver
http://www.51testing.com/zhuanti/webdriver.htm
這個中文網頁有簡單介紹 參考
---------
先用一個簡單的例子介紹(取自techbeamers),Google關鍵字並蒐集搜尋結果
進入正題前
先安裝 selenium
進入終端機 利用pip安裝即可
2017/07/05 安裝 最新版本是 3.4.3
進入正題,開始python編輯。
Step-1.
Selenium webdriver module 支援Firefox, Chrome, Internet Explorer, Safari,這些都已經內建在selenium package裡,所以直接呼叫即可。
此外,我們還需要一個東西叫IEDriver,也就是建立一個內部伺服器,再從這個伺服器開啟網頁,以便處理webdriver跟IE之間的protocol。
* This driver is a standalone server executable which enforces the WebDriver’s wire protocol to work as a link between the test script and Internet Explorer browser.
在selenium的官網上便有官方的iedriver可以下載,http://www.seleniumhq.org/download/,找"The Internet Explorer Driver Server",並把這個exe檔先存在跟你的python腳本同一個地址。
=> from selenium import webdriver
=> import os
透過os模組先設定好exe檔的位置。
=> dir = os.path.dirname(__file__)
=> ie_driver_path = dir + "\IEDriverServer.exe"
Step-2.
現在有了webdriver可以調用瀏覽器api,接下來就是要開始load page,意思就是要給他一個網頁物件,讓他透過selenium的指令去讀取。以IE舉例,我們先要給他一個IE物件,才能調用IE的瀏覽器api。dirver是參數名,代表IE物件。
=> driver = webdriver.Ie(ie_driver_path)
現在開啟了IE,但是還有一些簡單的條件建議都先設好。
=> driver.maximize_window()
=> driver.implicitly_wait(30)
第一行比較簡單,就是把網頁放大。
第二行的目的是等網頁元件完成,除了implicitly wait之外還有其他方式
implicitly Wait: 這種等待通常適用在整個程式的預設等待。因此這樣的等待方式也是最常用的。當網頁元件暫時找不到時,程式會進行等待,等到所指定的timeout為止。
Explicit Wait: 這種等待通常是針對特別指定的網頁元件。通常我們不會每一個網頁元件都做這樣的等待。只要針對”特別”的網頁元件。
Thread.sleep(1000): 等待 1秒,直接利用時間計時。
Step-3.
下一步,利用webdriver的get()方式,讓網頁進入我們想要控制的網址。
當讀取完畢,此時便代表selenium可以控制網頁元件,但是每一個網頁的元件設定/名稱/功能都不同,所以要先找到"那個"元件,才能達成我們目標任務。
=> driver.get("http://www.google.com")
Step-4.
就這個案例,我們要找到google網頁那個搜尋的框框,可以透過網頁原始碼,或chrome的開發者工具,去確定你找的元件是對的。
像這樣
我們現在知道,這個搜尋框框的元件屬性id是 <lst-ib>。
回到selenium,透過尋找id的方式來找元件。(後續介紹不同的搜尋元件方式)
=> search_field = driver.find_element_by_id("lst-ib")
接下來就是把這個textbox 先清除既有資料,再輸入我們要搜尋的資料,輸入完之後submit。
=> search_field.clear()
=> search_field.send_keys("python tutorial")
=> search_field.submit()
submit之後進入result page,取得搜尋結果的list。
(萃取搜尋結果的方式是利用class的名稱去return,直接留原文給大家參考)
*The result page shows a list of entries that match the searched text. Each of the entry in the list is captured in anchor <a> element and can be accessed using “find_elements_by_class_name” method. Using this it will return a list of elements as:
=> lists= driver.find_elements_by_class_name("_Rm")
list就是搜尋結果~ 搭拉~
---------
##補充一
搜尋網頁元件方法(1與2出現在上面範例中)
1. 透過attribute id
<div id="XXX">...</div>
=>find_elements_by_id()
2. 透過class name
<div class="XXX">...</div>
=>find_elements_by_class_name()
3. 透過tag name
<XXX src="...">...</XXX>
=>find_elements_by_tag_name()
4. 透過標籤名稱
<input name="XXX">...</input>
=>find_elements_by_name()
5. 超連結文字
<a href="...">XXX</a>
=>find_elements_by_link_text()
=>find_elements_by_partial_link_text()
定位一組就用elements 單個元件就用element
(但id通常都是用來找單個元件,其他的則不拘)
---------
##補充二
除了輸入資料之外,還可以對網頁作快捷鍵操作
from selenium.webdriver.common.action_chains import ActionChains
action = ActionChains(driver)
action.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()
上面就代表了做了 control+a 的全選動作
http://selenium-python.readthedocs.io/api.html
還有一些拖拉、滑鼠點擊等動作可以參考
---------
後續心得...
Selenium對一般網頁操作都很簡單 但是如果有進iframe就會比較麻煩
再來,Selenium 目前對IE的ModalDialog的支援很差
抓不到由ModalDialog所跳出的強制視窗
---------
參考資料
http://www.seleniumhq.org/docs/01_introducing_selenium.jsp#test-automation-for-web-applications
http://www.techbeamers.com/selenium-webdriver-python-tutorial/
http://cuiqingcai.com/2599.html
http://pan.baidu.com/s/1ntE7Zw1
http://selenium-python.readthedocs.io/
http://www.qa-knowhow.com/?p=1832