Selenium Python教程第6章:使用页面对象

这篇具有很好参考价值的文章主要介绍了Selenium Python教程第6章:使用页面对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Selenium Python教程第6章:使用页面对象

6. Page Objects 页面对象

6.1 什么是页面对象模型(POM)?

页面对象模型(Page Objects Model, POM )是一组旨在表示一个或多个网页的类, 用1个类来保存1个网页上所有的元素,相似的网页可以重用此类。
1个网站通常有多个页面,可以用多个页面类对象分别代表各个页面,其好处有:

  • web应用测试程序或者爬虫程序的结构更加清晰易懂。
  • 对于结构相似的多个网页,可减少重复的代码量
  • 如果web页面元素发生变化,只需要修改一处

6.2 使用页面对象的项目结构

使用页面对象的项目的通常结构类似于

 |-- pages
    |--- locators.py
    |--- elements.py
    |--- pages.py
|-- tests
    |--- test_contact_page.py

各文件说明:

  • pages.py 定义页面元素,以及针对各元素的操作方法
  • locators.py 分离定位字符。通常做法,同一页面的定位器属于同一个类
  • elements.py 通常定义1个页面元素的基类,提供set(), get()方法
  • test_*.py 测试用例类test case class文件

6.2 源码文件及说明

6.2.1 测试用例类源码

本例 test_contact_page.py 用于在colibri-software.com网站填写 Contact Me表单,判断是否填写结果是否成功

import unittest
from selenium import webdriver
import pages

class TestColibriSoftwareContactMe(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.get("https://www.colibri-software.com")

    def test_submit_contact_me_form(self):
        """
         "Contact me" 测试表单
        填写各字段,提交表单,验证提交是否成功
        """

        # 加载主页,本例为 colibri-software.com主页
        contact_page = pages.ContactPage(self.driver)

        # Checks if the word "Contact" is in title
        assert contact_page.is_title_matches()

        # 向表单各字段填写内容
        contact_page.name_input = 'John Doe'
        contact_page.company_name_input = 'John Doe\'s paper company'
        contact_page.email_input = 'jdoe@gmail.com'
        contact_page.additional_info_input = 'I need a website to sell paper online'

        # 提前表单
        contact_page.click_submit_form_button()

        # 验结果是否成功
        assert contact_page.success_message_is_displayed()

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

6.2.2 页面对象类源码

pages.py 介绍如何编写页面对象类

from elements import BasePageElement
from locators import ContactPageLocators

class NameElement(BasePageElement):
    """
    This class gets the search text from the specified locator
    """

    # The locator for text box where name is entered
    locator = 'wpforms-236-field_0'

# Similar classes for other text fields    
class CompanyNameElement(BasePageElement):

    locator = 'wpforms-236-field_4'

class EmailElement(BasePageElement):

    locator = 'wpforms-236-field_1'

class AdditionalInfoElement(BasePageElement):

    locator = 'wpforms-236-field_0'

class BasePage(object):
    """
    Base class to initialize the base page that will be called from all pages
    """

    def __init__(self, driver):
        self.driver = driver

class ContactPage(BasePage):
    """
    Contact page action methods come here
    """

    # Declares text input fields
    name_input = NameElement()
    company_name_input = CompanyNameElement()
    email_input = EmailElement()
    additional_info_input = AdditionalInfoElement()

    def is_title_matches(self):
        """
        Verifies that the text "Contact" appears in page title
        """
        return 'Contact' in self.driver.title

    def click_submit_form_button(self):
        """
        Submits the form
        """
        element = self.driver.find_element(*ContactPageLocators.SUBMIT_FORM_BUTTON)
        element.click()

    def success_message_is_displayed(self):
        success_message = 'Thanks for contacting us! We will be in touch with you shortly.'
        return success_message in self.driver.page_source

6.2.3 页面元素基类源码

elements.py 定义1个页面元素的基类,提供set(), get()方法

from selenium.webdriver.support.ui import WebDriverWait

class BasePageElement(object):
    """
    Base page class that is initialized on every page object class.
    """

    def __set__(self, obj, value):
        """
        Sets the text to the value supplied
        """
        driver = obj.driver
        WebDriverWait(driver, 100).until(lambda driver: driver.find_element_by_id(self.locator))
        driver.find_element_by_id(self.locator).clear()
        driver.find_element_by_id(self.locator).send_keys(value)

    def __get__(self, obj, owner):
        """
        Gets the text of the specified object
        """
        driver = obj.driver
        WebDriverWait(driver, 100).until(lambda driver: driver.find_element_by_id(self.locator))
        element = driver.find_element_by_id(self.locator)
        return element.get_attribute("value")

6.2.4 locators 定位器类
一个好的编程习惯做法是,分离定位字符。在这个例子中,同一页面的定位器属于同一个类。文章来源地址https://www.toymoban.com/news/detail-497928.html

from selenium.webdriver.common.by import By

class ContactPageLocators(object):
    """
    A class for all Contact page locators.
    """
    SUBMIT_FORM_BUTTON = (By.CSS_SELECTOR, 'button[type="submit"]')

class SearchResultsPageLocators(object):
    """A class for search results locators. All search results locators should come here"""
    pass

到了这里,关于Selenium Python教程第6章:使用页面对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 新版Selenium使用Python对web页面多个相同Class Name属性的元素进行选择&新老版本对比

    在使用新版的Selenium对网页代码中存在相同class name属性的元素进行定位,在定位的过程中发现使用先前的定位方法已经无法成功对所要操作组件进行定位,这是什么问题呢?下面为大家进行解答。 大概为了统一编写格式,方便阅读理解,新版本的Selenium出来后,摒弃了旧版的

    2024年02月04日
    浏览(39)
  • python爬虫框架selenium安装和使用教程

    – Selenium是一个常用的Python爬虫框架,可以模拟浏览器行为,实现一些自动化的操作。本教程将介绍Selenium的基础知识、使用方法,包括导入包、安装、示例、数据保存等方面。 在开始之前,我们需要先导入Selenium相关的包。这里我们用Python3作为演示,所以需要安装对应版本

    2024年02月02日
    浏览(26)
  • python使用selenium操作浏览器的教程

    重复的操作令手工测试苦不堪言,于是自动化测试出现了!作为web应用里最出名的自动化测试工具,selenium让web应用的测试轻松了很多。今天我们就来简单的介绍一下一些简单的selenium浏览器操作。接下来我们就来看看python怎么操作浏览器的吧! 我们使用selenium进行自动化测试

    2024年02月05日
    浏览(41)
  • django中批量添加对象SupplierNature.objects.bulk_create(SupplierNature对象)

    注明:创建的是对象

    2024年02月16日
    浏览(72)
  • python selenium 自动化登录页面

    2024年02月10日
    浏览(39)
  • 在PostgreSQL中如何处理大对象(Large Objects),例如存储和检索二进制文件?

    PostgreSQL 提供了对大对象(Large Objects)的支持,这是一种特殊的数据类型,用于存储大量数据,通常用于存储二进制文件或大型文本数据。大对象存储在数据库外部,但在数据库内部进行管理,从而允许您像处理普通数据库对象一样处理它们。 以下是在 PostgreSQL 中处理大对象

    2024年04月27日
    浏览(40)
  • Python下利用Selenium获取动态页面数据

    利用python爬取网站数据非常便捷,效率非常高,但是常用的一般都是使用BeautifSoup、requests搭配组合抓取静态页面(即网页上显示的数据都可以在html源码中找到,而不是网站通过js或者ajax异步加载的),这种类型的网站数据爬取起来较简单。但是有些网站上的数据是通过执行

    2024年02月06日
    浏览(60)
  • python selenium playwright库使用教程 破解网页防止开发者模式 截取数据请求 隐藏chrome

    下载 chromedriver的版本一定要与Chrome的版本一致,不然就不起作用。 有两个下载地址: 1、 http://chromedriver.storage.googleapis.com/index.html 2、 CNPM Binaries Mirror 当然,你首先需要查看你的Chrome版本,在浏览器中输入chrome://version/  放chromedriver在chrome安装目录  默认目录一般为:C:Pro

    2023年04月25日
    浏览(32)
  • Python Selenium.WebDriver 最强详解页面加载策略

    在通过Selenium加载一个网页时,Selenium都会等待页面加载完了才会运行下面的代码,这是因为 webdriver.get 方法会阻塞直到网页全部加载完成。 通常如果当页面加载花费大量时间时,可能是加载了很多外部资源「如:图像、css」,又或则是浏览的是国外网站,使用的网络环境差

    2023年04月22日
    浏览(32)
  • 【Python】Python 模块用法:selenium 4 版本页面元素定位方法汇总

    目录 一、定位页面元素方法源码说明  (1)Webdriver.common (2)selenium.webdriver.common.by (3)By 二、定位页面元素方法用法汇总 (1)2.0 及以下低版本 selenium :By 定位页面元素方法用法(可忽略) (2)3.0 ~ 3.9 版本 selenium:By 定位页面元素方法用法 (3)4.0 ~ 4.9 版本 selenium:

    2023年04月13日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包