1. 程式人生 > >selenium實現模組化

selenium實現模組化

在selenium的自動化指令碼中,有許多東西是總是呼叫的,比如登陸,那麼就可以將其模組化,獨立出來,從而可以使自動化指令碼更加簡潔.如下以登陸為例來實現模組化:

現有一個自動化指令碼如下,為驗證是否正常登陸的:

test1.py

# -*- coding: UTF-8 -*-
'''
Created on 2015年3月28日

@author: dff
'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
from selenium.webdriver.support.wait import WebDriverWait

class Login_user(unittest.TestCase):
    def setUp(self):
        self.driver =webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://192.168.11.14/"
        self.verificationErrors = []
        self.accept_next_alert = True
        self.driver.get(self.base_url + "/auth/login/")  
        
            
    def test_login_admin(self):
        '''管理員使用者登陸'''
        driver=self.driver
        time.sleep(0.5)
        driver.find_element_by_id("id_username").clear()
        driver.find_element_by_id("id_username").send_keys("admin")        
        driver.find_element_by_id("id_password").clear()
        driver.find_element_by_id("id_password").send_keys("ADMIN_PASS")
        driver.find_element_by_xpath("//button[@type='submit']").click()
        driver.get_window_position(windowHandle)
        d=driver.get_window_size('current')
        print d
        print driver.get_window_position("current")
        url=driver.current_url
        print url
        handle=driver.current_window_handle
        print handle
        self.assertEqual( u"使用概況 - Delicate Cloud Dashboard", driver.title,'login fail')
   
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()
下面需要將login那部分模組化,即如下部分
        driver.find_element_by_id("id_username").clear()
        driver.find_element_by_id("id_username").send_keys("admin")        
        driver.find_element_by_id("id_password").clear()
        driver.find_element_by_id("id_password").send_keys("ADMIN_PASS")
        driver.find_element_by_xpath("//button[@type='submit']").click()
那麼我們新建一個module,為action.py,如下:
# -*- coding:UTF-8 -*-
'''
Created on 2015年4月2日

@author: dff
'''
import unittest,time
from  selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.support.wait import WebDriverWait
class lo():
    def __init__(self,driver):
        self._driver=driver
    def login_(self,name='admin',pw='ADMIN_PASS'): 
        self._driver.find_element_by_id("id_username").clear()
        self._driver.find_element_by_id("id_username").send_keys(name)
        self._driver.find_element_by_id("id_password").clear()
        self._driver.find_element_by_id("id_password").send_keys(pw)
        self._driver.find_element_by_xpath("//button[@type='submit']").click()

另外此檔案的放置位置我放在另外一個package中,路徑如下:

webtest-->src-->justfortest/test1.py

                             common/action.py

那麼在test1.py中呼叫可以用如下方法:

本例中將此登陸呼叫放在setup函式中:

首先需要import此模組,如

from common.action import lo

修改後部分程式碼如下:

class Login_user(unittest.TestCase):
    def setUp(self):
        self.driver =webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://192.168.11.14/"
        self.verificationErrors = []
        self.accept_next_alert = True
        self.driver.get(self.base_url + "/auth/login/")
        lo(self.driver).login_()

上面程式碼中紅色部分即為呼叫登陸,實測結果如下:

{u'width': 1164, u'height': 629}
{u'y': 24, u'x': 436}
http://192.168.11.14/admin/
{ce3619ce-bb1b-492f-ba92-6585e05f8416}
.
----------------------------------------------------------------------
Ran 1 test in 10.524s

OK

如此即可將test_admin_login函式中的登陸部分去掉,實現模組化指令碼;

以此為方法,可將其他部分模組化,如退出,切換目錄等;

相關推薦

selenium實現模組

在selenium的自動化指令碼中,有許多東西是總是呼叫的,比如登陸,那麼就可以將其模組化,獨立出來,從而可以使自動化指令碼更加簡潔.如下以登陸為例來實現模組化: 現有一個自動化指令碼如下,為驗證是否正常登陸的: test1.py # -*- coding: UTF-8

C程式設計|用函式實現模組程式設計詳解(一)

目錄 一、為什麼要用函式 使用函式可使程式清晰、精煉、簡單、靈活。 函式就是功能。每一個函式用來實現一個特定的功能。函式名應反映其代表的功能。 在設計

傳統HTML頁面實現模組載入

對於網站來說很多頁面之間都有著大量的共享模組,如頁頭,頁尾和使用者欄等。對於具備後端檢視引擎的框架來說這些共享都比較容易抽取,如asp.net mvc來說就有統一佈局的MasterPage,@Section等功能可以共享檢視模板功能。但對於HTML就沒這麼幸運了,在html檔案裡並不具備這些功能,所以當你用純

JS-export和import實現模組管理

    JS中經常會用到export和import,以實現程式碼模組化管理。其中:      export:用於對外輸出本模組(一個檔案可以理解為一個模組)變數的介面      im

openlayers5.x結合webpack4.x實現模組引用

一、問題來源分析:openlayers5.x以來採用的是ES6(ECMAScript 6,注:ECMAScript 和 JavaScript 的關係是,前者是後者的規格,後者是前者的一種實現(另外的 ECMAScript 方言還有 Jscript 和 ActionScript

BaseAdapter的封裝來實現模組開發

引子 要在一個手掌大的手機上展示各種豐富的資訊,橫向滑動與上下滑動已經成為了手機應用不可缺少的一部分。對於上下滑動,有一個被小看的神器ListView配合Adapter。為什麼被小看了呢?對比ScrollView來說,ListView不僅能夠實現不同介面的

使用Webpack ES6轉ES5 實現模組(import export)

1.安裝nodejs:開啟nodejs官網https://nodejs.org/en/,點選碩大的綠色Download按鈕,它會根據系統資訊選擇對應版本(.msi檔案)。   開啟命令提示符執行下列命令(開啟方式:window + r 輸入cmd回車)   node -v檢

(3)javascript實現模組

1.引言       在實現js的模組化之前,我們首先想一下為什麼要實現模組化程式設計呢?實現模組化程式設計有什麼好處呢?或者說實現模組化程式設計我們可以解決什麼樣子的問題呢?如果在看本篇部落格之前你不懂js的作用域鏈,請務必先看js的作用域鏈原理

Flask 用Blueprint實現模組的應用

在一個大型專案中,肯定會有很多模組組成,比如一個網路管理系統可能有流量運營模組,實時分析模組,故障預警模組等。我們可以利用Flask Blueprint 實現每個模組的功能進行獨立的開發與管理,後

使用DroidPlugin實現模組開發(主要說呼叫)

github地址:https://github.com/DroidPluginTeam/DroidPlugin/blob/master/readme_cn.md 關於配置,跟著說明文件配置吧。 關於跳轉呼叫, 使用new Intent(String ActiviyUrl),你會發現,

ES6新特性:使用export和import實現模組

  在ES6前, 前端就使用RequireJS或者seaJS實現模組化, requireJS是基於AMD規範的模組化庫,  而像seaJS是基於CMD規範的模組化庫,  兩者都是為了為了推廣前端模組化的工具, 更多有關AMD和CMD的區別, 後面參考給了幾個連結;    現在ES6自帶了模組化, 也是JS第

使用requirejs程式設計實現模組

下載 命令列下載:bower install requirejs 或者 npm install requirejs 官網下載點選下載requirejs 主要方法 define定義模組 require 載入模組 案例一 目錄結構 i

如何用JS實現模組?JS的模組模式詳解

JS的模組化是很常見的一個需求,在日常的開發過程中經常會用到,但是今天瞭解完這個知識點,才算是徹底明白了為什麼要那樣實現,真是醍醐灌頂,受益匪淺。一 JS中的私有變數和特權方法和其他語言不同,JS中沒有私有,共有,類的概念。但是很特殊的一點,在JS的function中,有個私

使用velocity模板使javaWeb的html+js實現模組

頁面上一些基礎資料或者其他頁面經常用到部分,可以獨立出來做成小元件,元件預留呼叫入口,需要的頁面直接呼叫即可。 如圖,頁面中的展示分類和搜尋標籤在多個頁面重複使用,可以將這部分內容獨立出來,做成元件,供後續開發呼叫: classify_search_tag.html檔案如

163郵箱自動化登入實現模組

from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains url = 'http://mail.163.com/'

運用 CSS methodologies 去實現模組

一、什麼是 CSS methodologies CSS methodologies,可以理解成 設計模式,也可以理解成 css 規範,市面使用情況如下圖: 上圖來源:https://2019.stateofcss.com/technologies/ 你可能在日常開發中並不會專門花時間去注意和了解 C

運用 CSS in JS 實現模組

一、什麼是 CSS in JS 上圖來源:https://2019.stateofcss.com/technologies/ CSS in JS 是2014年推出的一種設計模式,它的核心思想是把 CSS 直接寫到各自元件中,而不是單獨的樣式檔案裡。 CSS in js 的發展: 最早就是內聯樣式

selenium模組和資料驅動

  模組化: 登入模組檔名:publiclogin.py # coding=utf-8 #登入模組 def login(dr): dr.find_element_by_id('login-username').send_keys('username') dr.find_

模組載入的實現

原文連結:http://caibaojian.com/module-definition.html 淺談模組化載入的實現原理 A- A+ 前端部落格 •2015-03-04 • 前端開發 •AMD&nbs

Selenium WebDriver API 進階使用,模組引數進行自動化測試設計

WebDriver API 進階使用 元素定位 我們知道,WebDriver API的呼叫以及自動化測試,務必從頁面元素的定位開始,WebDriver提供了一系列的定位符以便使用元素定位方法。常見的定位符有以下幾種: id name class name tag link te