2.1.簡單使用
如果已經安裝好了Selenium Python,你就可以像下面這樣編寫Python代碼來使用它了:
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.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
上面的腳本可以保存到一個文件(例如:python_org_search.py)。接着,可以像下面這樣來運行它(你應該確保要使用的Python已經正確安裝了selenium模塊):
$python python_org_search.py
2.2.示例講解
selenium.webdriver模塊提供了所有的WebDriver實現。當前Selenium支持的WebDriver實現由火狐、Chrome、IE和遠程。Keys類提供了鍵盤按鍵的鍵值,如RETURN、F1、ALT等。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
接着,Firefox WebDriver實例被創建:
driver = webdriver.Firefox()
driver.get方法根據給定的URL訪問Web 頁面。在將控制權交給你的測試腳本之前,WebDriver將會等待頁面完全加載(也就是說,等待onload事件被觸發)。值得注意的是如果你的頁面在加載的時候使用了大量的AJAX,WebDriver有可能不知道它是否已經加載完成:
driver.get("http://www.python.org")
接下來的一行是一個斷言,用來確保標題中有“Python”這個單詞:
assert "Python" in driver.title
WebDriver為尋找頁面元素提供了大量方法,他們都是find_element_by_*的形式。舉個例子,input text元素可以根據他的name值使用find_element_by_name來進行定位。在后續的元素定位那一章將會對元素定位做更為詳細的介紹。
elem = driver.find_element_by_name("q")
接下來我們發送了一個“按鍵”值,這和你使用鍵盤的輸入非常相似。特殊案件可以通過從selenium.webdriver.common.keys導入的Keys類進行發送。安全起見,我們首先清除輸入框中的預置文本(比如,“搜索”,"Serach")。以保證它不會影響我們的搜索結果:
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)#Keys.ENTER
在頁面提交之后,你應該會得到相應的搜索結果。為了保證一些結果被找到,作一個斷言:
assert "No results found." not in driver.page_source
最后,關閉瀏覽器窗口。你也可以調用quit來代替close方法。quit將會關閉整個瀏覽器,而close將會僅關閉一個標簽頁。如果只打開了一個標簽頁的話,大多數瀏覽器默認會關閉整個瀏覽器:
driver.close()
2.3.使用Selenium編寫測試
Selenium常被用於編寫測試樣例。selenium包本身並不提供測試工具/框架,你可以使用Python的unittest模塊來編寫測試。另外可選的測試工具/框架是py.test和nose。
本章我們選擇使用unittest做測試框架。這里是經修改的unittest模塊使用樣例。本腳本用來測試python.org的搜索功能:
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("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()
你可以從命令行來運行上面的測試樣例,如:
python test_python_org_search.py
.
----------------------------------------------------------------------
Ran 1 test in 15.566s
OK
上面的結果表明測試已經成功完成。
2.4.通覽示例
首先,加載所有需要的基礎模塊。unittest是基於Java JUnit的Python自建模塊。該模塊提供了組織測試樣例的框架。selenium.driver模塊提供了所有的WebDriver實現。當前支持的WebDriver實現有:火狐、Chrome、IE和遠程。類提供了鍵盤按鍵的鍵值,如RETURN、F1、ALT等。
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
test case類繼承自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訪問Web 頁面。在將控制權交給你的測試或者腳本之前,WebDriver將會等待頁面完全加載(也就是說,等待onload事件被觸發)。值得注意的是如果你的頁面在加載的時候使用了大量的AJAX,WebDriver有可能不知道它是否已經加載完成:
driver.get("http://www.python.org")
接下來的一行是一個斷言,用來確保標題中有“Python”這個單詞:
self.assertIn("Python" ,driver.title)
WebDriver為定位頁面元素提供了大量方法,他們都是find_element_by_*的形式。舉個例子,input text元素可以根據他的name值使用find_element_by_name定位。在后續的元素定位那一章將會對元素定位做更為詳細的介紹。
elem = driver.find_element_by_name("q")
接下來我們發送了一個“按鍵”值,這和你使用鍵盤的輸入非常相似。特殊案件可以通過從selenium.webdriver.common.keys導入的Keys類進行發送。安全起見,我們首先清除輸入框中的預置文本(比如,“搜索”,"Serach")。以保證它不會影響我們的搜索結果:
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)#Keys.ENTER
在頁面提交之后,你應該會得到相應的搜索結果。為了保證一些結果被找到,作一個斷言:
assert "No results found." not in driver.page_source
tearDown方法將會在所有的測試方法執行之后調用。此函數用來做一些清理工作。在當前方法中,清理工作是關閉瀏覽器。你也可以調用quit方法來代替close方法。quit將會關閉整個瀏覽器,而close將會僅關閉一個標簽頁。如果只打開了一個標簽頁的話,大多數瀏覽器默認會關閉整個瀏覽器:
def tearDown(self):
self.driver.close()
最后一行用來運行測試套件:
if __name__ == "__main__":
unittest.main()
2.5.通過遠程WebDriver使用Selenium
要使用遠程WebDriver,你應該先運行Selenium server。可以使用下面的命令啟動它:
java -jar selenium-server-standalone-2.x.x.jar
Selenium server啟動之后你可以看到像下面的一條消息:
15:43:07.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
上面那行說明你可以使用這個URL來連接遠程WebDriver。這里是一些示例:
from selenium import webdriver
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})
