为什么我们使用WebDriver而不是Selenium IDE?

42
为什么我们不能在Selenium IDE中记录所有测试用例,将其导出到Java/WebDriver中,并在Eclipse中使用WebDriver运行它?
我需要一个清晰的解释,因为我在使用WebDriver时非常困惑!
还有谁能解释一下为什么IDE记录的脚本在WebDriver中失败?

3
该IDE没有关于AJAX或JS-heavy网站的概念。比如你的首页上有一个项目列表,但是它们不会一次性全部加载出来,而是当你向下滚动页面时逐个加载出来。使用该IDE,你可以逐个选择这些项目,非常好,然而,它并不知道实际上直到某个操作之前那个项目并不存在。该IDE只关心记录时物理元素的状态,对于网站的整体运行情况并不太关注。这是只有你自己知道的事情。 - Arran
8个回答

56
“为什么我们不能在IDE中记录所有测试用例,将其导出到Java/Webdriver中并在Webdriver中运行呢?”这是一个很好的问题,答案如下:Selenium IDE是一种录制和回放工具,非常容易使用,但它非常不可靠。在Web应用程序中,录制和回放通常是不被赞成的。由于Web应用程序经常发生变化,因此IDE不是生产环境的理想解决方案,因为可能会出现维护上的难题。让我给你举个实际的例子。你记录了你的测试,并找到了一个动态ID的元素。当测试在后面开始失败时,我们可以将其导入Eclipse中,但为什么不简单地使你的测试敏捷独立,以便首先捕获这些问题呢?这也归结于你对测试自动化的原则。在我的观点(以及其他几位专业人士)中,测试自动化应该从编程角度来考虑。程序员应该编写测试并维护测试。理想情况下,你的质量保证人员应该接受培训,以编写和维护他们自己的测试。所以,回到你的问题,IDE旨在成为自动化的快速解决方案,而不是完整回归套件的解决方案。
请问有人可以解释一下为什么Webdriver中记录的IDE脚本会失败吗?
我已经有一段时间没有使用IDE了,但它们失败的原因是,导出的脚本只是步骤,而不是完整的Java文件。这也是因为Selenium IDE的导出应该是不可知的,无论如何运行测试。比如说,如果我是jUnit的用户……如果Selenium IDE总是将其导出到TestNG中,那就不公平了。老实说,我宁愿自己创建我的测试,也不想每次创建测试文件时都改变那一行。
您可以阅读一项名为“为什么Web应用程序的记录/重放测试会失败?”的研究的全部内容。链接为:Why do Record/Replay Tests of Web Applications Break?

4
完全同意。UI自动化应被视为编程工作。IDE不能生成最有效的定位器,但有经验的程序员可以。IDE无法生成嗅觉良好的良好结构化测试套件,而优秀的程序员应该能够做到这一点。此外,有时需要在适当时候更改源代码(例如,对于复杂的AJAX ExtJS Web应用程序)。 - Yi Zeng
您实际上可以选择要将测试导出到哪种格式(支持JUnit和TestNG)-请参见我的答案。 - Marielle
1
另一个好的原因是因为Selenium IDE命令基于Selenium 1.0(远程控制)。我的意思是,例如,在Selenium IDE和RemoteControl(已弃用)中都有“highlight”命令,但在Selenium 2.0(webdriver)中没有highlight命令,这将在100%的时间内失败。 - discostu
1
你没有任何具体的例子,整个回答都是道听途说。“程序员应该编写测试”为什么?“并维护测试”为什么?“质量保证人员应该接受编写和维护自己测试的培训”为什么?“但是当测试在后面开始失败时会发生什么?”好的,比如怎样?完全没有任何例子 - 8protons
1
研究链接现在已经失效。 - kiwicomb123
显示剩余12条评论

12
为什么不能只记录所有的测试用例在Selenium IDE中,将其导出为Java/WebDriver运行,并在Eclipse中使用WebDriver运行它。
您实际上可以很容易地在Selenium IDE中完成这个操作。在Selenium IDE中记录测试用例/测试套件,将其导出为“Java/JUnit 4/Webdriver”到一个.java文件。这将生成一个JUnit测试,您可以从Eclipse中导入并运行(当然需要正确版本的JUnit)。
它不是100%可靠的,您可能需要进行一些手动更改/修正,但总体而言效果相当不错。从一个小的测试用例开始,逐步扩大规模。

1
非常感谢您告诉我这个问题,但是当我在Webdriver中运行测试时,使用相同的约定会失败,而在IDE中则会通过!! - Sagar
2
它在哪里失败了?你能分享一下你脚本的相关部分吗?(包括IDE和Java)? - Marielle
你可能需要进行调整。它可能不会直接起作用,并且可能与依赖关系有关。我们使用抽象测试用例设置了一个Java项目,然后创建了自己的格式化程序来捕获测试用例。要启用此功能,请单击“选项”->“选项”,并在“常规”选项卡上启用实验功能。然后转到格式并添加。这是我们使用的自定义格式化程序的示例:https://gist.github.com/brettcave/9504827。在开始扩展之前,请先让一个简单的open("/")测试用例正常工作。 - Brett

9
为什么不直接在IDE中录制并使用WebDriver播放录制?但是,IDE不知道等待什么。假设Bob正在执行手动检查并记录他与Selenium IDE的交互。他执行了一个需要一段时间更新GUI的操作,在操作完成后,他单击了一个按钮。Bob知道GUI已经完成更新,因为在操作开始时显示的旋转器在操作完成时被移除。IDE如何捕捉到操作必须在单击按钮之前完成的事实?这不是一个假设情况:当您测试动态表格(如由DataTables管理的表格)时,用户可以随时更改任何内容。这可能是使用IDE创建的一系列命令会失败的原因之一。它只是不知道该等待什么。
在IDE中手动添加等待是可能的,但是如果您这样做,那么您就不再“只是记录所有测试用例”了。而且您所做的就更像是为WebDriver编写代码。
用户效率低下。不久前,有一个Selenium问题,用户想让Selenium点击具有多个记录页面的表格中的最后一条记录。问题是,如何翻页并一直滚动到最后一页,然后单击最后一条记录?有人(也许是我,也许是其他人)指出,如果表格是可排序的,则可以按相反的顺序进行排序,然后Selenium代码可以单击第一条记录。这是2个操作而不是p+1次操作,其中p是页面数,加上1次单击记录。
当我们为WebDriver编写代码时,有机会编写测试以避免掉入一个弯路来获得我们想要的结果。关于为什么它很重要的技术细节请参见下一个点。
Selenium操作可能很昂贵。如果运行Selenium命令的软件和浏览器在本地,则您可能不认为Selenium操作很昂贵,但是如果在一台机器上运行命令并且浏览器是远程的,则您将注意到显着的减速。例如,如果在Sauce Labs VM或BrowserStack VM中生成浏览器来运行测试套件,则网络延迟将增加使套件完成所需的时间。对于完整的应用程序测试套件,这可能意味着需要更多的分钟。
IDE生成一系列每个都需要在Selenium脚本和浏览器之间进行往返的命令。每个往返都会累积。假设我想检查两个元素是否包含相同的文本。我不会使用Selenese,因为我通常不使用IDE,但是使用Python中的WebDriver代码,脚本可能是:
a = driver.find_element_by_id("a")
b = driver.find_element_by_id("b")
assert_equal(a.text, b.text)

这段代码需要4次往返:每个find_element...都需要一次往返,每个对text字段的访问也需要一次往返。同样的测试可以这样编写:

a_text, b_text = driver.execute_script("""
var a = document.getElementById("a");
var b = document.getElementById("b");
return [a.textcontent, b.textContent];
""");
assert_equal(a_text, b_text);

这只需要一次往返传输。当您使用IDE记录操作时,命令序列类似于之前的片段:有很多往返传输。当您为WebDriver编写代码时,您有机会在编码时进行优化。
这并不意味着Selenium IDE没有用处,但我永远不会想到仅使用它来记录测试,然后使用WebDriver播放这些录音。

3

如果你是一个新手,你实际上可以使用80%的IDE脚本作为你的webdriver JAVA脚本,你只需要稍微改进一下你导出的IDE脚本就可以了。

但是当你开始测试复杂的功能时,你必须学习一些基本的Java方法来解决问题!


2
我不同意。在记录和回放简单的操作时,不需要维护额外的代码就可以在短时间内实现相同的结果。
我同意记录脚本必须具有灵活性的做法。它不能只是简单的内置命令,而且人们必须使其具有灵活性,甚至实现自己的宏(即应用于测试的特定命令/别名)。
尽管如此,如果正确实施,并借助于一些 Selenium IDE 插件(例如流程控制),通过 HTML Runner 播放此类复杂测试套件变得非常容易。我已经使用 Selenium IDE HTML 脚本完全覆盖了复杂站点,并将同一脚本重用于应用程序的所有响应模式。
维护很简单,因为 IDE 将帮助您快速调整失败的命令,AJAX 等待可以通过等待页面上 DOM 内容更改来正确地处理。我仍然不相信这种 AJAX 借口来排除 Selenium IDE。
有关 Maven 集成流控制命令/别名/宏与 Maven 的 SureFire 测试插件,请参见: https://github.com/paulbors/sideflow 欢迎在您的产品中使用并根据需要进行改进。

1
因为当您的代码复杂度增加时,使用IDE进行管理将变得困难。使用IDE维护您的脚本也会变得困难。
此外,从IDE导出测试用例到webdriver并不完全可靠。

1

Webdriver允许您在Selenium服务器或通过RC到多个服务器上执行使用Selenium IDE捕获的测试用例。这包括与支持Selenium的提供商集成的选项(请参见底部链接)。

例如,如果您已经在IDE中捕获了测试用例,您可以轻松地与自己的Selenium服务器或像Saucelabs这样的提供商集成,以处理在Ubuntu上的Firefox,OSX上的Safari和Windows 8上的IE10中运行测试用例。与任何测试用例一样,您可以从IDE(Eclipse / IDEA /等),构建器(maven / gradle /)和/或通过CI系统运行它。

查看https://saucelabs.com/selenium获取一些示例。我们还将我们的Selenium测试用例用于Soasta的负载测试-WebDriver允许在许多不同的上下文中使用简单的IDE测试。


对于我的团队来说,这是最重要的答案。在IDE中进行录制非常容易,手动编辑Selenese比.NET或Java容易得多,Webdriver可以更快地将我们从新功能带到成功测试 - 除了没有一个Selenium提供商会导入Selenese。 - andrew lorien

0
其他人已经给出了很多有帮助的答案。有一件事情被忽略了,那就是如果你编写代码而不是使用IDE,你就有权力对数据库进行更改。这取决于你正在测试的网站有多有用,但以下是我经历过的一些有用的例子。在某种情况下,网站有多个班级的部分。我们的一个测试是将这些部分合并为一个。IDE无法做到这一点。但是通过webdriver,我们可以将所有的测试数据添加到数据库中,执行合并操作,然后从数据库中删除数据。
webdriver的另一个优势是Selenium Grid。通过Grid,您可以并行运行测试,并在多个浏览器上运行。这使得您的测试运行更快,您可以更全面地测试代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接