Capybara 如何设置可能有子域的SitePrism::页面的URL?
我正在使用的基础设施最初是按照建议的方式处理url的:域是通过设置Capybara 如何设置可能有子域的SitePrism::页面的URL?,capybara,site-prism,Capybara,Site Prism,我正在使用的基础设施最初是按照建议的方式处理url的:域是通过设置Capybara.app\u host来处理的,页面本身称为set\u url,具有相对路径 事实证明,生产站点上的某些页面有一个子域,比如members.mycompany.com,而不是www.mycompany.com。测试还需要能够完全在具有不同域的测试环境中运行,并且在测试环境中根本没有子域,即使对于那些在生产站点中有子域的页面也是如此。因此,将完整的URL放入每个站点prism::Page不是一个选项 我认为最好的选择
Capybara.app\u host
来处理的,页面本身称为set\u url
,具有相对路径
事实证明,生产站点上的某些页面有一个子域,比如members.mycompany.com
,而不是www.mycompany.com
。测试还需要能够完全在具有不同域的测试环境中运行,并且在测试环境中根本没有子域,即使对于那些在生产站点中有子域的页面也是如此。因此,将完整的URL放入每个站点prism::Page
不是一个选项
我认为最好的选择是完全停止使用Capybara.app_host
,并创建一个URL生成器,该生成器将使用环境状态(即:test
或:production
),页面的相对路径,以及一个指示页面是否属于生产子域的标志。比如:
def get_url(relative_path, subdomain_flag=false)
case Environment.get_environment
when :test
domain = "https://testmachine.localenvironment.com"
when :production
if subdomain_flag
domain = "https://members.mycompany.com"
else
domain = "https://www.mycompany.com"
end
end
return "#{domain}" + "#{relative_path}"
end
我曾希望我可以在我的每个SitePrism::Page
对象中使用get\u url
来生成完整的url,而不需要Capybara.app\u host
,如下所示:
class LoginPage < SitePrism::Page
set_url get_url("/login")
...
end
class MemberPage < SitePrism::Page
set_url get_url("/mypage", true)
...
end
class LoginPage
如果环境是:test
,我希望LoginPage
加载https://testmachine.localenvironment.com/login
和MemberPage
加载https://testmachine.localenvironment.com/mypage
。如果环境是:production
,我希望LoginPage
加载https://www.mycompany.com/login
和MemberPage
加载https://members.mycompany.com/mypage
我相信我的get\u url
方法中的代码做了我认为它应该做的事情,而且我还相信我创建的环境对象在测试中调用页面的\load
方法之前将其状态设置为正确的环境。遗憾的是,当我尝试加载我的SitePrism::Page
对象时,get\u url
获取的环境值始终是环境对象的默认值(即:test
)。结果,即使我试图针对生产环境执行,它也会加载测试环境URL
这感觉就像是在实例化
SitePrism::Page
对象之前,对每个SitePrism::Page
对象的set\u url
部分进行了评估,我似乎找不到一种方法在初始化之前对环境进行初始化。我是Ruby新手,所以我希望我只是误解了这些东西加载的顺序或层次结构,并且不难纠正。有人能指出我的尝试有什么问题吗?或者,如果有更好的方法来处理这种情况,请告诉我更好的方法是什么?是的,这些set\u url
调用是在定义类时进行评估的,换句话说,是在首次需要文件时进行评估的
简单的解决方案是确保在需要页面对象之前初始化环境
配置
请注意,SitePrism文档指出,只有在直接导航到页面时才需要set\u url
:
请注意,设置URL是可选的-您只需要在以下情况下设置URL
您希望能够直接导航到该页面。这是有道理的
为主页或登录页的页面模型设置URL,但
可能不是搜索结果页面
为了验证您是否在页面上,可以改用正则表达式。有关在多个环境中运行的示例,请参阅。谢谢。为了让事情更具动态性,我最后编写了一个小的
page\u启动器
对象,以便动态地将正确的域与相对URL组合在一起。现在工作得很好。