"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.visit
。 Capybara.current_session
的结果是您要询问的“@browser”实例,因为它封装了 driver/browser 实例。您当前实施方式的问题在于,如果任何代码更改了当前会话,那么您的所有对象都会突然引用新会话。相反,如果您存储对希望对象在每个对象中使用的会话的引用,并在该会话上调用水豚方法而不是使用 Capybara::DSL (@session.visit ...
),那么您可以确定会话是一个对象正在使用不会意外改变。
另请注意,Capybara.default_max_wait_time
、`Capybara.current_driver' 等是全局设置,因此将它们设置在您的 PageObject class 中并不是一个好主意。
我正在使用 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.visit
。 Capybara.current_session
的结果是您要询问的“@browser”实例,因为它封装了 driver/browser 实例。您当前实施方式的问题在于,如果任何代码更改了当前会话,那么您的所有对象都会突然引用新会话。相反,如果您存储对希望对象在每个对象中使用的会话的引用,并在该会话上调用水豚方法而不是使用 Capybara::DSL (@session.visit ...
),那么您可以确定会话是一个对象正在使用不会意外改变。
另请注意,Capybara.default_max_wait_time
、`Capybara.current_driver' 等是全局设置,因此将它们设置在您的 PageObject class 中并不是一个好主意。