你使用WebDriver要做的第一件事就是訪問一個鏈接。一般通過調用get
方法來實現:
driver.get("http://www.baidu.com")
在將控制權返給你的腳本之前WebDriver將會等待Web頁面完全加載(也就是說,等待onload
被觸發)。值得注意的是如果你的頁面在加載的時候使用了大量的AJAX的話,WebDriver可能不知道什么時候頁面已經加載完成。如若你需要確保這類頁面被完整加載,可以使用wait
等待。
3.1.與頁面進行交互
僅僅訪問一個頁面並沒什么大用處。我們真正想做的是和頁面進行交互,或者更專業一點的說,和頁面中的HTML元素進行交互。首先,我們需要先定位一個頁面元素。WebDriver為定位頁面元素提供了大量方法。例如,像下面這樣定義一個HTML 元素:
<input type="text" name="passwd" id="passwd-id" />
你可以使用下面的任意一種方法定位它:
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
你也可以通過他的顯示文本來定位它。但是請小心——文本必須完全匹配!使用WebDriver XPath的時候也應當格外小心。如果通過查詢語句匹配了多個元素,只有第一個會被返回。如果沒有找到匹配的,將會拋出一個NoSuchElementException
異常。
WebDriver是面向對象的;針對不同元素我們使用相同的接口。這意味着,你的IDE自動補全功能會給你提示很多方法,但他們並不都是有效的,有些使用的話甚至會出錯。別太擔心!WebDriver將會嘗試去做正確的處理。如果你調用了一個無意義的方法(如,對一個“meta”元素進行“setSelected()”操作),WebDriver將會拋出一個異常。
嗯哼,你現在得到了一個元素。你能對他做什么呢?首先,你也許想要在文本輸入框中輸入一些文本:
element.send_keys("some text")
你可以使用Keys
類來模擬敲下-箭頭按鍵:
element.send_keys(" and some",Keys.ARROW_DOWN)
可以對任意的HTML 元素調用send_keys
方法,這可以用來測試鍵盤快捷鍵,就像GMAIL中使用的那樣。這樣做的一個副作用是在文本輸入框中鍵入什么的時候不會自動清除它先前的內容,而是直接將你的內容追加到后面。但是你可以使用clear
輕松清除掉文本輸入框或者文本域的內容:
element.clear()
3.3.填寫Form表單
我們已經知道了如何在文本輸入框和文本域中輸入文字,其他元素又怎么樣呢?你可以切換下拉的狀態,你可以使用setSelected
將OPTION
標簽的元素設置為選中狀態,處理SELECT
標簽也不錯:
element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
print("Value is: %s" % option.get_attribute("value"))
option.click()
這將會找到頁面上的第一個SELECT
元素,循環遍歷OPTIONS
,打印出它們的值,並選中它們。
正如你所看到的那樣,這不是處理SELECT
元素最高效的方法。WebDriver中有一個Select
類,提供了處理SELECT
相關的高效方法:
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)
WebDriver還提供了取消選中的功能:
select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected_options
獲得所有的可用選項:
options = select.options
一旦你完成了表單的填寫,你應該會想提交它。一種方法是找到submit
按鈕並點擊它。
# 假設按鈕的ID是"submit" :)
driver.find_element_by_id("submit").click()
除此之外,WebDriver還為每一個元素的提交行為提供了一個簡便的方法。如果你對一個表單內的元素調用此方法,WebDriver將會遍歷整個DOM直到找到閉合的form標簽,並對其調用提交(submit)。如果這個元素不是一個表單,將會拋出一個NoSuchElementException
異常:
element.submit()
3.3.拖拽
你可以使用拖拽功能移動元素:
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
3.4.在窗口和幀之間移動
現代Web應用多是多幀的,很少有單一窗口的了。WebDriver提供了switch_to_window
方法來支持命名窗口間的移動切換:
driver.switch_to_window("windowName")
現在driver
的所有操作將會針對特定的窗口。但是怎么才能知道窗口的名字呢?看一下js或者html中的超鏈接:
<a href="somewhere.html" target="windowName">Click here to open a new window</a>
或者你可以給switch_to_window
方法傳遞一個“窗口句柄”。這樣我們就可像下面這樣遍歷每一個窗口的標簽:
for handle in driver.window_handles:
driver.switch_to_window(handle)
你也可以在幀與幀之間切換(或者iframe之間)
driver.switch_to_frame("frameName")
通過點號分割的路徑可以訪問子幀,你也可以通過索引指定具體的幀:
driver.switch_to_frame("frameName.0.child")
上邊的代碼將會進入第一個名為"frameName"的->第一個子幀->的一個名為"child"的子幀。All frames are evaluated as if from top.
我們一旦結束了在frame上的工作,可以返回父幀:
driver.switch_to_default_content()
3.5.彈出式對話框
Selenium WebDriver對處理彈出式對話框提供了內建支持。你觸發了相應操作之后將會打開一個彈框,你可以像下面這樣訪問alert:
alert = driver.switch_to_alert()
這將會返回當前打開的alert
對象。通過這個對象你可以進行確認同意,反對,讀取它的內容甚至輸入一些東西。這個接口對於處理alerts、confirm、prompts同樣棒👍。參考官方的API文檔了解更多詳細信息。
3.6.導航:歷史和定位
之前我們知道了通過get
命令導航到一個頁面(driver.get("http://www.example.com")
).如你所見,WebDriver有大量的比較小、專注特定任務的接口。導航是一個非常有用的任務。要導航到一個網頁,你可以使用get
方法:
driver.get("http://www.example.com")
根據你的瀏覽器歷史進行前進和回退:
driver.forward()
driver.back()
請認識到這個功能完全依賴所使用的驅動器。在你使用不同的瀏覽器的時,調用這些方法完全有可能出現未預料的情形。
3.7.Cookies
再繼續下一章之前,也許你會對怎么使用cookie感興趣。首先,你需要在cookie所對應的有效域名下:
# 打開正確的域名
driver.get("http://www.example.com")
# 設置cookie. 這將在整個域名內有效
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)
# 打印出當前URL所有有效的cookie
driver.get_cookies()