我们要运行的RSpec测试使用运行js: true
的硒。即,当你进行测试时,它会在你面前启动firefox并进行测试。
我们的测试是监控单页角度应用程序,需要组织浏览应用程序,然后直接操作数据库以查看前端如何响应它。
context "in my single page Angular application" do
context "given I go to a user's profile page" do
it "should contain the user's profile photo" do
visit profile_page_url
expect(page).to have_text(profile_photo_url)
end
context "and then I go to the homepage, remotely destroy the photo and return to the profile page" do
before :each do
visit homepage_url
profile_photo.destroy
visit profile_page_url
end
it "expects the profile photo to be gone" do
expect(page).not_to have_text(profile_photo_url)
end
end
end
end
在上面的示例中,您可以看到我们转到用户的个人资料页面,检查他们的照片是否在那里然后转到主页。当我们在主页上时,我们会破坏用户的个人资料照片(直接使用脚本而不是界面),然后返回到原始页面以查看它是否已消失。或者至少这是我们理论上的做法。
在实践中,一旦我们删除了照片,一切都会挂起。 Reading up on this似乎这可能是由于控制台和selenium在不同进程(线程?)中并行运行两个不同的DB事务。控制台正在等待Selenium完成它才能执行其数据库查询。
表面上看起来我们似乎陷入困境。有趣的是,看起来我们不能在Selenium运行的同时进行直接数据库管理,因为一个事务正在等待另一个事务完成。
如果我们在其中放入binding.pry
调试器语句,则可以执行此操作。但它在测试套件中不起作用。
我们需要能够在同一会话期间通过控制台和Selenium直接更改数据库。这可能吗?
答案 0 :(得分:0)
是否可以与Selenium会话同步操作数据库
当然,有几种方法。
但首先,请让我澄清一下 - Selenium根本不与您的数据库进行交互。它所做的就是自动化连接到数据库的Web应用程序。 Selenium并不关心背后的事物。
话虽如此,对于这些解决方案 - 不要尝试使用" Selenium"自动化您的数据库。
使用Python脚本手动连接到数据库。也许有一个名为db
的全局变量可以与之交互。在Selenium测试中,只需调用类似db.put("something", "something")
正如@max在评论部分中所述,您也可以直接调用端点。 但请记住 ... Selenium不会这样做。您可以使用标准的python HTTP调用,也可以使用http请求库。