【问题标题】:How can you manipulate the DB using Selenium and the Test Script during the same test如何在同一测试中使用 Selenium 和测试脚本来操作数据库
【发布时间】:2016-10-17 14:24:18
【问题描述】:

我们有一个 RSpec 测试要运行,它使用 selenium 运行 js: true。也就是说,当您运行测试时,它会在您面前启动 firefox 并通过测试本身。

我们的测试是监管一个单页的 Angular 应用程序,需要在应用程序周围进行导航,然后直接操作数据库以查看前端如何响应它。

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 完成,然后才能执行其数据库查询。

从表面上看,我们似乎陷入了困境。有趣的是,看起来我们不能在 Selenium 运行的同时进行直接的数据库操作,因为一个事务正在等待另一个事务完成。

如果我们将binding.pry 调试器语句放入其中,则可以做到这一点。但它在测试套件中不起作用。

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

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

【问题讨论】:

  • 您是正确的,因为您的测试和 selenium 正在浏览的 Rails 服务器在不同的进程中运行。通常在使用工厂时,使用database_cleaner 在规范之间擦除数据库是一个非常好的主意 - 因为残留状态会导致误报和抖动测试。
  • 即使该规范毫无用处-您只是在测试您的测试是否有效...而是通过前端销毁记录。
  • 这不是没用的@max,它正在测试假设照片是通过另一种方式(例如移动应用程序)销毁的,该应用程序是否正确地将其从界面中删除。由于它是一个 SPA,风险在于它仍然会显示照片,即使它不再存在于后端。我们不想清理数据库,我们只需要操纵它来模仿它
  • 如果您有一个可以删除个人资料图片的 API 路由,您也许可以获得Capybara driver to send a DELETE request。但是它是特定于驱动程序的,我不知道 selenium-webdriver 是否可行。这样可以避免挂起的数据库问题。

标签: ruby-on-rails selenium rspec


【解决方案1】:

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

当然,有几种方法。

但首先,请让我澄清一下 - Selenium 根本不与您的数据库交互。它所做的只是自动化连接到数据库的 Web 应用程序。 Selenium 不在乎后面是什么。

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

可能的解决方案#1

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

可能的解决方案#2

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2021-06-26
    • 1970-01-01
    • 2011-07-10
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    相关资源
    最近更新 更多