【问题标题】:Browser-based testing tool which is not broken?基于浏览器的测试工具哪个不坏?
【发布时间】:2014-01-30 18:54:26
【问题描述】:

抱歉这里有争议的标题!

我已经使用 Selenium 和 Capybara 等基于 Selenium 的库进行了相当多的基于浏览器的测试(针对大量 JS 的网页)。让测试套件始终如一地工作一直是一件令人头疼的事情。是的,我知道不是在这里和那里插入对sleep() 的调用,而是应该等待DOM 元素变得可见,或者满足其他条件,yadda yadda。这一切都很好,它确实有点帮助。我会认为我做得不太对,如果不是为了......

如果不是当时,在我自己编写 Selenium 代码之前,我所咨询的公司聘请了一家专门编写 Selenium 测试套件的公司。他们派了一个据说是 Selenium 专家的人,他为我们的 Web 应用程序编写了一个完整的测试套件。需要我告诉你我们实际使用测试套件时发生了什么吗?

我得出的结论是,像 Selenium 这样的工具使用的整个方法都受到很大的竞争条件的影响。您有一个测试进程和一个单独的浏览器进程,它们通过套接字进行通信。测试过程向浏览器发送查询以找出 DOM 的状态,并且随着浏览器继续运行,计算要做什么。然后它向浏览器发送单独的消息,以模拟点击或击键等。

如果您曾经编写过多线程程序,您就会知道那是行不通的。这是一场“先检查后行动”的竞赛。如果测试过程可以冻结浏览器中的JS执行,查询其状态,模拟点击/击键,然后解冻浏览器,那么就OK了。 (就像使用锁来保护多线程程序的关键部分。)

我能想到绕过竞争条件的唯一方法是用 JS 编写每个测试用例。当然,这排除了跨越多个页面导航的测试用例。您还需要一种在每个测试用例开始时将页面重置为“干净”状态的方法。

有没有人知道用于测试浏览器内 JS“应用程序”的工具/方法,它允许像我这样的凡人编写测试套件,这些套件可以 100% 一致地运行,不会撕掉我所有的头发?

(PS。从使用 Selenium 的经验得出的另一个结论:很多免费的 jQuery 插件在人类使用页面时不会出现错误,仅仅是因为它们无法像 Selenium 那样快速点击!)

【问题讨论】:

    标签: javascript unit-testing testing selenium


    【解决方案1】:

    自从您回答这个问题后,一项新服务出现了,Ghost Inspector。基于浏览器的 UI 测试,无需编码。您可以选择在应用程序的编辑器中执行手动步骤,或者您可以使用 Ghost Inspector Chrome 扩展程序来记录您与正在测试的网络应用程序的交互。

    Ghost Inspector 还会对每次测试运行进行视频记录,以便您准确查看测试代理浏览器看到的内容。有关于每个测试运行的详细日志,包括它在其路径上单击/访问的每个 URL 的列表。您可以使用触发 URL 触发 Ghost Inspector 测试,因此您可以将其集成到您的持续部署过程中。

    【讨论】:

      【解决方案2】:

      我将尝试解决您对自动化驱动工具和浏览器本身是两个独立进程这一事实的担忧,因此自动化脚本受制于您提到的竞争条件。

      这正是我倾向于在进程中编写 Web 应用自动化脚本的原因,因此它们在与浏览器本身相同的核心 UI 事件循环上运行。

      有一个很棒的工具:Microsoft WebBrowser Control。您确实需要具备一些 C# 技能才能创建自动化脚本。另一方面,使用async/await 等语言功能,编码WebBrowser 自动化是轻而易举的事,因为它自然是异步的(没有那些讨厌的Thread.Sleep 和轮询循环)。最重要的是,您可以执行所有常见的自动化任务,例如:

      【讨论】:

      • 所以本质上,与其试图控制像 FF/Chrome/IE 这样的 Web 浏览器,不如编写自己的 Web 浏览器,它允许您在 JS 事件循环中插入测试代码。这是个好主意,我喜欢。听起来这是一个仅限 Windows 的东西,这很不幸。
      • @AlexD,本质上就是这样。实际上,仅限于 Windows。 OTOH,IE 仍然是主要参与者,这种方法给了我在这个平台下测试 web 应用程序的最佳亲密度。
      【解决方案3】:

      你见过casperjs,它可以在phantomjs(无头webkit浏览器)或slimerjs(无头gecko浏览器)之上运行吗?

      unit testing 语法简洁友好,它使用一种名为 evaluate() 的方法在浏览器上下文中按顺序执行您的测试。

      【讨论】:

      • 我最近才听说。你曾经使用 CasperJS 编写过测试套件吗?你的经历如何?它可以在运行每个测试用例之前重新加载页面吗?
      • 是的,我已经为通过各种网站的流程编写了超过 15 个测试套件。这是非常合乎逻辑的,本质上是要执行的步骤列表。至关重要的是,它会在开始执行测试之前等待页面加载和 DOM 准备就绪。它绝对可以在每次测试之前重新加载页面 - 如果您将其作为单元测试来处理,每个测试都会有一个 start() 方法,该方法会加载一个新页面。
      • 套件通常运行一致?他们不会一秒过去,下一秒就失败了?
      • 我看到了两种不一致的行为。他们可能是你的交易破坏者:1)在处理 iframe 时,有时在与 phantomjs 交谈时在 casperjs 中发生的回调不会触发,因此脚本会挂起。我通过中止请求并通过 casper.then(url); 手动发送来解决这个问题; 2) 在长时间运行的脚本中 - 例如访问每个导航链接并计时返回所需的时间 - 我看到 https://github.com/n1k0/casperjs/issues/318 上记录的“status=fail”出现,并且与之前成功的 URL 的时间相同。我还没有解决这个问题。
      • 好的,还有一个问题。 Selenium RC 还通过将 JS 注入浏览器来工作。由于 JS 脚本可以在网页中执行的操作受到限制,他们遇到了一些问题——例如,它不能填写 input[type=file] 字段。使用 CasperJS,您的测试用例是否在相同的限制下运行? (我知道 PhantomJS 本身是通过 JS 接口驱动的,所以我希望控制它的 JS 不应该有这些限制,尽管我希望从页面中的 <script> 标签加载的 JS 会受到限制。)
      【解决方案4】:

      它被称为“Selenium”。它工作得很好,但还不够好,主要是因为它完全是用 JavaScript 构建的。 Selenium 项目继续前进,采用了另一个名为“WebDriver”(aka Selenium 2.0)的系统,与浏览器更紧密地集成,现在浏览器作者正在将驱动程序构建到浏览器中或紧密耦合附加组件(例如 OperaDriver、ChromeDriver)。

      【讨论】:

      • 这如何回答这个问题?听起来您只是想澄清“硒”的含义,而没有解决问题的核心。
      • 我的意思是,OP 要求的是原始设计,而他要求的正是需要修复的设计缺陷。
      • Ross,您可能想尝试改写您的答案。您在评论中提出的观点完全被您的回答措辞所迷惑。
      • 如果 Selenium RC 有缺陷,那么 Selenium WebDriver 也有缺陷,只是方式不同。您是否知道不同的工具或使用这些工具的不同方式,它们不会受到我的问题中提到的问题的影响?
      猜你喜欢
      • 2019-02-23
      • 2020-03-31
      • 2015-05-27
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多