robotframework + selenium自動化測試環境搭建與常見的問題

1、通過使用 RFT-64(針對Windows 7 64位的系統)壓縮文件進行一鍵安裝;

     1) 首先解壓RFT-64文件,找到setup.bat文件,以管理員身份運行進行一鍵安裝,根據提示完成安裝操作。

     2) 安裝完成後,打開cmd窗口,輸入python查看環境變量是否配置成功,注:提示‘Python’不是內部或外部命令,說明Python的環境變量沒有配置成功,找到Python的安裝目錄,將安裝路徑配置到環境變量中

     3) 打開cmd窗口,輸入pip list查看安裝過的插件,注:提示‘pip’不是內部或外部命令,說明環境變量沒有配置成功,將....\Python27\Scripts安裝路徑配置到環境變量中

     4) 一切安裝完成後,寫一個簡單的事例,驗證一下驅動,查看是否能夠正常打開瀏覽器,以及對瀏覽器的頁面操作是否正常:

         IE瀏覽器驅動:IEDriverServer.exe

         Google瀏覽器驅動:chromedriver.exe

         Fire Fox瀏覽器  geckodriver.exe    需要安裝對應的版本,否則無法正常啓動瀏覽器

          注:(根據對應的版本選擇對應的驅動程序,這裏選用的是32位的)

          但是我在使用Selenium WebDriver時,遇到了很多坑。這些問題,有的是因爲Selenium WebDriver與瀏覽器不同版本之間兼容性的問題,有的是Selenium WebDriver本身的bug,當然也不乏自己對Selenium WebDriver某些功能理解不透徹。我花時間總結了一下,分享給大家,希望大家以後遇到問題可以避過這些坑,少走彎路。

2、 插入中文數據提示
     FAIL UnicodeEncodeError: 'latin-1' codec can't encode characters in position 92-107: ordinal not in range(25

     DataBaseLibrary插入中文亂碼的解決:修改D:\Python27\Lib\site-packages\DatabaseLibrary\connection_manager.py裏的connect_to_database函數,self._dbconnection = db_api_2.connect (db=dbName, user=dbUsername, passwd=dbPassword, host=dbHost, port=dbPort, charset="utf8"),增加charset設定

3、調用MySQL出現問題

    ImportError: DLL load failed: \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3

    安裝MySQL-pythonMySQL_python-1.2.5-cp27-none-win_amd64.whl,打開cmd窗口,執行pip install  MySQL_python-1.2.5-cp27-none-win_amd64.whl

4、調用cx_Oracle,報錯

    ImportError: DLL load failed: \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3

    解決:RobotFramework在安裝cx_Oracle後,如果直接連接Oracle數據庫時,會出現“Dll load failed”錯誤。因爲Python在使用cx_Oracle類庫訪問oracle需要oci接口。當cx_Oracle找不到需要的oci的dll的時候就會報這個錯誤。

    解決方法可以從oracle的客戶端找3個dll文件拷貝到cx_Oracle的安裝目錄D:\Python25\Lib\site-packages

    oraociei11.dll

    oraocci11.dll

    oci.dll

   資源訪問路徑: http://download.csdn.NET/download/benq0124/7094561

    還是報錯

    ImportError: DLL load failed: %1 \xb2\xbb\xca\xc7\xd3\xd0\xd0\xa7\xb5\xc4 Win32 \xd3\xa6\xd3\xc3\xb3\xcc\xd0\xf2\xa1\xa3

    原因:oci.dll的版本一定要和cx_Oracle模塊的版本一致,不一定要和實際的Oracle的數據版本一致。

 

    例如:cx_Oracle版本是:10g的,那麼oci.dll 也必須是10g的,至於實際連接的數據庫版本,只要版本比10g低就可以了,例如9i。

    解決:網上找oci.dll 64位相對應版本的,拷貝到cx_Oracle的安裝目錄D:\Python27\Lib\site-packages


    InterfaceError: Unable to acquire Oracle environment handle

    我用的客戶端是instantclient,因爲cx_Oracle連接數據庫的時候要用到客戶端中的lib,而python是64位的,cx_Oracle自然是64位的,所以客戶端也應該用64位的。換成64位的instantclient,哈哈,搞掂!

    64位的instantclient不好的地方就是無法用plsql developer了,當然可以在另一臺機器上配置32位的instantclient,然後遠程訪問。

    依然報錯

    InterfaceError: Unable to acquire Oracle environment handle 或者

    ImportError: DLL load failed: %1 \xb2\xbb\xca\xc7\xd3\xd0\xd0\xa7\xb5\xc4 Win32 \xd3\xa6\xd3\xc3\xb3\xcc\xd0\xf2\xa1\xa3

    就是要把instantclient它的安裝路徑配置到環境變量中,配置好以後重新啓動一下ride

 

5、用rf運行IEdriver的速度好慢,比如在輸入框輸入用戶名,一秒輸入一個字符。你們的是不是這樣子的?。如果是chromedriver就很快

      解決辦法:把IEDriver從64位換成32位

6、Firefox啓動不起來,或者是啓動了,頁面是空白的,URL地址欄是空的

       解決辦法:可能是Firefox版本過高,碰到此問題請降低Firefox版本,最好是45.0版本以下

7、怎麼制定robotframework的日誌路徑?

      解決辦法:在run的arguments輸入這個“-l D:\RobotFramework\Robot_Report\log -r D:\RobotFramework\Robot_Report\report -o D:\RobotFramework\Robot_Report\output ”

8、robotframework的case跑完後,“Report”和“Log”按鈕是灰色的,點擊不了

     解決辦法:啓動任務管理器(ctrl+alt+del),IE的進程,找IEDriverServer.exe結束掉,如果是chrome,就找到chromeDriverServer.exe。如下截圖是IE瀏覽器的。

9、數據備份

    1) 通過excel對數據庫進行數據備份

        通過執行以下語句插入excel數據備份表(針對MySQL)

        LOAD DATA LOCAL INFILE "C:/Users/PC/Desktop/t_baike_word_value.csv"   所要插入數據的絕對路徑

 

        INTO TABLE `t_baike_word_value`     所要插入數據的表

 

        CHARACTER SET utf8          設置編碼格式

 

         FIELDS TERMINATED BY "\t"

 

        TERMINATED BY ","

 

        OPTIONALLY ENCLOSED BY '"'

 

        ESCAPED BY '\\'

 

        LINES TERMINATED BY "\r\n"

    2) 直接對數據庫進行操作

        MySQL    user_center    user_center    user_center

        Oracle      p95100     l234123   orcl

10、元素定位

       1)元素定位的方法:findElement() 與 findElements()

            a、findElement() 該方法返回基於指定查詢條件的webElement對象,或拋出不符合條件的異常  eg:driver.findElement(By.id("userID"));

       b、findElements() 該方法返回指定查詢條件的WebElement的對象集合,或返回null
       2)WebElement對象提供的各種定位元素策略
           
            ID:driver.findElement(By.id(<elementID>))
            Name:driver.findElement(By.name(<elementName>))
            className:driver.findElement(By.className(<elementClassName>))
            tagName:driver.findElement(By.tagName(<htmlTagName>))
            linkText:driver.findElement(By.linkText(<linkText>))
            partialLinkText:driver.findElement(By.partialLinkText(<partialLinkText>))
            css:driver.findElement(By.cssSelector(<cssSelector>))
            xpath:driver.findElement(By.xpath(<xpathQuery>))
     3)webelement類提供了諸多方法
           在我們開發腳本過程中如何選擇最可靠,效率最高的方法,使用id,name是首選,因爲他們在html標籤中是唯一的,所以是最可靠的
     ID定位:driver.findElement(By.id("username"))
     name定位:driver.findElement(By.name("username"))
     class定位:driver.findElement(By.className("username"))
     多學一招:WebElement類支持查詢子類元素,如果頁面中存在重複元素,但在不同div中,我們可以先定位到其父元素,然後定位其子元素,方法如下:
     WebElement hello = driver.findElement(By.id("div1")).findElement(By.lindText("hello"));
     4)使用WebElements定位多個相似的元素
          比如頁面中存在五個單選按鈕,他們有相同的class屬性,值爲:myRadio,我們想對五個按鈕循環操作,我們可以把它們全部取出來放到集合中,然後做循環操作,如下:
          List<WebElement> radios = driver.findElements(By.className("myRadio"));
          for(int i = 0;i<radios.size();i++){
                radios.get(i).click();
          }
          其他定位方法與操作id,name類似,這裏不再贅述,接下來我着重對css選擇器與Xpath描述下
      5)WebDriver 的By類中提供了cssSelector()方法,該方法使用有以下幾種形式:
           a、使用相對路徑定位元素
                 如,我們要定爲DOM中的input元素,我們可以這樣操作,不考慮其在DOM中的位置,但這樣做存在一定弊端,當DOM中存在多個input元素時,該方法總返回DOM中的第一個元素,這並不是我們所期待的
            eg:WebElement username = driver.findElement(By.cssSelector("input"));
            另外,爲了使用這種方法更準確的定位元素,我們可以結合該元素的其他屬性來實現精確定位的目的
     b、結合id來定位,driver.findElement(By.cssSelector("input#username")); 在標籤與id之間使用#連接,如果對css瞭解的朋友一看就知道爲什麼會這樣寫了,不瞭解也沒關係,只要記住這種寫法就OK了
            另外該方法也可簡寫爲driver.findElement(By.cssSelector("#username")); 有點兒類似於id選擇器
          c、使用元素的任何屬性來定位元素
           driver.findElement(By.cssSelector("標籤名[屬性名='屬性值']"));
     d、匹配部分屬性值
                ^=        driver.findElement(By.cssSelector("標籤名[屬性名^='xxx']"));  匹配屬性值以xxx開頭的元素
                $=        driver.findElement(By.cssSelector("標籤名[屬性名$='xxx']"));  匹配屬性值以xxx結尾的元素
                *=         driver.findElement(By.cssSelector("標籤名[屬性名^='xxx']"));  匹配屬性值包含xxx的元素
      6)使用相對+絕對路徑方法
            這裏是我自己定義的方法,方便記憶,的確也是這樣來實現的
       driver.findElement(By.cssSelector("div#login>input"))   該方法中“div#login>input” 首先通過相對路徑定位到id爲login的div元素,然後查找其子元素input(絕對路徑)
      7)使用xpath定位元素
            相比cssSelector,xpath是我比較常用的一種定位元素的方式,因爲它很方便,缺點是,消耗系統性能
            a、使用絕對路徑定位元素
                  driver.findElement(By.xpath("/html/body/div/form/input"))
      b、使用相對路徑定位元素
            driver.findElement(By.xpath("//input"))   返回查找到的第一個符合條件的元素
      c、使用索引定位元素,索引的初始值爲1,注意與數組等區分開
           driver.findElement(By.xpath("//input[2]"))   返回查找到的第二個符合條件的元素
      d、結合屬性值來定位元素
           driver.findElement(By.xpath("//input[@id='username']"));
           driver.findElement(By.xpath("//img[@alt='flowr']"));
      e、使用邏輯運算符,結合屬性值定位元素,and與or
           driver.findElement(By.xpath("//input[@id='username' and @name='userID']"));
      f、使用屬性名來定位元素
           driver.findElement(By.xpath("//input[@button]"))
      g、類似於cssSlector,使用部分屬性值匹配元素
                 starts-with()    driver.findElement(By.xpath("//input[stars-with(@id,'user')]"))
                 ends-with        driver.findElement(By.xpath("//input[ends-with(@id,'name')]"))
                 contains()        driver.findElement(By.xpath("//input[contains(@id,"ernam")]"))
      8)使用任意屬性值匹配元素
      driver.findElement(By.xpath("//input[@*='username']"))
   9)使用innerText定位元素
     a、使用cssSelector查找innerText定位元素
           driver.findElement(By.cssSelector("span[textContent='新聞']"));
     b、使用xpath的text函數
          driver.findElement(By.xpath("//span[contains(text(),'hello')]"))   包含匹配
          driver.findElement(By.xpath("//span[text()='新聞']"))     絕對匹配

11、jenkins集成執行

  1)首先需要申請一臺遠程測試機;

  2)然後在jenkins新建一個節點

  3)然後在該節點下面新建測試工程

  4)配置項目       

      命令執行:pybot -i P1 -l log.html -r report.html -o output.xml C:\jenkins\workspace\autoTest_portal\autoTest\GuaHao_Web

    







如果想學習更多相關Robotframework的知識的朋友可以加QQ羣進行溝通交流:selenium2+RFS自動化 232607095

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章