qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          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è)輸入框的輸入值來告訴程序如何處理這些元素了。

            在這個(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
          相關(guān)文章:
          Python Selenium自動(dòng)化(一)點(diǎn)擊頁面鏈接測試

          posted on 2014-06-20 11:52 順其自然EVO 閱讀(3157) 評(píng)論(0)  編輯  收藏 所屬分類: selenium and watir webdrivers 自動(dòng)化測試學(xué)習(xí)

          <2014年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 清镇市| 内江市| 台北县| 西丰县| 策勒县| 卓尼县| 金山区| 楚雄市| 历史| 沈阳市| 台安县| 肇庆市| 开远市| 广河县| 巩留县| 同心县| 剑河县| 鹤庆县| 花垣县| 孝感市| 闽清县| 抚宁县| 富民县| 神农架林区| 太湖县| 洛川县| 望城县| 榆林市| 永济市| 岫岩| 即墨市| 合作市| 新巴尔虎右旗| 墨竹工卡县| 泰来县| 安阳县| 保山市| 额敏县| 镇坪县| 独山县| 古丈县|