乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      RF操作xml

       小豬窩969 2017-03-24

            前段時(shí)間充忙的學(xué)習(xí)RF,系統(tǒng)學(xué)習(xí)完之后就開(kāi)始動(dòng)手做各種接口的測(cè)試,雖然各類的接口測(cè)試基本能跑通了,但是重復(fù)造車的問(wèn)題存在太明顯。RF本身內(nèi)置庫(kù)就已經(jīng)比較豐富,比如不需要import直接就加載到內(nèi)存的BuiltIn庫(kù),還有需要import的常用模塊String,Collections,XML庫(kù)。在前面的接口測(cè)試中,使用最多的就是這幾個(gè)內(nèi)置庫(kù),接口返回的數(shù)據(jù)基本都是xml格式的居多,然后自己也重復(fù)造車了,為此特地花了幾天時(shí)間去學(xué)習(xí)了下內(nèi)置庫(kù),主要還是學(xué)了下XML庫(kù),以下的分享都是基于XML庫(kù)。


            學(xué)習(xí)XML內(nèi)置庫(kù),我認(rèn)為需要掌握以下幾個(gè)知識(shí)點(diǎn):


            第一:內(nèi)置庫(kù)的概念?有哪些內(nèi)置庫(kù),大概都有什么關(guān)鍵字?有區(qū)分版本嗎?跟RF版本有關(guān)么?為什么內(nèi)置庫(kù)有些需要import,有些不需要import?


            第二:XML內(nèi)置庫(kù)使用的是python的哪個(gè)標(biāo)準(zhǔn)庫(kù)?對(duì)這個(gè)標(biāo)準(zhǔn)庫(kù)需要有哪些基本的了解?


            第三:內(nèi)置庫(kù)是怎么構(gòu)建起來(lái)的?基本關(guān)鍵字是否能靈活的使用?


            第四:有時(shí)候可能需要稍微修改下內(nèi)置庫(kù),比如增加一些關(guān)鍵字等,該怎么修改?


            從網(wǎng)上和官網(wǎng)(http://)上搜到一些資料,整理如下:


            第一:內(nèi)置庫(kù)的基本概念?


            內(nèi)置庫(kù)實(shí)際在官網(wǎng)稱為standard library,就是標(biāo)準(zhǔn)庫(kù)。常見(jiàn)的其他庫(kù)比如Request,SeleniumLibrary庫(kù),官網(wǎng)稱之為external library,就是外部庫(kù),也稱第三方庫(kù)。標(biāo)準(zhǔn)庫(kù)和外部庫(kù)首先要正確的進(jìn)行區(qū)分,對(duì)于標(biāo)準(zhǔn)庫(kù),這些庫(kù)是直接綁定在RF內(nèi)的,在


       D:\Python27\Lib\site-packages\robot\libraries(視python安裝目錄變化) 下可以看到,無(wú)須再下載;而外部庫(kù),是需要根據(jù)個(gè)人需要,下載后再安裝導(dǎo)入才能使用的。 對(duì)于標(biāo)準(zhǔn)庫(kù),又分兩類,類似BuiltIn庫(kù)是RF自動(dòng)加載到內(nèi)存的,安裝后按下F5就能直接使


      用,不需要再次import,而XML庫(kù)需要再次import才能正常使用。因?yàn)锽uiltIn library 提供了很多常用的關(guān)鍵字,比如Should Be EqualConvert To Integer等,所以RF就把這個(gè)常用的庫(kù)自動(dòng)加載到了內(nèi)存。

            不同版本的RF,支持不同的內(nèi)置庫(kù)而且相同的內(nèi)置庫(kù)里的關(guān)鍵字可能也是不一樣的,以RF3.0(使用命令robot --version查看RF版本)為例,3.0是目前最新的RF的版本,支持很多的內(nèi)置庫(kù),查看D:\Python27\Lib\site-packages\robot下的py文件,可以看到:


           


           基本官網(wǎng)寫(xiě)的10個(gè)標(biāo)準(zhǔn)庫(kù)都能在這里面找到相應(yīng)的py文件。BuiltIn,Collections,DateTime,Dialogs,Process,OperatingSystem,Remote(沒(méi)有關(guān)鍵字,暫時(shí)不算在內(nèi)),Screenshot,String,Telnet,XML.這11個(gè)庫(kù),有些是在RF2.0的時(shí)候就已經(jīng)有了的,最晚的DateTime,Process,XML是在RF2.8之后才內(nèi)置的,也就是說(shuō)如果當(dāng)前使用的是RF2.8之前的版本,內(nèi)置庫(kù)是無(wú)法直接import XML就是使用的,需要下載安裝才能使用,這點(diǎn)需要注意下,不同的RF版本,相同的標(biāo)準(zhǔn)庫(kù)之間也是會(huì)細(xì)微的區(qū)別,這需要仔細(xì)的去查看保準(zhǔn)庫(kù)內(nèi)每個(gè)版本的使用文檔。


           10個(gè)標(biāo)準(zhǔn)庫(kù),又都是做什么用的呢,這還真需要了解,而且還需要多花時(shí)間去了解每個(gè)標(biāo)準(zhǔn)庫(kù)里面的關(guān)鍵字,這10個(gè)標(biāo)準(zhǔn)庫(kù),介紹如下:


          


          這個(gè)表的來(lái)源是來(lái)自官網(wǎng)的,官網(wǎng)的用戶手冊(cè)文檔已經(jīng)描述的非常詳細(xì)了。學(xué)習(xí)的時(shí)候可以詳細(xì)的查看官網(wǎng)的相關(guān)文檔。


          第二:XML內(nèi)置庫(kù)的學(xué)習(xí)。


          從內(nèi)置庫(kù)的XML的源碼可以看出,RF使用的是ETree來(lái)對(duì)xml進(jìn)行解析的,部分源碼如下:


        


      復(fù)制代碼

      import copy
      import re
      import os
      
      try:
          from lxml import etree as lxml_etree
      except ImportError:
          lxml_etree = None
      
      from robot.api import logger
      from robot.libraries.BuiltIn import BuiltIn
      from robot.utils import (asserts, ET, ETSource, is_string, is_truthy,
                               plural_or_not as s)
      from robot.version import get_version
      
      
      should_be_equal = asserts.assert_equal
      should_match = BuiltIn().should_match
      
      
      class XML(object):
       ROBOT_LIBRARY_SCOPE = 'GLOBAL'
          ROBOT_LIBRARY_VERSION = get_version()
          _xml_declaration = re.compile('^<\?xml .*\?>')

        def __init__(self, use_lxml=False):
          use_lxml = is_truthy(use_lxml)
              if use_lxml and lxml_etree:
                  self.etree = lxml_etree
                  self.modern_etree = True
                  self.lxml_etree = True
              else:
                  self.etree = ET
                  self.modern_etree = ET.VERSION >= '1.3'
                  self.lxml_etree = False
              if use_lxml and not lxml_etree:
                  logger.warn('XML library reverted to use standard ElementTree '
                              'because lxml module is not installed.')


        def parse_xml(self, source, keep_clark_notation=False):
         with ETSource(source) as source:
                  tree = self.etree.parse(source)
              if self.lxml_etree:
                  strip = (lxml_etree.Comment, lxml_etree.ProcessingInstruction)
                  lxml_etree.strip_elements(tree, *strip, **dict(with_tail=False))
              root = tree.getroot()
              if not is_truthy(keep_clark_notation):
                  NameSpaceStripper().strip(root)
              return root

       

      復(fù)制代碼

          python提供了幾個(gè)標(biāo)準(zhǔn)庫(kù)都可以對(duì)xml進(jìn)行解析,之前我使用的是DOM,基于RF使用的是ETree,便開(kāi)始學(xué)習(xí)了下ETree的開(kāi)發(fā)文檔。學(xué)習(xí)對(duì)XML文件的操作,那肯定也得對(duì)XML本身有最基本的了解,比如XML的用途,樹(shù)結(jié)構(gòu),節(jié)點(diǎn)類型(DOM),帶命名空間的xml。下面是部分的知識(shí)點(diǎn)的總結(jié):


          xml是一種可擴(kuò)展的標(biāo)記語(yǔ)言。要求標(biāo)記需要成對(duì)的出現(xiàn)(有時(shí)候會(huì)進(jìn)行簡(jiǎn)寫(xiě)<b/>)。一個(gè)典型的xml文檔如下所示:


      復(fù)制代碼

      <example>
        <first id="1">text</first>
        <second id="2">
          <child/>
        </second>
        <third>
          <child>more text</child>
          <second id="child"/>
          <child><grandchild/></child>
        </third>
      </example>

      復(fù)制代碼

           A. 整個(gè)xml文檔是一個(gè)文檔節(jié)點(diǎn),屬于根節(jié)點(diǎn),比如上述文檔的<example>節(jié)點(diǎn)就是一個(gè)根節(jié)點(diǎn),一個(gè)xml文件只能有一個(gè)根節(jié)點(diǎn),否則解析的時(shí)候胡報(bào)錯(cuò)的


           B.每個(gè) XML 標(biāo)簽是一個(gè)元素節(jié)點(diǎn),比如<first> 和<second>, <third>都屬于元素節(jié)點(diǎn),卻屬于<example>的子節(jié)點(diǎn)。


           C.attribute值:表示節(jié)點(diǎn)元素的屬性值,比如first 有一個(gè)屬性id,屬性值為1;second也有id屬性,屬性值為2,而third沒(méi)有屬性。


           D.Text值:表示元素中的文本內(nèi)容。比如:first 的text值就為1;second沒(méi)有,third也沒(méi)有;


           一個(gè)xml還包含其他的內(nèi)容:比如處理指令和一些注釋;在python的etree標(biāo)準(zhǔn)庫(kù)解析的過(guò)程中,是直接把這二個(gè)給剔除掉了。有興趣的可以根據(jù)官網(wǎng)給出的開(kāi)發(fā)文檔,把常用的一些方法都敲一遍,主要的還是使用2個(gè)類 Element Objects和ElementTree Objects。


           第三:RF中XML庫(kù)的學(xué)習(xí)。


           在使用sudslibrary做soap協(xié)議的測(cè)試時(shí),返回的xml是帶命名空間的,之前一直不理解,對(duì)XML庫(kù)進(jìn)行整體的學(xué)習(xí)之后就有了很大的理解。


            XML庫(kù)主要有以下幾個(gè)作用(翻譯于原文手冊(cè)):


            A. 解析一個(gè)XML文件,或一個(gè)包含XML的字符串,在一個(gè)XML元素結(jié)構(gòu)中,并從中尋找某些元素,用于進(jìn)一步分析 (e.g. Parse XML and Get Element keywords).


            B. 獲取元素的文本或?qū)傩?e.g. Get Element Text and Get Element Attribute).


            C. 直接驗(yàn)證文本、屬性或全部元素 (e.g Element Text Should Be and Elements Should Be Equal).


            D. 修改和保存它(e.g. Set Element TextAdd Element and Save XML).


            下面按照關(guān)鍵字的類型大致做了以下的學(xué)習(xí):解析的xml都是前面的xml例子


           A.最常用關(guān)鍵字的學(xué)習(xí):


           


           B. 通過(guò)xpath來(lái)搜素子節(jié)點(diǎn)。


          


         C. 簡(jiǎn)單的帶命名空間的xml的解析


             


           D. 復(fù)雜的命名空間的xml解析(之前soap協(xié)議返回的xml的解析部分補(bǔ)充)


          


           這些操作基本都是圍繞著對(duì)XML的讀寫(xiě),之前做報(bào)文測(cè)試的時(shí)候,遇到過(guò)返回的的xml是沒(méi)有根元素的,如果直接使用XML庫(kù)是無(wú)法進(jìn)行解析的,需要加上根節(jié)點(diǎn),再進(jìn)行解析,于是直接寫(xiě)了用戶自定義的庫(kù)。而且當(dāng)時(shí)需要從xml中讀取報(bào)文字段,與測(cè)試數(shù)據(jù)組合后,再一起發(fā)給服務(wù)器,這部分也是XML庫(kù)沒(méi)有提供的內(nèi)容。但是對(duì)返回的xml的數(shù)據(jù)進(jìn)行解析,xml庫(kù)做的還是比較到位。如果覺(jué)得系統(tǒng)帶的xml庫(kù)功能不夠使用,或者想把幾個(gè)功能整成一個(gè)功能使用,通過(guò)以上的學(xué)習(xí)基本可以修改下代碼,然后自定義一個(gè)庫(kù)了。

          還有幾點(diǎn)的學(xué)習(xí),后面還需要對(duì)RF有更深刻的了解才能有所感悟,這次的學(xué)習(xí)給我?guī)?lái)了一些全新的收獲,以前我查找資料很少看官方文檔,雖然英文過(guò)了六級(jí),但是一看英文文檔還是會(huì)頭暈?zāi)X脹,這次逼著自己看了官網(wǎng)的標(biāo)準(zhǔn)庫(kù)的開(kāi)發(fā)文檔和用戶手冊(cè),真感覺(jué)很不錯(cuò),簡(jiǎn)潔又明了,學(xué)習(xí)官網(wǎng)手冊(cè)果然是很不錯(cuò)的學(xué)習(xí)方法,比去看某些博客收獲更全面更權(quán)威~~~這個(gè)技能get了~~~


       


       


       


           

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多