qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Python Selenium自動化(一)點擊頁面鏈接測試

            需求:現在有一個網站的頁面,我希望用python自動化的測試點擊這個頁面上所有的在本窗口跳轉,并且是本站內的鏈接,前往到鏈接頁面之后在通過后退返回到原始頁面。
            要完成這個需求就必須實現3點:
            1. 找到原始頁面上面所有的在本窗口內跳轉的鏈接
            2. 跳轉到目標頁面之后,“后退”到原始頁面
            3. 在原始頁面上繼續點擊后續的鏈接
            首先,要找到頁面上的所有鏈接并不困難。selenium為我們提供了find_elements_by_tag_name方法。我們只需要在初始化webdriver之后,調用
            driver.find_elements_by_tag_name("a")
            就能找到頁面上的所有a標簽。
            我們可以對所有的a標簽進行點擊,但是這樣的話我們不能保證所有的a標簽所指向的目標頁面都是站內的,有可能目標是其他的站外網頁;另外這樣也不能保證該跳轉頁面是在本窗口跳轉而不是新開一個窗口。
            解決辦法:
            使用selenium.webdriver.remote.webelement.WebElement提供的get_attribute方法。
            通過get_attribute拿到該a標簽的各種屬性,通過判斷找到符合要求的元素進行點擊。
            get_attribute("href") 得到a標簽對應的目標頁面的URL,對URL進行判斷就可以了解到該頁面是否站內頁面。我們可以知道,如果是站內頁面的話這個屬性一般會是一個相對路徑,或者包含了本站域名,但如果是站外頁面的話,那它一定是包含了“http”的一個url。
            get_attribute("target")如果target不是"_blank"的話,可以判斷該頁面是在本窗口跳轉的。
            跳轉到下一頁面后如何返回原始頁面呢?
            selenium webdriver 提供了back方法可以輕松的達到這個目標:driver.back()
            最后,需要在返回了原始頁面之后繼續點擊下一個鏈接進行測試,這個不用說肯定要使用for loop:
            for i in range(0, len(driver.find_elements_by_tag_name("a"))):
            在python中,如果我們指定i在range(0, x)中循環時,會以1為步長來遍歷從0到(x-1)的序列。例如:range(0,5)會得到[0, 1, 2, 3, 4]。當我們想更改range的步長時,則需要為range方法提供第三個參數。例如:range(0,5,2),則會以2為步長,得到[0,2,4]這個序列。
            另外,我們也可以使用類似C#中foreach的方法:
            for targetLink in driver.find_elements_by_tag_name("a"):
            這種方法同樣可以遍歷所有的a標簽集合中的所有元素。
            如果使用第二種方法,我們覺得這個需求可以簡單的實現為:
          links = driver.find_elements_by_tag_name("a")
          for link in links:
          if not "_blank" in link.get_attribute("target") and ("google" in link.et_attribute("href") or not "http" in link.get_attribute("href")):
          link.click()
          driver.back()
          但是這樣的實現在運行時會拋出異常:
            selenium.common.exceptions.StaleElementReferenceException: Message: u'Element not found in the cache - perhaps the page has changed since it was looked up'
            異常的說明已經很明顯了:在cache中找不到元素,在元素被找到之后頁面變換了。 這就說明,當當前頁面發生跳轉之后,存在cache中的關于這個頁面的元素也被清空了。
            因此,我們需要在每次回到原始頁面之后對我們感興趣的a標簽元素重新搜索,同時我們又必須接著上次的點擊到的元素繼續點擊。因此我們使用第一種遍歷的方法來實現這個for loop:
          length = len(driver.find_elements_by_tag_name("a")
          for i in range(0,length):
          links = driver.find_elements_by_tag_name("a")
          link = links[i]
          if not ("_blank" in link.get_attribute("target") or "http" in link.get_attribute("href")):
          link.click()
          driver.back()
            這樣,在每次返回頁面之后會重新搜索一遍頁面上的a元素,然后使用cache中的i繼續點擊下一個跳轉鏈接。
          相關文章:
          Python Selenium自動化(二)自動化注冊流程

          posted on 2014-06-18 10:51 順其自然EVO 閱讀(2828) 評論(0)  編輯  收藏 所屬分類: selenium and watir webdrivers 自動化測試學習

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 富蕴县| 民县| 舒城县| 仪征市| 哈尔滨市| 阿拉善左旗| 南涧| 绍兴市| 海兴县| 新巴尔虎左旗| 深泽县| 运城市| 富裕县| 沁水县| 黄浦区| 朝阳市| 嘉善县| 浑源县| 肃南| 佛教| 洮南市| 嘉义市| 天峨县| 祥云县| 南召县| 宜兴市| 梁河县| 霞浦县| 新竹市| 镇原县| 淮南市| 梓潼县| 霍林郭勒市| 堆龙德庆县| 四川省| 永平县| 基隆市| 额济纳旗| 和政县| 司法| 蛟河市|