如何在同一测试中使用Selenium和测试脚本来操作数据库

时间:2016-10-17 14:24:19

标签: ruby-on-rails selenium rspec

我们要运行的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会话

同步操作数据库

我们需要能够在同一会话期间通过控制台和Selenium直接更改数据库。这可能吗?

1 个答案:

答案 0 :(得分:0)

  

是否可以与Selenium会话同步操作数据库

当然,有几种方法。

但首先,请让我澄清一下 - Selenium根本不与您的数据库进行交互。它所做的就是自动化连接到数据库的Web应用程序。 Selenium并不关心背后的事物。

话虽如此,对于这些解决方案 - 不要尝试使用" Selenium"自动化您的数据库。

可能的解决方案#1

使用Python脚本手动连接到数据库。也许有一个名为db的全局变量可以与之交互。在Selenium测试中,只需调用类似db.put("something", "something")

的内容即可

可能的解决方案#2

正如@max在评论部分中所述,您也可以直接调用端点。 但请记住 ... Selenium不会这样做。您可以使用标准的python HTTP调用,也可以使用http请求库。