对不起有争议的头衔!
我使用Selenium和基于Selenium的库(如Capybara)完成了一些基于浏览器的测试(JS重型网页)。让测试套件始终如一地工作一直是一个巨大的痛苦。是的,我知道不是在这里和那里插入sleep()
的调用,而是应该等待DOM元素变得可见,或者满足其他条件,yadda yadda。这一切都很好,而且确实有所帮助。我认为我做得不对,如果不是......
如果不是时候,在我自己编写Selenium代码之前,当我咨询的公司聘请了一家专门编写Selenium测试套件的公司。他们派了一个据说是Selenium专家的人,他为我们的网络应用程序编写了一个完整的测试套件。我需要告诉你我们实际使用测试套件时发生了什么?
我已经得出结论,像Selenium这样的工具使用的整个方法受到了很大的竞争条件。您有一个测试过程,以及一个通过套接字进行通信的独立浏览器进程。测试过程向浏览器发送查询以查找DOM的状态,并在浏览器继续运行时 ,计算要执行的操作。然后它会向浏览器发送单独的消息,以模拟点击或按键等。
如果您曾经编写过多线程程序,那么就知道它不起作用。这是一场“检查然后行动”的比赛。如果测试过程可以在浏览器中冻结 JS执行,查询其状态,发出模拟点击/击键,然后解冻浏览器,那么就可以了。 (比如使用锁来保护多线程程序的关键部分。)
我能想到绕过竞争条件的唯一方法是用JS编写每个测试用例。当然,这排除了跨多个页面导航的测试用例。您还需要一种在每个测试用例开始时将页面重置为“干净”状态的方法。
有没有人知道用于测试浏览器内JS“应用程序”的工具/方法,它允许像我这样的凡人编写测试套件,这些测试套件一致地运行100%,没有撕掉我所有的头发?< / p>
(PS。从Selenium的经验中获得的另一个结论:很多免费的jQuery插件都有人在使用页面时不会出现的错误,只是因为他们无法像Selenium那样快速点击!)
答案 0 :(得分:6)
你见过casperjs,它可以在phantomjs(无头webkit浏览器)或slimerjs(无头壁虎浏览器)之上运行吗?
unit testing语法干净且友好,它使用名为evaluate()的方法按顺序在浏览器的上下文中执行测试。
答案 1 :(得分:6)
自您回答此问题以来,新服务已浮出水面Ghost Inspector。无需编码的基于浏览器的UI测试。您可以选择在应用程序编辑器中执行手动步骤,也可以使用Ghost Inspector Chrome扩展程序记录您与正在测试的Web应用程序的交互。
Ghost Inspector还会在每次测试运行时录制视频,以便您可以准确查看测试代理浏览器看到的内容。有关于每个测试运行的详细日志,包括它在其路径上单击/访问的每个URL的列表。您可以使用触发器URL触发Ghost Inspector测试,以便将其集成到持续部署过程中。
答案 2 :(得分:2)
我将尝试解决您对自动驾驶工具和浏览器本身是两个独立过程的关注,因此自动化脚本受到您提到的竞争条件的影响。
这正是我倾向于在进程中编写Web应用程序自动化脚本的原因,因此它们在与浏览器本身相同的核心UI事件循环上运行。
这是一个很好的工具:Microsoft WebBrowser Control。您需要具备一些C#技能来创建自动化脚本。另一方面,使用async/await
等语言功能,编码WebBrowser
自动化是轻而易举的,因为它自然是异步的(没有那些讨厌的Thread.Sleep
和轮询循环)。最重要的是,您可以执行所有常用的自动化任务,例如:
答案 3 :(得分:1)
它被称为“Selenium”。它起作用,但还不够好,主要是因为它完全是用JavaScript构建的。 Selenium项目继续进行,采用了另一个名为“WebDriver”的系统(又名 Selenium 2.0),与浏览器的集成更加紧密,现在浏览器作者正在将驱动程序构建到浏览器中或者紧密耦合附加组件(例如 OperaDriver,ChromeDriver)。