【Selenium05篇】python+selenium實現Web自動化:讀取ini配置文件,元素封裝,代碼封裝,異常處理,兼容多瀏覽器執行

一、前言

最近問我自動化的人確實有點多,個人突發奇想:想從0開始講解python+selenium實現Web自動化測試,請關注博客持續更新!

這是python+selenium實現Web自動化第五篇博文

二、Selenium成套博文地址,總有你需要的:

【Selenium篇01】python+selenium實現Web自動化:搭建環境,Selenium原理,定位元素以及瀏覽器常規操作!

https://blog.csdn.net/pengjiangchun/article/details/105532670

【Selenium02篇】python+selenium實現Web自動化:鼠標操作和鍵盤操作!

https://blog.csdn.net/pengjiangchun/article/details/105532867

【Selenium03篇】python+selenium實現Web自動化:元素三類等待,多窗口切換,警告框處理,下拉框選擇

https://blog.csdn.net/pengjiangchun/article/details/105533107

【Selenium04篇】python+selenium實現Web自動化:文件上傳,Cookie操作,調用 JavaScript,窗口截圖

https://blog.csdn.net/pengjiangchun/article/details/105534081

【Selenium05篇】python+selenium實現Web自動化:讀取ini配置文件,元素封裝,代碼封裝,異常處理,兼容多瀏覽器執行

https://blog.csdn.net/pengjiangchun/article/details/105573687

【Selenium06篇】python+selenium實現Web自動化:日誌處理

https://blog.csdn.net/pengjiangchun/article/details/105574193

【Selenium07篇】python+selenium實現Web自動化:PO模型,PageObject模式!

https://blog.csdn.net/pengjiangchun/article/details/105574676

【Selenium08篇】python+selenium實現Web自動化:數據驅動框架,ddt,關鍵字驅動框架

https://blog.csdn.net/pengjiangchun/article/details/105574954

 

三、Selenium之-讀取元素配置文件

經過前面的學習,我們已經可以寫一些簡單的自動化測試用例,但是你們有沒有感覺到我們寫了大量的重複代碼。例如:頁面中關鍵元素的查找與傳值。對於一個自動化測試頁面來說頁面的元素是相對於比較穩定的,那麼我們就可以把這些重複性的代碼封裝起來,直接去讀取頁面中相對於穩定的元素就可以了,這些元素信息我們可以寫在配置文件中,當頁面元素髮生變動時,只需要修改相應的頁面元素信息即可,不用每次去修改代碼,從而儘可能的避免引入bug。

1.創建配置文件

讀取配置文件前,按頁面元素的特點寫進配置文件中。

[RegisterElement]
register_email = id>register_email
register_nickname = id>register_nickname
register_password = id>register_password
getcode_num = id>getcode_num
captcha_code = id>captcha_code

2.讀取配置文件

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公衆號:軟測之家  更多技術乾貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術羣:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

import configparser


class ReadIni(object):
    # 初始化配置文件路徑及節點加載
    def __init__(self, file_name=None, node=None):
        if file_name is None:
            self.file_name = '../data/RegisterElement.ini'
        if node is None:
            self.node = 'RegisterElement'
        else:
            self.node = node

        self.cf = self.load_ini()

    # 加載配置文件
    def load_ini(self):
        cf = configparser.ConfigParser()
        cf.read(self.file_name)
        return cf

    # 獲取各個配置項的值
    def get_value(self, key):
        data = self.cf.get(self.node, key)
        return data


if __name__ == "__main__":
    ri = ReadIni()
    print(ri.get_value('register_nickname'))

四、Selenium之-元素封裝

查找頁面元素代碼封裝。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公衆號:軟測之家  更多技術乾貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術羣:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""


from util.read_ini import ReadIni


class FindElement(object):
    def __init__(self, driver):
        self.driver = driver

    def get_element(self, key):
        ri = ReadIni()
        data = ri.get_value(key=key)
        by = data.split('>')[0]
        value = data.split('>')[1]
        try:
            if by == 'id':
                return self.driver.find_element_by_id(value)
            elif by == 'name':
                return self.driver.find_element_by_name(value)
            elif by == 'className':
                return self.driver.find_element_by_className(value)
            else:
                return self.driver.find_element_by_xpath(value)
        except:
            file_path = '../image/no_element.png'
            self.driver.save_screenshot(file_path)


if __name__ == "__main__":
    fe = FindElement()
    fe.get_element('register_nickname')

五、Selenium之-代碼封裝

寫到這裏是不是感覺代碼雖然寫出來了,但是很沒有條理性。是的,現在就把代碼模塊化,讓其每個模塊做一部分事情。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公衆號:軟測之家  更多技術乾貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術羣:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

from selenium import webdriver
from time import sleep
from util.read_ini import ReadIni
from basic.find_element import FindElement
import random
from PIL import Image
from api import ShowapiRequest


class Register(object):
    def __init__(self, url):
        self.driver = self.get_driver(url=url)

    # 啓動瀏覽器,打開目標測試頁面url
    def get_driver(self, url):
        driver = webdriver.Chrome('../tools/chromedriver.exe')
        driver.get(url=url)
        driver.maximize_window()
        return driver

    # 定位用戶信息,獲取元素element
    def get_user_element(self, key):
        find_element = FindElement(self.driver)
        user_element = find_element.get_element(key=key)
        return user_element

    # 輸入用戶信息
    def send_user_info(self, key, data):
        self.get_user_element(key=key).send_keys(data)

    # 獲取隨機數
    def get_range(self):
        number = ''.join(random.sample('abcdefg123456', 8))
        return number

    # 獲取驗證碼圖片
    def get_captcha_image(self, file_name):
        self.driver.save_screenshot(filename=file_name)
        captcha_element = self.get_user_element('getcode_num')
        left = captcha_element.location['x']
        top = captcha_element.location['y']
        right = captcha_element.size['width'] + left
        height = captcha_element.size['height'] + top
        image = Image.open(file_name)
        img = image.crop((left, top, right, height))
        img.save(file_name)

    # 識別圖片驗證碼
    def discern_captcha_image(self, file_name):
        self.get_captcha_image(file_name=file_name)
        # 解析驗證碼圖片中的文字(用第三方的圖片驗證碼識別接口 ShowApiRequest)
        r = ShowapiRequest("http://route.showapi.com/184-4", "48120", "12c017278c0845c2bcda177212d2d2ac")
        r.addBodyPara("img_base64", "")
        r.addBodyPara("typeId", "35")
        r.addBodyPara("convert_to_jpg", "0")
        r.addBodyPara("needMorePrecise", "0")
        r.addFilePara("image", file_name)  # 文件上傳時設置
        res = r.post()
        text = res.json()["showapi_res_body"]["Result"]
        return text

    # 主函數
    def main(self):
        register_nickname = self.get_range()
        register_email = self.get_range() + '@163.com'
        register_password = self.get_range() + '@123'
        file_name = '../image/code_image.png'
        captcha_code = self.discern_captcha_image(file_name=file_name)
        self.send_user_info('register_nickname', register_nickname)
        self.send_user_info('register_email', register_email)
        self.send_user_info('register_password', register_password)
        self.send_user_info('captcha_code', captcha_code)
        self.get_user_element('register-btn').click()
        sleep(5)
        self.driver.close()


if __name__ == "__main__":
    register_url = 'http://www.5itest.cn/register'
    r = Register(register_url)
    r.main()

六、Selenium之-異常處理

測試中我們要讓程序暢通運行的同時,也要注意對程序的異常進行處理。例如:由於調用的第三方接口來是被驗證碼圖片,難免會出現識別不了的情況,爲了不阻塞程序的正常運行,當識別出錯的時候,可以對錯誤識別進行異常的處理。

# 在 [RegisterElement.ini] 文件添加驗證碼錯誤的元素id
captcha_code_error = id>captcha_code-error
# 在 package.py 代碼的基礎上加上異常處理
# 異常處理:註冊失敗進行截圖,方便問題排查
        captcha_code_error = self.get_user_element('captcha_code_error')
        if captcha_code_error is None:
            print("......恭喜你註冊成功了......")
        else:
            self.driver.save_screenshot('../image/captcha_code_error.png')
        sleep(5)

七、Selenium之-兼容多瀏覽器執行

在實際的測試中,由於不同瀏覽器的技術標準的差異,導致同一份代碼在不同瀏覽器中的表現形式不一致,所以避免不了多瀏覽器執行測試用例。

注意:FireFox 驅動與 Chrome 的驅動配置不同

下載地址:https://github.com/mozilla/geckodriver/releases 
下載後(根據系統版本選擇):
    (1)解壓取出geckodriver.exe(以64x爲例);
    (2)將geckodriver.exe放到Firefox的安裝目錄下,如:(D:\火狐\Mozilla Firefox);
    (3)將火狐安裝目錄(D:\火狐\Mozilla Firefox)添加到環境變量path中;
    (4)重啓 IDEA,記得一定要

# 兼容多瀏覽器執行測試
    def get_more_driver(self, url, browser):
        if browser == 'chrome':
            # 版本 76.0.3809.100(64位)對應的驅動
            driver = webdriver.Chrome('../tools/chromedriver.exe')
        elif browser == 'firefox':
            # FireFox 68.0.2(64位) 對應的驅動,和 chrome 驅動使用有差異
            driver = webdriver.Firefox()
        driver.get(url=url)
        driver.maximize_window()
        return driver
        

八、持續更新中請關注

如果你覺得此文對你有幫助,如果你對軟件測試、接口測試、自動化測試、面試經驗交流感興趣歡迎加入:

軟件試技術羣:695458161,羣裏發放的免費資料都是筆者十多年測試生涯的精華。還有同行大神一起交流技術哦。

作者:諸葛
出處:https://blog.csdn.net/pengjiangchun
原創不易,歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。

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