Python Selenium自動(dòng)化(二)自動(dòng)化注冊(cè)流程
需求:使用python selenium來自動(dòng)測試一個(gè)網(wǎng)站注冊(cè)的流程。
假設(shè)這個(gè)網(wǎng)站的注冊(cè)流程分為三步,需要提供比較多的信息:
在這個(gè)流程里面,需要用戶填入信息、在下拉菜單中選擇、選擇單選的radio button、多選框等等比較復(fù)雜的頁面元素操作。
在開始做的時(shí)候,我會(huì)按照一個(gè)用戶真正的填寫習(xí)慣,參照頁面,一步步的定義每個(gè)步驟應(yīng)該進(jìn)行怎樣的操作,我需要查看每一個(gè)頁面元素的屬性,決定選擇一個(gè)合理的選項(xiàng),然后再用代碼自動(dòng)化這樣的操作。但是反思一下,其實(shí)這樣的實(shí)現(xiàn)方法并不符合一個(gè)計(jì)算機(jī)自動(dòng)測試的習(xí)慣,也浪費(fèi)了許多時(shí)間在手動(dòng)的尋找頁面元素的相關(guān)屬性和合理操作值上。
所謂的自動(dòng)化,就是要機(jī)器在最大程度上的去代替人進(jìn)行某些操作。而只有在程序自己沒有辦法判斷如何操作的時(shí)候,我們才為這類操作定義更詳細(xì)的規(guī)定。例如:從計(jì)算機(jī)的角度,并不需要關(guān)心radio button要選擇的是male或是female,也不關(guān)心下拉菜單中我們要選擇的具體的值是什么;它只需要確保radio button和下拉菜單中可以順利的選擇到一個(gè)元素。因此,在這個(gè)注冊(cè)流程中,我可以簡單的定義找到頁面上所有的radio button,然后挨個(gè)把它們都點(diǎn)擊一遍,這樣既能保證每個(gè)radio button都被點(diǎn)擊事件測試過,也能保證在注冊(cè)流程中必定有一個(gè)選項(xiàng)被選中了。同樣的,我可以定義對(duì)每個(gè)下拉菜單都選擇第一個(gè)字值。這樣的general的方法,可以把我從對(duì)每個(gè)元素都要找到它的屬性然后對(duì)其指定詳細(xì)的操作的辛苦中一次性的解放出來:
def click_radio_btn(driver): radioBtns = driver.find_elements_by_xpath("http://input[@type='radio']") for radioBtn in radioBtns: if radioBtn.is_displayed(): radioBtn.click() |
這里我多進(jìn)行了一次radioBtn.is_displayed()的判斷,原因是在我的流程中有的radio button是在選擇了某些特定選項(xiàng)之后才會(huì)顯示在頁面上的,因此對(duì)于沒有顯示的元素就不必進(jìn)行點(diǎn)擊操作,否則會(huì)拋出異常:
selenium.common.exceptions.ElementNotVisibleException: Message: u'element not visible
而對(duì)于需要填入具體信息的input field來說,我們就必須要給出具體每個(gè)輸入框的輸入值來告訴程序如何處理這些元素了。
相關(guān)文章:
在這個(gè)這個(gè)注冊(cè)流程中,address的下拉菜單中市的選項(xiàng)是基于省份的選值的。這里有一個(gè)ajax的異步調(diào)用,當(dāng)用戶選擇了一個(gè)省份之后才會(huì)對(duì)市下拉單中的值進(jìn)行加載。于是問題出現(xiàn)了:由于網(wǎng)絡(luò)的原因,加載市的值的速度是不一定的,有時(shí)也許在執(zhí)行對(duì)市的下拉菜單進(jìn)行選值的時(shí)候其中的值其實(shí)還沒有加載完成。這時(shí),雖然我們選擇的是第一個(gè)選項(xiàng),還是會(huì)拋出異常:
selenium.common.exceptions.NoSuchElementException: Message: 'Could not locate element with index 1'
這種情況的解決辦法是:使用selenium.webdriver.support.ui.WebDriverWait提供的until來使webdriver等待到指定的條件滿足或是規(guī)定的timeout time到期:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://www.zhuce.com") city = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"city"))) Select(city).select_by_index(1) |
這樣,webdriver將會(huì)等待name為“city”的元素enable了之后才算找到該元素,并繼續(xù)進(jìn)行接下來的點(diǎn)擊操作。如果在10秒內(nèi)該元素都沒有加載成功的話,才拋出異常:
raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message: ''
python selenium中提供了多種元素等待的條件:
title_is title_contains presence_of_element_located visibility_of_element_located visibility_of presence_of_all_elements_located text_to_be_present_in_element text_to_be_present_in_element_value frame_to_be_available_and_switch_to_it invisibility_of_element_located element_to_be_clickable #it is Displayed and Enabled. staleness_of element_to_be_selected element_located_to_be_selected element_selection_state_to_be element_located_selection_state_to_be alert_is_present |
posted on 2014-06-20 11:52 順其自然EVO 閱讀(3157) 評(píng)論(0) 編輯 收藏 所屬分類: selenium and watir webdrivers 自動(dòng)化測試學(xué)習(xí)