1. 程式人生 > >Python+Selenium前端頁面測試自動化

Python+Selenium前端頁面測試自動化

(selenium學習日誌一)

【找元素】

學習selenium,個人的感覺是主要任務在【找元素】。而對於查詢頁面元素,有以下幾個方法:

  1. find_element(self, by=By.ID, value=None)                   #需要 importfrom selenium.webdriver.common.by import By
  2. find_element_by_css_selector(self, css_selector)  #通過CSS樣式,如“#kw”
  3. find_element_by_class_name(self, name)                #通過node的classname,如<div class='sample'>
  4. find_element_by_tag_name(self, name)                    #相當於node name ,如<dvi></div>
  5. find_element_by_name(self, name)                            #通過node的name屬性
  6. find_element_by_partial_link_text(self, link_text)      #部分連結文字,如<a>登入 sign</a>
  7. find_element_by_link_text(self, link_text)                    #全部連結文字,如<a>sign</a>
  8. find_element_by_xpath(self, xpath)                              #xpath路徑
  9. find_element_by_id(self, id_)

如果有id,自然用find_element_by_id,如果沒有,建議使用find_element_by_xpath,這個可以應付頁面上的所有元素。而很多時候,常常會出現 No Such Element的報錯。

針對這個問題,我歸納有以下幾點:

1、元素處在不同的frame、iframe;

2、元素處在不同的window視窗;

3、頁面未載入成功,元素不存在;

4、(也算第三點的一部分)由於網路線路等等原因,導致與伺服器中斷(又或者,你的這個請求得到的結果不正確,只是伺服器只以為正確了),部分元素沒來得及載入。

        請注意,這裡我強調的是瀏覽器“放棄”請求。

我的解決方案如下:

1、可以使用switch_to_frame一層層迭代,再查詢元素;

2、可以使用switch_to_window;

3、網上的建議有兩點:第一,使用WebDriverWait智慧等待,如WebDriverWait(self.driver,7000).until(EC.alert_is_present(),"Time out,alert not appear");

                                          第二,設定頁面載入等待時間,如self.driver.implicitly_wait(10)

     以上兩點,我建議第一點,但在我實際操作中,依然沒有很智慧,還是會報No Such Element的錯誤。因此,我建議自己寫一個函式等待,用起來順心,如下:

def WaitAndFindElement(self,by,value=0,timedeta=5,timeout=300):
        element = None
        endtime = timeout
        
        while endtime > 0:
            try:
                element = self._driver.find_element(by, value)
            except:
                pass
            if element:
                break
            else:
                time.sleep(timedeta)
                endtime = endtime - timedeta
        
        return element
     

      同時,頁面載入時間是不固定的,會因為你的網路而有所變化,所以強烈建議以上方法,智慧等待。

      另外,有網上有不少人問:WebDriver如何判斷一個頁面是否載入成功?

       對這個問題,我想沒有現成的函式實現。有人回答,len(driver.page_source) > 200,或者查詢某個元素是否存在用來判斷頁面是否載入成功.....

      個人感覺,問這個問題的思路錯了。因為,WebDriver頁面測試應著眼於元素上,而不應該死死盯在頁面上。所以,我們應該想的是元素是否載入成功

4、 當你使用第三點中的方法,智慧等待元素出現的時候,如果沒有發現【返回結果不正確】或者【已和伺服器斷開】,好吧,你就傻傻地等待。我曾遇到

      這種情況,此時只需要重新請求即可,即driver.refresh()。如果你有想法,可以改寫第三點的方法,請不要死迴圈或者多次請求,伺服器會罵孃的。

【彈窗處理】

html dom 彈出有以下幾種:

1、window.open(新頁面.html)   彈出一個新的頁面,不常用;

2、window.showModalDialog   彈出子視窗,有父子關係;

3、alert 、 confirm、prompt,彈出子視窗,有父子關係;

4、通過javascript控制div彈出,屬於原來的頁面,不存在父子關係,現在最流行的彈窗方式

第一到第三點,組合使用switch_to_window、switch_to_frame、driver.switch_to_alert().accept()都能解決問題,也沒什麼好說的。我想強調的是這幾點的區分,

很多時候,我們一看到彈出,就立刻使用driver.switch_to_alert().accept()處理。最煩的是,程式報錯了也沒醒悟,一直忙著去問度娘。親,度娘也沒想到你會這樣子啊。

請看,左邊的是confirm彈窗,右邊是div彈出,很明顯嘛。如果再無法區分,可以檢視html,因為第四點不存在父子關係,所以【確定】按鈕可以從html中找到。

【隱藏元素處理】

在這裡插個題外話,html隱藏元素有兩種:

1、display:none     相當於元素從頁面中被移走,它下面所在的元素跟上填充,即消失

2、visibility=false   元素被隱藏,但位置還在

(以下方法有針對第一種實踐過,第二種在理論上方法適用)

先模擬第一點:(A為隱藏元素Element)當滑鼠移動元素B上時,元素A出現;等滑鼠離開,元素A隱藏

解決方法:

方案一:使用ActionChains(driver).move_to_element(B) 。也許,此時你會訝異,A元素沒出現。其實,A元素出現,只是在你看到她之前,她又匆匆離去

                原因在於move_to_element在執行時,滑鼠在B上,執行後,滑鼠已離開B。為了達到滑鼠懸停的效率,可以使用如下方法:

                ActionChains(driver).move_to_element(B).click_and_hold()

                可沒想到的是,元素B竟然是個連結,當點選後,driver發生了頁面跳轉,滑鼠去到一個新的頁面,你只有悲傷地看著她離你越來越遠了。

                如果你不放棄,可以考慮【迴圈】,即是,你嘗試千萬次的接觸,縱使千萬次都擦肩而過,只為A的一次回眸。

                但這種方法成功的概率很低,且耗時多,不管你有多痴情。程式碼如下:  

    def ClickA():
        try:
            favs_close = fs.find_element_by_xpath('../preceding-sibling::a[@class="S_close"]') #元素B的xpath
        except:
            return False
        return True
    
    def MoveToAndClickA():
        while True:
            driver.move_to_element(B)
            result = ClickA()
            if result:
                break

方法二:(極力推薦)使用javascript直接操作隱藏元素A,selenium使用execute_script()執行指令碼。這是個完美的解決方案,且普遍適用,因為js可以操作所有的DOM

                  節點。js指令碼中,你可以使用

                   var elementA= document.getElementByClassName(A)    (或者使用getElementsByTagName等等)

                   do something at A

以上為個人經驗所談,如有錯誤,望各位指出

相關推薦

Python+Selenium前端頁面測試自動化

(selenium學習日誌一) 【找元素】 學習selenium,個人的感覺是主要任務在【找元素】。而對於查詢頁面元素,有以下幾個方法: find_element(self, by=By.ID, value=None)                   #需要 impor

python+selenium實現網頁測試自動化

很久沒有寫新文章了,去年入職了新公司,每天都忙的很,新鮮的人,新鮮的事物,新鮮的技術,終於有了一種成為程式猿的感覺了。 今天貼一點程式碼出來,順便種草一個自動化網頁測試框架selenium,真的非常不錯,學習成本不高,但是一旦瞭解,你會發現他真的可以做很多的東西。比

Python Selenium unittest+HTMLTestRunner實現 自動化測試及發送測試報告郵件

dir span 情況 smt imp pen port 介紹 sleep 1、UI測試框架搭建-目錄結構 2、 文件介紹 2.1、baseinfo->__init__.py 配置文件定義基礎參數 #-*-coding:utf-8-*

一個基於python+selenium的page-object自動化測試框架

先上框架git連結:https://gitee.com/yukarijiang/watcher#0-qzone-1-79223-d020d2d2a4e8d1a374a433f596ad1440這個框架目前才剛剛起步,還有很多不完善和不適當的地方,但可以用於學習selenium

一次完整的自動化登入測試-基於python+selenium進行cnblog的自動化登入測試

Web登入測試是很常見的測試!手動測試大家再熟悉不過了,那如何進行自動化登入測試呢!本文作者就用python+selenium結合unittest單元測試框架來進行一次簡單但比較完整的cnblog自動化登入測試,給大家提供點參考!下面就包括測試程式碼和每種測試情況的截圖:

python+selenium個人開發的自動化測試框架

1、為什麼開發這個框架呢?      首先,自從做測試行業以來,沒有屬於自己的東西,功能測試這塊可以說沒有什麼技術性的積累,都是經驗;效能測試方面,用過jmeter、loadrunner,積累的經驗比較淺薄;自動化測試接觸過java+selenium; 在網上或者測試行業現

在Linux下實現Python+selenium+chrome的web自動化測試

宣告:ubuntu版本是在16.04下進行的 1、首先需要先安裝Chrome sudo apt-get install libxss1 libappindicator1 libindicator7 wget https://dl.google.com/linux/direc

一隻自動化測試小白的學習記錄——Python+Selenium基於Web的自動化測試(例項練習)

也有兩天沒更新了 哎~這學期的課還挺多的 都是利用課餘的一些時間來學習自動化測試(抱怨臉(╯▔皿▔)╯)這兩天我在練習的是一個相對完整的Web自動化測試,也是對前些日子學習內容的整合,具體來說如下:1.開啟瀏覽器2.輸入網址開啟網頁(我是以鏈家網為練習的,因為想到明年畢業後要

python selenium中如何測試360等基於chrome內核的瀏覽器

desire 2個 des pat 直接 self 方法 .com spl 轉自:https://blog.csdn.net/five3/article/details/50013159 直接上代碼,註意是基於chrome內核的瀏覽器,基於ie的請替換其中的chro

Python+Selenium 定位頁面元素

bdr web ren https con 框架 content 進行 www. 1.跳轉到Frame/Iframe ,再定位元素理解:frame的實質,frame中實際上是嵌入了另一個頁面,而webdriver每次只能在一個頁面識別,因此需要先定位到相應的frame,對那

python+selenium+BSTestRunner生成測試報告

python版本是3.6 一、BSTestRunner.py檔案 """ A TestRunner for use with the Python unit testing framework. It generates a HTML report to show the res

【筆記】python+selenium 一個簡單的自動化指令碼

環境 python 3.6.1 firefox  63.0.1 selenium 3.141.0 注:geckodriver與firefox版本要相對應  否則會出現一些模組引用錯誤 from selenium import webdriver from t

前端 頁面測試工具 sitespeed.io

上2個核心網址 第一個官網   第二個部落格 本人使用node 環境進行sitespeed.io使用的   電腦mac系統   所以 其它的  不多說了 第一  安裝node.js   配置

Python+selenium第一個測試案例

1、安裝Python35我安裝的版本是v3.5.2,Windows系統安裝過程中記得勾選安裝到環境的複選框:Add Python 3.5 to PATH,不然安裝完成後還需要手動進行環境變數的配置。2、下載selenium外掛在cmd中輸入命令:python-m pip in

Python+Selenium之HTML測試報告

drive stc style tun pan assert star 搜索 cas 下載 HTMLTestRunner 模塊 下載地址:http://tungwaiyip.info/software/HTMLTestRunner.html 保存路徑:將下載的HTMLT

Pythonselenium模塊(瀏覽器自動化工具)

滾輪 展示 人民幣 google key bdr cut googl add selenium可以用來完成瀏覽器自動化相關的操作,寫一些代碼制定一些基於瀏覽器自動化的相關操作(行為動作),當代碼執行後,瀏覽器就會自動觸發相關的事件 安裝方法:   pip insta

python+selenium自動化軟件測試(第6章):selenium phantomjs頁面解析使用

前端 down word logs pan canvas 鼠標 agent 瀏覽器中 我們都知道Selenium是一個Web的自動化測試工具,可以在多平臺下操作多種瀏覽器進行各種動作,比如運行瀏覽器,訪問頁面,點擊按鈕,提交表單,瀏覽器窗口調整,鼠標右鍵和拖放動作,下拉框和

python selenium自動化(一)點選頁面連結測試

需求:現在有一個網站的頁面,我希望用python自動化的測試點選這個頁面上所有的在本視窗跳轉,並且是本站內的連結,前往到連結頁面之後在通過後退返回到原始頁面。 要完成這個需求就必須實現3點: 1. 找到原始頁面上面所有的在本視窗內跳轉的連結 2. 跳轉到目標頁面之後,“後退”到原始頁面 3. 在原

selenium+python環境的搭建的自動化測試

ignore ble 卸載 onf specified oot mea png tar 一、安裝python: 我安裝的是2.7.13版本的;可以在CMD下 運行python命令查看是否安裝python,以及安裝版本; 在https://www.pyt

python+selenium自動化測試環境安裝

更改 可用 測試 tun art pyc amber 執行 文件的 因為自己安裝自動化測試環境時,遇到過許多問題,自己整理了一下安裝的步驟,感謝那些幫助過我的人。 1.安裝python,我裝的是3.5版本,網絡上也有許多安裝步驟,照著就可以了(其實一直下一步也行) 不