我正在使用的基础架构最初以Site Prism documentation建议的方式处理网址:通过设置Capybara.app_host
来处理域名,并且页面本身称为set_url
,具有相对路径
事实证明,生产网站上的某些网页有一个子域名,例如members.mycompany.com
而不是www.mycompany.com
。测试还需要能够在完全具有不同域的测试环境中运行,并且在测试环境中根本没有子域,即使对于那些在生产站点中具有子域的页面也是如此。因此,不能将完整的URL放入每个SitePrism::Page
。
我认为最好的选择是完全停止使用Capybara.app_host
,并创建一个使用环境状态(即:test
或:production
)的URL构建器,页面的路径,以及指示页面是否是生产子域的一部分的标志。类似的东西:
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
我曾希望我可以在每个get_url
个对象中使用SitePrism::Page
来生成完整的网址,而不需要Capybara.app_host
,如下所示:
class LoginPage < SitePrism::Page
set_url get_url("/login")
...
end
class MemberPage < SitePrism::Page
set_url get_url("/mypage", true)
...
end
如果环境为: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_url
方法中的代码完成了我认为它应该做的事情,并且我也相信我创建的Environment对象的状态设置为页面'{{1之前的适当环境在测试中调用的方法。遗憾的是,当我尝试加载#load
个对象时,SitePrism::Page
获取的环境值始终是Environment对象的默认值(get_url
)。因此,即使我正在尝试执行生产,它最终也会加载测试环境URL。
感觉就像在:test
对象被实例化之前评估每个set_url
对象的SitePrism::Page
部分,我似乎无法找到一种方法来初始化环境发生在它之前。我是Ruby的新手,所以我希望我只是误解了这些东西正在加载的顺序或层次结构,并且不难纠正。任何人都可以确定我的尝试有什么问题,或者,如果有更好的方法来处理这种情况,请指出更好的方法是什么?
答案 0 :(得分:2)
是的,正在定义类的set_url
调用,换句话说,首次需要您的文件时。
简单的解决方案是确保在需要页面对象之前初始化Environment
配置。
请注意,SitePrism文档说只有在直接导航到页面时才需要set_url
:
请注意,设置网址是可选的 - 您只需要设置网址 您希望能够直接导航到该页面。这说得通 设置主页或登录页面的页面模型的URL,但是 可能不是搜索结果页面。
要验证您是否在页面上,可以使用正则表达式。有关在多种环境中运行的示例,请参阅https://github.com/natritmeyer/site_prism#verifying-that-a-particular-page-is-displayed。