当前位置:网站首页>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 .
边栏推荐
- Quickly filter data such as clock in time and date: Excel filter to find whether a certain time point is within a certain time period
- 72. edit distance
- 静态库使用MFC和共享库使用MFC的区别
- [TA frost wolf \u may- hundred people plan] 1.2.1 vector basis
- Appium自动化测试基础--补充:C/S架构和B/S架构说明
- Promql select time series
- 10. regular expression matching
- Appium fundamentals of automated testing - basic principles of appium
- Use of comment keyword in database
- 【TA-霜狼_may-《百人计划》】1.2.3 MVP矩阵运算
猜你喜欢

MFC window scroll bar usage
![[TA frost wolf \u may- hundred talents plan] 1.2.3 MVP matrix operation](/img/4e/8cf60bc816441967c04f97c64685a1.png)
[TA frost wolf \u may- hundred talents plan] 1.2.3 MVP matrix operation
![[TA frost wolf \u may- hundred people plan] 1.2.1 vector basis](/img/94/99090ea91082a385968e071ef3766c.png)
[TA frost wolf \u may- hundred people plan] 1.2.1 vector basis
![[ta- frost wolf \u may- hundred people plan] 1.1 rendering pipeline](/img/af/4498382bc47d8c9ae41c407b9d1265.png)
[ta- frost wolf \u may- hundred people plan] 1.1 rendering pipeline

Future of NTF and trends in 2022

[TA frost wolf _may - "hundred people plan"] 1.4 introduction to PC mobile phone graphics API

使用selenium自动化测试工具爬取高考相关院校专业招生分数线及排名情况

Test function in pychram

The preorder traversal of leetcode 144 binary tree and the expansion of leetcode 114 binary tree into a linked list

Pytorch training deep learning network settings CUDA specified GPU visible
随机推荐
【TA-霜狼_may-《百人计划》】2.3 常用函数介绍
pytorch nn. AdaptiveAvgPool2d(1)
[ta- frost wolf \u may- hundred people plan] 2.2 model and material space
The difference between MFC for static libraries and MFC for shared libraries
盘点华为云GaussDB(for Redis)六大秒级能力
【TA-霜狼_may-《百人计划》】2.4 传统经验光照模型
Addition without addition, subtraction, multiplication and division
[shortcut key]
392. judgment subsequence
Why can't you find the corresponding function by clicking go to definiton (super easy has a diagram)
What does ft mean in the data book table
JMeter login failure, extracting login token, and obtaining token problem solving
[TA frost wolf \u may- hundred people plan] 1.3 secret of texture
jeecgboot输出日志,@Slf4j的使用方法
Test function in pychram
171. Excel 表列序号
【TA-霜狼_may-《百人计划》】1.2.1 向量基础
Sort linked list (merge sort)
208. 实现 Trie (前缀树)
谷粒学院微信扫码登录过程记录以及bug解决