- 安裝
1.1 介紹
Selenium Python bindings提供了一個簡單的API使用Selenium WebDriver來寫功能、驗收測試。通過Selenium Python API你可以以比較直白的方式使用Selenium的所有功能。
Selenium Python bindings提供了一個方便的API來訪問Selenium Webdrivers比如Firefox,IE和Chrome, 目前支持的Python版本是Python2.6和Python2.7.Python3現在還不支持。Selenium服務器是一個Java程序。 推薦使用JRE1.6或更新的版本來跑Selenium 服務器。本文主要解釋了如何使用Selenium2和WebDriver API。
1.2 為Selenium下載Python bindings
你可以在PyPi page for selenium package 下載Selenium的Python binding。它有個依賴庫rdflib,版本3.1.x。你也可以使用easy_install或者pip來安裝bindings:easy_install selenium 或者 pip install selenium。或者你可以考慮使用virtualenv來創建獨立的Python環境。
1.3 Windows用戶的詳細指示
注意:為完成安裝,必須有網絡連接
- 安裝Python2.7,在這里使用MSI版本安裝文件
- 安裝virtualenv,下載這個Python腳本
- 創建虛擬環境(你必須在virtual.py所在的目錄): C:\Python27\python.exe virtualenv,py selenv,這個步驟將創建一個selenv目錄用來安裝selenium
- 安裝selenium:selenv\Scripts\pip.exe install selenium
- 現在你在這個虛擬環境里可以運行你的Python腳本: selenv\Scripts\python.exe my_selenium_script.py
1.4 下載Selenium 服務器
注意:只有在要使用遠程WebDriver的時候才需要Selenium服務器。
可以在這里下載Selenium server 2.x。文件名應該像這樣: selenium-server-standalone-2.x.x.jar。你可以一直下載最新的2.x版本。
如果你的電腦沒有安裝JRE,可以到這里下載一個。
1.5 運行Selenium server
必須要在操作系統里安裝JRE。如果java命令在PATH(環境變量)里可用。可以使用下面的命令來啟動Selenium server。用實際你下載的Selenium server版本號替代2.x.x。java -jar selenium-server-standalone-2.x.x.jar
2. 開始
2.1 簡單使用說明
如果你已經安裝了Selenium server和Python bindings,而且可以運行server,可以通過下面的腳本來開始使用。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("selenium")
elem.send_keys(Keys.RETURN)
assert "Google" in driver.title
driver.close()
上面的腳本可以保存成一個文件(比如:python_org_search.py),然后可以這樣運行:
Python python_org_search.py
你使用的python必須安裝selenium模塊。
2.2 過一下這個例子
Selenium.webdriver模塊提供了所有的WebDriver實現。目前支持Webdriver實現的瀏覽器有Firefox,Chrome,IE和遠程。Keys類提供了鍵盤上的鍵,如回車,F1,ALT等。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
接下來, 創建Firefox Webdriver的實例
driver = webdriver.Firefox()
driver.get方法將跳轉到URL指定的頁面。 Webdriver在返回你測試或腳本的控制之前,將會等待直到頁面完全載入(也就是說,激發了“onload“事件)。如果你頁面在load的時候使用了很多AJAX就不值得這么做,因為Webdriver也許不知道什么時候會完全載入。
driver.get("http://www.python.org")
下一行是一個斷言來確定標題里是否含有“Python“字樣。
assert "Python" in driver.title
Webd提供了很多方法使用任一個find_element_by_*方法來查找元素。比如,輸入框元素可以通過它的名字屬性使用find_element_by_name方法來定位。
elem = driver.find_element_by_name("q")
下面,我們發送鍵盤指令,這和使用鍵盤敲擊鍵很類似。特殊的鍵可以使用selenium.webdriver.common.keys的Keys類來發送指令。
elem.send_keys("selenium")
elem.send_keys(Keys.RETURN)
在提交頁面之后,你應該到了Google頁面。
assert "Google" in driver.title
最后,瀏覽器窗口關閉。也可以調用quit方法來代替close方法。Quit方法將退出整個瀏覽器,而close只是關掉一個tab。但是如果只有一個tab。默認大部分的瀏覽器將完全退出。
Driver.close()
2.3 使用Selenium寫測試
Selenium主要被用來寫測試案例。你可以使用Python的unittest模塊來寫測試案例。下面是一個使用unittets模塊的修改版本。主要用來測試Python的搜索功能。
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
class PythonOrgSearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
def test_search_in_python_org(self):
driver = self.driver
driver.get("http://www.python.org")
self.assertIn("Python", driver.title)
elem = driver.find_element_by_name("q")
elem.send_keys("selenium")
elem.send_keys(Keys.RETURN)
self.assertIn("Google", driver.title)
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()
結果如下:
Finding files... done.
Importing test modules ... done.
----------------------------------------------------------------------
Ran 1 test in 23.579s
OK
2.4 過一下這個例子
最初,先引入需要的所有基本模塊。Unittest是一個基於Java的Uunit的Python內置模塊,這個模塊提供了組織測試案例的框架.selenium.webdirver模塊提供了所有的WebDriver實現。
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
測試案例類繼承自unittest.TestCase。繼承自TestCase類是告訴unittest模塊的方式,即,這是個測試案例:
class PythonOrgSearch(unittest.TestCase):
setup方法是初始化的一部分,這個方法將在你寫的每個測試功能之前被調用,這里是創建了Firefox WebDriver的實例
def setUp(self):
self.driver = webdriver.Firefox()
這是個測試案例方法。方法的第一行創建了一個到在setUp方法里創建的driver丟下的本地引用。
def test_search_in_python_org(self):
driver = self.driver
driver.get方法將跳轉到URL指定的頁面。
driver.get("http://www.python.org")
下一行是個斷言來確定標題里面有Python字樣。
self.assertIn("Python", driver.title)
注意:assertIn API僅在Python2.7 unittest模塊里可用。
Teardown方法將在每個測試方法之后被調用。這里主要用來做所有的cleanup工作。在當前這個方法里,瀏覽器窗口被關掉。
def tearDown(self):
self.driver.close()
最后的幾行是用來運行這個測試組件。
if __name__ == "__main__":
unittest.main()
2.5 和遠程WebDriver一起使用Selenium
為使用遠程WebD,必須先運行Selenium服務器,可以使用下面的命令啟動Selenium服務。
Java –jar selenium-server-standalone-2.x.x.jar
當運行Selenium服務的時候,你可以看到類似下面的消息:
15:43:07.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
上面幾行是說,你可以使用這個URL連到遠程WebD。下面是具體例子:
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME)
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.OPERA)
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)
desired_capabilities是個字典,可以使用自己的設置來取代默認設置:
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'browserName': 'htmlunit',
'version': '2',
'javascriptEnabled': True})