ruby - 页面对象模型的“浏览器”的水豚实例?
问题描述
我正在使用 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 驱动程序的实例?我应该如何在我的规范中调用它?
解决方案
您不想在基本 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 类中并不是一个好主意。
推荐阅读
- java - Spring JPA延迟加载@OneToOne实体不起作用
- dexie - DexieJS 如何从一个表中获取所有内容?
- python - 如何向 Matplotlib PolyCollection 添加图例?
- html - 如何使用 MVC 制作登录界面并使用 JWT 身份验证对其进行保护?
- javascript - 表单中的 Primeng 下拉菜单
- c++ - 我可以cout但不返回为什么?请提出更改建议
- sql - ON CONFLICT upsert 的两个冲突目标
- c++ - 有没有办法优化 c++ 字符串 += 运算符?
- regex - 如何设置正则表达式重复的上限
- linq - 当名称相同且 Id 与 linq 查询不同时如何获取第一个对象