当前位置:网站首页>Analyse et cas du modèle pageobject
Analyse et cas du modèle pageobject
2022-07-01 03:49:00 【Recherche de rêves Feng】
Un.、POMode:
Page Object(AbréviationsPO)Mode,- Oui.SeleniumLe plus populaire dans le combat réel,Et c'est l'un des modèles de conception les plus familiers et les plus respectés dans les tests automatisés.Lors de la conception des tests automatisés,Résumer les éléments de la page et les méthodes de fonctionnement des éléments en fonction de la page,Se détacher en un certain objet,Puis l'Organisation.
Fais - le.webUn des problèmes les plus épineux de l'automatisation,Il n'y a rien de tel que le changement de page,Si non utiliséPOMode de conception,Un changement de page signifie que l'emplacement précédent de l'élément ou même la méthode de fonctionnement de l'élément ne peut pas être utilisé,Doit être modifié.Vous avez besoin d'un moyen de localiser les éléments à modifier à partir du script de test、Méthode de fonctionnement de l'élément trouvé,Et les modifier un par un.Un tel script automatisé n'est pas seulement fastidieux,Les coûts d'entretien sont également très élevés.
Etpage objectLe modèle résout bien ce problème,Avantages:
Réduire la redondance des codes
Séparation des activités et de la mise en oeuvre
Réduire les coûts d'entretien
Qu'est - ce que c'est?Page ObjectMode,Voir nom et sens,C'est l'objet de la page,Dans les tests automatisés pratiques,Les scripts sont généralement divisés en trois niveaux:
Couche objet: Pour le positionnement des éléments de page
Niveau logique: Pour stocker des modules de cas d'utilisation de fonctions encapsulées
Business level: La partie opérationnelle utilisée pour stocker nos vrais cas d'essai
En plus des trois étages ci - dessus,Il y a aussi une couche de base,La couche de fondation est principalement destinée àseleniumQuelques méthodes communes,Encapsulation secondaire selon les besoins opérationnels réels,Cliquez sur、Entrée, etc. ajoutez un peu d'attente、Entrée du Journal、Capture d'écran, etc., Pratique pour vérifier l'exécution du script et le dépannage plus tard .
2.、Niveau de base:
Les noms de classe de base sont généralement nommés BasePage, Les couches d'objets suivantes héritent de cette classe de base lorsqu'elles manipulent des éléments , Cliquez ci - dessous pour 、 Exemple d'entrée :
# basepage.py
import os
import time
import datetime
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from common.logging import log
from common.constant import IMG_DIR
class BasePage:
def __init__(self, driver: WebDriver):
self.driver = driver
def wait_ele_visible(self, loc, img_desc, timeout=20, frequency=0.5):
"""Attendre que l'élément soit visible"""
try:
WebDriverWait(self.driver, timeout, frequency).until(EC.visibility_of_element_located(loc))
log.info("Attendez.:{} - Élément{} Succès visible .".format(img_desc, loc))
except:
log.exception("Attendez.:{} - Élément{} Échec visible !".format(img_desc, loc))
self.save_img(img_desc)
raise
def get_element(self, loc, img_desc):
"""Rechercher des éléments"""
try:
ele = self.driver.find_element(*loc)
except:
log.exception("Trouver:{} - Élément{}Échec!".format(img_desc, loc))
self.save_img(img_desc)
raise
else:
log.info("Trouver:{} - Élément{}Succès".format(img_desc, loc))
return ele
def click_element(self, loc, img_desc, timeout=20, frequency=0.5):
"""Cliquez sur l'élément"""
self.wait_ele_visible(loc, img_desc, timeout, frequency)
ele = self.get_element(loc, img_desc)
try:
ele.click()
log.info("Cliquez sur:{} - Élément{}Succès".format(img_desc, loc))
except:
log.exception("Cliquez sur:{} - Élément{}Échec!".format(img_desc, loc))
self.save_img(img_desc)
raise
def input_text(self, loc, value, img_desc, timeout=20, frequency=0.5):
""" Saisissez le texte dans l'élément """
self.wait_ele_visible(loc, img_desc, timeout, frequency)
ele = self.get_element(loc, img_desc)
try:
ele.send_keys(value)
log.info("Entrée:In{} - Élément{}Saisissez la valeur du texte({})Succès".format(img_desc, loc, value))
except:
log.exception("Entrée:In{} - Élément{}Saisissez la valeur du texte({})Échec!".format(img_desc, loc, value))
self.save_img(img_desc)
raise
def save_img(self, img_description):
""" Enregistrer la capture d'écran d'exception """
now = time.strftime("%Y-%m-%d %H-%M-%S ", time.localtime())
img_path = os.path.join(IMG_DIR, now + img_description + '.png')
try:
self.driver.save_screenshot(img_path)
except:
log.exception(" La capture d'écran d'exception a échoué !")
else:
log.info(" Capture d'écran anormale réussie , Les captures d'écran sont stockées dans {}".format(img_path))
Pour cliquer surclick_element()Par exemple, L'opération d'attente est ajoutée ici lors de l'encapsulation secondaire 、Entrée du Journal、Capture d'écran anormale, Appelé directement lorsque l'élément est cliqué plus tard click_element() Juste un pas en avant , Plus besoin de penser à attendre 、Log、Situation anormale, Tout est réglé ici , Bien que l'écriture initiale de la page de base puisse prendre du temps , Mais tant que les fondations sont en place , Il sera beaucoup plus facile lors des travaux d'entretien ultérieurs . Ce qui précède n'est qu'un exemple , Peut être optimisé en fonction de vos besoins réels .
Trois、Couche objet、Niveau logique:
La couche objet contient l'emplacement de l'élément de page , Méthode de fonctionnement de l'élément de stockage de la couche logique (Fonctions de la page), Le positionnement des éléments peut être adapté aux besoins réels , Il peut être maintenu dans un seul module , Peut également être conservé dans excel Pour une gestion centralisée ; Voici une démonstration de l'emplacement des éléments et des méthodes de fonctionnement des éléments stockés dans un module , Une page, un module , Les éléments suivants de la page ont changé , Il suffit de modifier l'expression de positionnement ou la méthode de fonctionnement correspondante dans ce module .
La démonstration prend la page d'accueil de Baidu comme exemple :
# baidu_page.py
from selenium.webdriver.common.by import By
from common.basepage import BasePage
class LoginPage(BasePage):
login_btn = (By.XPATH, '//div[@id="u1"]//a[@name="tj_login"]') # Bouton de connexion
username_login_btn = (By.ID, 'TANGRAM__PSP_11__footerULoginBtn') # Bouton de connexion du nom d'utilisateur
user_input = (By.ID, 'TANGRAM__PSP_11__userName') # Zone d'entrée d'information de l'utilisateur
pwd_input = (By.ID, 'TANGRAM__PSP_11__password') # Zone d'entrée du mot de passe
login_submit = (By.ID, 'TANGRAM__PSP_11__submit') # Login submit button
def login(self, user, pwd):
""" Baidu username login :param user: Téléphone portable/Boîte aux lettres/Nom d'utilisateur :param pwd: Mot de passe :return: """
self.click_element(self.login_btn, 'Baidu-Connexion')
self.click_element(self.username_login_btn, 'Baidu login-Connexion par nom d'utilisateur')
self.input_text(self.user_input, user, 'Connexion par nom d'utilisateur-Téléphone portable/Boîte aux lettres/Nom d'utilisateur')
self.input_text(self.pwd_input, pwd, 'Connexion par nom d'utilisateur-Mot de passe')
self.click_element(self.login_submit, 'Connexion par nom d'utilisateur-Connexion')
Quatre、Business level:
Pour stocker de vraies opérations de cas d'essai , Le positionnement des éléments n'apparaît pas ici 、Fonctions de la page, Toutes les opérations appellent directement la couche logique .
Cas d'essai = Fonction de l'objet d'essai + Données d'essai, Voici un exemple de connexion Baidu (Pour la démonstration, Bref ):
import unittest
import pytest
import ddt
from selenium import webdriver
from PageObjects.baidu_login_page import LoginPage
from testdatas import common_datas as com_d
from testdatas import login_data as lo_d
from common.logging import log
@ddt.ddt
class TestLogin(unittest.TestCase):
def setUp(self):
log.info("------- Utiliser le travail de préposition de cas :Ouvrir le Navigateur--------")
self.driver = webdriver.Chrome()
self.driver.get(com_d.baidu_url)
self.driver.maximize_window()
def tearDown(self):
self.driver.quit()
log.info("------- Utiliser le post - travail de cas :Fermer le navigateur--------")
@pytest.mark.smoke
def test_login_success(self):
# Cas d'utilisation: Fonction de connexion de la page de connexion
# Étapes
LoginPage(self.driver).login(lo_d.success_data['user'], lo_d.success_data['pwd'])
# Assertion.....
Cinq、Résultats des opérations:
Testing started at 11:50 ...
D:\python\python.exe "D:JetBrains\PyCharm Community Edition 2019.1.3\helpers\pycharm\_jb_unittest_runner.py" --path D:/learn/test/testcases/test_baidu_login.py
Launching unittests with arguments python -m unittest D:/learn/test/testcases/test_baidu_login.py in D:\learn\test\testcases
Process finished with exit code 0
2021-03-14 11:50:47,238-【test_baidu_login.py-->line:27】-INFO:------- Utiliser le travail de préposition de cas :Ouvrir le Navigateur--------
2021-03-14 11:50:51,327-【basepage.py-->line:38】-INFO:Attendez.:Baidu-Connexion - Élément('xpath', '//div[@id="u1"]//a[@name="tj_login"]') Succès visible ,Ça prend du temps0:00:00.056843Secondes
2021-03-14 11:50:51,339-【basepage.py-->line:77】-INFO:Trouver:Baidu-Connexion - Élément('xpath', '//div[@id="u1"]//a[@name="tj_login"]')Succès
2021-03-14 11:50:51,414-【basepage.py-->line:86】-INFO:Cliquez sur:Baidu-Connexion - Élément('xpath', '//div[@id="u1"]//a[@name="tj_login"]')Succès
2021-03-14 11:50:53,463-【basepage.py-->line:38】-INFO:Attendez.:Baidu login-Connexion par nom d'utilisateur - Élément('id', 'TANGRAM__PSP_11__footerULoginBtn') Succès visible ,Ça prend du temps0:00:02.048293Secondes
2021-03-14 11:50:53,474-【basepage.py-->line:77】-INFO:Trouver:Baidu login-Connexion par nom d'utilisateur - Élément('id', 'TANGRAM__PSP_11__footerULoginBtn')Succès
2021-03-14 11:50:53,535-【basepage.py-->line:86】-INFO:Cliquez sur:Baidu login-Connexion par nom d'utilisateur - Élément('id', 'TANGRAM__PSP_11__footerULoginBtn')Succès
2021-03-14 11:50:53,576-【basepage.py-->line:38】-INFO:Attendez.:Connexion par nom d'utilisateur-Téléphone portable/Boîte aux lettres/Nom d'utilisateur - Élément('id', 'TANGRAM__PSP_11__userName') Succès visible ,Ça prend du temps0:00:00.040890Secondes
2021-03-14 11:50:53,584-【basepage.py-->line:77】-INFO:Trouver:Connexion par nom d'utilisateur-Téléphone portable/Boîte aux lettres/Nom d'utilisateur - Élément('id', 'TANGRAM__PSP_11__userName')Succès
2021-03-14 11:50:53,714-【basepage.py-->line:98】-INFO:Entrée: Connectez - vous au nom d'utilisateur -Téléphone portable/Boîte aux lettres/Nom d'utilisateur - Élément('id', 'TANGRAM__PSP_11__userName')Saisissez la valeur du texte(15692004245)Succès
2021-03-14 11:50:53,759-【basepage.py-->line:38】-INFO:Attendez.:Connexion par nom d'utilisateur-Mot de passe - Élément('id', 'TANGRAM__PSP_11__password') Succès visible ,Ça prend du temps0:00:00.043882Secondes
2021-03-14 11:50:53,771-【basepage.py-->line:77】-INFO:Trouver:Connexion par nom d'utilisateur-Mot de passe - Élément('id', 'TANGRAM__PSP_11__password')Succès
2021-03-14 11:50:53,925-【basepage.py-->line:98】-INFO:Entrée: Connectez - vous au nom d'utilisateur -Mot de passe - Élément('id', 'TANGRAM__PSP_11__password')Saisissez la valeur du texte(phang0209)Succès
2021-03-14 11:50:53,958-【basepage.py-->line:38】-INFO:Attendez.:Connexion par nom d'utilisateur-Connexion - Élément('id', 'TANGRAM__PSP_11__submit') Succès visible ,Ça prend du temps0:00:00.031914Secondes
2021-03-14 11:50:53,969-【basepage.py-->line:77】-INFO:Trouver:Connexion par nom d'utilisateur-Connexion - Élément('id', 'TANGRAM__PSP_11__submit')Succès
2021-03-14 11:50:54,051-【basepage.py-->line:86】-INFO:Cliquez sur:Connexion par nom d'utilisateur-Connexion - Élément('id', 'TANGRAM__PSP_11__submit')Succès
2021-03-14 11:50:56,426-【test_baidu_login.py-->line:35】-INFO:------- Utiliser le post - travail de cas :Fermer le navigateur--------
Ran 1 test in 9.191s
OK
D'après le journal de sortie , Chaque étape est clairement visible , Les problèmes peuvent également être localisés rapidement , Tout cela peut être optimisé en fonction des besoins réels .
边栏推荐
- Future of NTF and trends in 2022
- 访问阿里云存储的图片URL实现在网页直接预览略缩图而不直接下载
- The method to measure the similarity of two vectors: cosine similarity, pytorch calculate cosine similarity: torch nn. CosineSimilarity(dim=1, eps=1e-08)
- 318. 最大单词长度乘积
- Appium fundamentals of automated testing - basic principles of appium
- 【伸手党福利】JSONObject转String保留空字段
- Download and installation configuration of cygwin
- [EI search] important information conference of the 6th International Conference on materials engineering and advanced manufacturing technology (meamt 2022) in 2022 website: www.meamt Org meeting time
- 【TA-霜狼_may-《百人计划》】1.3纹理的秘密
- Leetcode:剑指 Offer 59 - I. 滑动窗口的最大值
猜你喜欢
![Online public network security case nanny level tutorial [reaching out for Party welfare]](/img/66/d9c848a7888e547b7cb28d84aabc24.png)
Online public network security case nanny level tutorial [reaching out for Party welfare]

25.K个一组翻转链表

The difference between MFC for static libraries and MFC for shared libraries

Promql select time series

Error: plug ins declaring extensions or extension points must set the singleton directive to true

【TA-霜狼_may-《百人计划》】2.1 色彩空间

快速筛选打卡时间日期等数据:EXCEL筛选查找某一时间点是否在某一时间段内

访问阿里云存储的图片URL实现在网页直接预览略缩图而不直接下载

Asgnet paper and code interpretation 2

206.反转链表
随机推荐
205. 同构字符串
整合阿里云短信的问题:无法从静态上下文中引用非静态方法
25.K个一组翻转链表
166. 分数到小数
Grid system in bootstrap
torch. histc
Leetcode: offer 59 - I. maximum value of sliding window
392. 判断子序列
Leetcode:829. 连续整数求和
72. 编辑距离
[TA frost wolf \u may- hundred people plan] 2.3 introduction to common functions
The programmer's girlfriend gave me a fatigue driving test
6. zigzag transformation
208. 实现 Trie (前缀树)
【EI检索】2022年第六届材料工程与先进制造技术国际会议(MEAMT 2022)重要信息会议网址:www.meamt.org会议时间:2022年9月23-25日召开地点:中国南京截稿时间:2
SEM of C language_ Tvariable type
Visit the image URL stored by Alibaba cloud to preview the thumbnail directly on the web page instead of downloading it directly
30. 串联所有单词的子串
318. 最大单词长度乘积
[party benefits] jsonobject to string, leave blank