首页 > 解决方案 > 页面对象模型的“浏览器”的水豚实例?

问题描述

我正在使用 Capybara 和 Web 应用程序的页面对象模型编写框架。这是我第一次编写自己的框架并使用 PoM 进行自动化。

我的基本“页面对象”基本上初始化了驱动程序,并在所有其他页面对象子类中使用(对于单个页面)

class PageObject
    include Capybara::DSL
    BASE_URL = 'https://www.atesturl.com'
    Capybara.default_max_wait_time = 5

    def initialize

        Capybara.register_driver :selenium_chrome do |app|
            Capybara::Selenium::Driver.load_selenium
            browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
              # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
              opts.args << '--disable-site-isolation-trials'
            end
            Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
          end

        Capybara.register_driver :selenium_chrome_headless do |app|
            Capybara::Selenium::Driver.load_selenium
            browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
              opts.args << '--headless'
              opts.args << 'window-size=2880,1800'
              opts.args << '--disable-gpu' if Gem.win_platform?
              #opts.args << '--remote-debugging-port=9222'
              # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
              opts.args << '--disable-site-isolation-trials'
            end
            Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
          end

        Capybara.current_driver = :selenium_chrome
    end

    def visit_url
        visit BASE_URL
    end

  end

在大多数 PoM 示例中,我看到方法返回该页面对象的实例,但通常它们使用一些@browser传递的实例变量。在我的测试脚本中,我简单地通过调用基本页面对象类的实例,let(:p) {PageObject.new}然后p.visit_url通过new...创建其他页面对象的新实例,但这似乎是错误的做法。

我究竟如何返回@browser可以传递的 or 驱动程序的实例?我应该如何在我的规范中调用它?

标签: rubycapybarapageobjects

解决方案


您不想在基本 PageObject 的初始化中注册驱动程序,因为这意味着创建的每个对象都将注册新的驱动程序配置 - 这是不可取的。

当您将 Capybara::DSL 包含到您的类中时,您将包含最终调用方法的方法Capybara.current_session。即visit=> Capybara.current_session.visit。结果Capybara.current_session是您询问的“@browser”实例,因为它封装了驱动程序/浏览器实例。您当前实现的方式的问题是,如果任何代码更改了当前会话,那么您的所有对象都会突然引用新会话。相反,如果您存储对您希望对象在每个对象中使用的会话的引用,并在该会话上调用 Capybara 方法而不是使用 Capybara::DSL ( @session.visit ...),那么您可以确保对象正在使用的会话不会改变不料。

另请注意,像Capybara.default_max_wait_time`Capybara.current_driver' 等都是全局设置,因此将它们设置在 PageObject 类中并不是一个好主意。


推荐阅读