3 跳轉
使用Webdriver要做的第一件事情是跳轉到一個頁面。一般的方式是通過調用get方法。
driver.get("http://www.python.org")
WebDriver在返回對測試或指令碼的控制之前一直等到頁面完全載入為止。但是如果頁面使用了很多AJAX,WebDriver也許不知道什麼時候頁面會完全載入,就不值得這麼做了。如果你需要確保這樣的頁面完全載入,可以使用waits方法。
3.1 與頁面互動
只是能到達頁面並不是十分有用,我們很想做的是與頁面互動。或者,更精確地。與頁面裡的HTML元素。首先,我們需要找到一個元素。WebDriver提供了很多方法來需找元素。假設一個元素定義為:
<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 有一個基於對象的API。我們使用相同的介面來代表各種元素。這意味著在使用IDE的自動完成功能的時候,你或許看到很多可以調用的方法。但是不是所有的都行得通或者可行。但是無需擔心!WebDriver將試圖去做正確的事情,而且如果你調用了一個行不通的方法,會拋出一個異常。
你得到了一個元素,你能做什麼呢?首先,你也許想在輸入框中輸入一段文字。
Element.send_keys(“some text”)
你可以通過Keys類模仿按方向鍵
Element.send_keys(“and some”, Keys.ARROW_DOWN)
在任意元素上都是可以調用send_keys的,這使得測試鍵盤快速鍵比如用在Gmail上的,成為可能。一個副作用是在輸入框中輸入字元將不會自動清空。反而,你輸入的將會被添加在已有文本之後。你可以很容易使用clear方法清空輸入框或輸入地區的內容。
Element.clear()
3.2 填充表單
我們已經看到如何在輸入框裡輸入字元,但是,其他元素呢?你可以選擇選擇框的狀態,你可以使用setSelected來設定比如選項標籤為選中狀態。處理SELECT選項並不是太壞。
Select = driver.find_element_by_xpath(“//select”)
All_options = select.find_element_by_tag_name(“option”)
For option in all_options:
Print “value is: %s” %option.get_attribute(“value”)
Option.click()
這將會發現頁面上第一個SELECT元素,然後迴圈通過每一根的OPTION,列印出他們的值,然後依次選中每個。
當你完成填充表單之後,你也許想提交它。一個辦法是找到submit按鈕並點擊它。
# Assume the button has the ID “submit”
Driver.find_element_by_id(‘submit’).click()
或者,WebDriver在每個元素上都有很方便的submit方法。如果你在一個form的元素上調用這個方法,WebDriver將會查詢DOM樹,直至發現包含它的form然後調用submit。如果元素沒有在form裡面,將會拋出NoSuchElementExcellent
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)
3.4 在視窗和幀之間移動
在現在的web應用中很少視窗裡沒有任何幀。WebDriver支援使用switch_to_window方法在命名視窗裡移動。
Driver.switch_to_window(“windowName”)
所有對driver的調用現在都被解釋為直接到特定的視窗。但是如何知道視窗的名字?看一下開啟視窗的javascript或者連結。
<a href=”somewhere.html” target=”windowName”>Click here to open a new window</a>
作為選擇,你可以傳一個視窗控制代碼給switch_to_window()方法。知道這個,就可以再每個開啟的視窗之間迭代訪問
For handle in driver.window_handlers:
Driver.switch_to_window(handle)
也可以在幀之間切換
Driver.switch_to_frame(“frameName”)
也可以通過用點分解路徑訪問子幀,可以通過指定index來確定幀。
Driver.switch_to_frame(frameName.0.child)
3.5 快顯視窗
Selenium WebDriver有對處理快顯視窗的內建支援。在你激發一個動作可以開啟一個快顯視窗,你可以通過以下方式訪問alert。
Alert = driver.switch_to_alert()
這將返回當前開啟的警告對象。通過這個對象,你可以接受,取消,讀取它的內容或甚至在提示裡輸入內容。這個借口在警告,確認,提示裡工作的一樣好。
3.6 導航:曆史和定位
早先,我們使用get方法來涵蓋跳轉。如你所見,WebDriver有很多更小的,任務集中的介面,導航是一個很有用的任務。為了跳轉到一個頁面,你可以使用get方法:driver.get(“http://www.example.com”)
為了在瀏覽器歷史裡向前或向後移動:
Driver.forward()
Driver.back()
請注意這個功能完全依賴於潛在的驅動。
3.7 Cookies
Driver.get(“http://www.example.com”)
# Now set the cookie. This one is valid for the entire domain
Cookie = {“key”: “value”}
Driver.add_cookie(cookie)
# And now output all the available cookies for the current URL
All_cookies = driver.get_cookies()
For cookie_name, cookie_value in all_cookies.items():
Print “%s -> %s”, cookie_name, cookie_value
4 定位元素
有很多種在頁面上定位元素的策略。你可以使用對你case最合適的那種。Selenium提供下列方法來定位頁面上的元素
Find_element_by_id
Find_element_by_name
Find_element_by_xpath
Find_element_by_link_text
Find_element_by_partial_link_text
Find_element_by_tag_name
Find_element_by_class_name
Find_element_by_css_selector
發現多個元素(這些方法將返回一個列表)
Find_elements_by_name
Find_elements_by_xpath
Find_elements_by_link_text
Find_elements_by_partial_link_text
Find_elements_by_tag_name
Find_elements_by_class_name
Find_elements_by_css_selector
4.1 通過ID定位元素
當你知道元素的id屬性的時候使用這個方法。通過這個策略,匹配定位的第一個具有id屬性的元素將被返回,如果沒有元素具有id屬性,拋出NoSuchElementException。
例如,考慮下頁面源檔案
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
</form>
</body>
<html>
Form元素可以被如此定位:login_form = driver.find_element_by_id(“loginForm”)
4.2 通過名字定位
當你知道元素的name屬性的時候使用這個方法。通過這個策略,匹配定位的第一個具有name屬性的元素將被返回,如果沒有元素具有name屬性,拋出NoSuchElementException。
例如,考慮下頁面源檔案
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
使用者名稱和密碼元素可以如下定位:
Username = driver.find_element_by_name(“username”)
Password = driver.find_element_by_name(“password”)
Continue = driver.find_element_by_name(“Continue”)
4.3 通過xpath定位
Xpath是用來在XML文檔中定位節點的語言。
例如,考慮下頁面源檔案
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
Form元素可以如下定位:
Login_form = driver.find_element_by_xpath(“/html/body/form[1]”)
Login_form = driver.find_element_by_xpath(“//form[1]”)
Login_form = driver.find_element_by_xpath(“//form[@id=’loginForm’]”)
Username可以如下定位:
username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
4.4 通過連結文本定義超連結
<html>
<body>
<p>Are you sure you want to do this?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
<html>
Continue連結可以如下定位:
continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')
英文原文見這裡