"browser" 的页面对象模型的 Capybara 实例?

Capybara instance of "browser" for Page Object Model?

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

我的基础 "Page Object" 本质上是初始化驱动程序,并在每个其他页面对象子对象中使用 class(对于单个页面)

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 示例中,我看到方法 returning 该页面对象的一个​​实例,但通常它们使用一些 @browser 传递的实例变量。在我的测试脚本中,我简单地通过 let(:p) {PageObject.new} 调用基页对象 class 的实例,然后 p.visit_url 然后通过 new 创建其他页面对象的新实例... .但这似乎是错误的做法。

我如何 return 我可以传递 @browser 或驱动程序的实例?我应该如何在规范中称呼它?

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

当您将 Capybara::DSL 包含到 class 中时,您包含的方法最终会调用 Capybara.current_session 上的方法。即 visit => Capybara.current_session.visitCapybara.current_session 的结果是您要询问的“@browser”实例,因为它封装了 driver/browser 实例。您当前实施方式的问题在于,如果任何代码更改了当前会话,那么您的所有对象都会突然引用新会话。相反,如果您存储对希望对象在每个对象中使用的会话的引用,并在该会话上调用水豚方法而不是使用 Capybara::DSL (@session.visit ...),那么您可以确定会话是一个对象正在使用不会意外改变。

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