硒批判

时间:2020-03-06 14:24:49  来源:igfitidea点击:

我只是想从运行Selenium(http://selenium.openqa.org)的人们那里获得一些意见。我在WaTiN上有很多经验,甚至为此编写了一个录音套件。我让它产生一些结构良好的代码,但仅由我自己维护,似乎我的公司几乎放弃了它。如果我们使用过硒,我们是否取得了很多成功?我将使用.NET 3.5,Selenium是否可以正常使用?代码是干净的还是仅仅是所有交互的列表? (http://blogs.conchango.com/richardgriffin/archive/2006/11/14/Testing-Design-Pattern-for-using-WATiR_2F00_N.aspx)分布式测试套件的公平程度如何?

系统上的任何其他困扰或者赞美将不胜感激!

解决方案

如果我们正在使用Selenium IDE生成代码,则只需获取selenium将要执行的每个动作的列表。对我来说,Selenium IDE是启动或者进行快速的"尝试一下"测试的好方法。但是,当我们考虑可维护性和更易读的代码时,必须编写自己的代码。

实现良好的硒代码的一种好方法是使用页面对象模式,使代码代表导航流程。这是我在Coding Dojo Floripa(来自巴西)中看到的一个很好的例子:

public class GoogleTest {

    private Selenium selenium;

    @Before
    public void setUp() throws Exception {
            selenium = new DefaultSelenium("localhost", 4444, "*firefox",
                            "http://www.google.com/webhp?hl=en");
            selenium.start();
    }

    @Test
    public void codingDojoShouldBeInFirstPageOfResults() {
            GoogleHomePage home = new GoogleHomePage(selenium);
            GoogleSearchResults searchResults = home.searchFor("coding dojo");
            String firstEntry = searchResults.getResult(0);
            assertEquals("Coding Dojo Wiki: FrontPage", firstEntry);
    }

    @After
    public void tearDown() throws Exception {
            selenium.stop();
    }

}

public class GoogleHomePage {

    private final Selenium selenium;

    public GoogleHomePage(Selenium selenium) {
            this.selenium = selenium;
            this.selenium.open("http://www.google.com/webhp?hl=en");
            if (!"Google".equals(selenium.getTitle())) {
                    throw new IllegalStateException("Not the Google Home Page");
            }
    }

    public GoogleSearchResults searchFor(String string) {
            selenium.type("q", string);
            selenium.click("btnG");
            selenium.waitForPageToLoad("5000");
            return new GoogleSearchResults(string, selenium);
    }
}

public class GoogleSearchResults {

    private final Selenium selenium;

    public GoogleSearchResults(String string, Selenium selenium) {
            this.selenium = selenium;
            if (!(string + " - Google Search").equals(selenium.getTitle())) {
                    throw new IllegalStateException(
                                    "This is not the Google Results Page");
            }
    }

    public String getResult(int i) {
            String nameXPath = "xpath=id('res')/div[1]/div[" + (i + 1) + "]/h2/a";
            return selenium.getText(nameXPath);
    }
}

希望有帮助

我正在使用Selenium Remote Control来测试ASP.Net应用程序(这也是我假设我们也将定位的目标),并且效果很好。

如果我们从未使用过Selenium,请观看一些使用Selenium IDE的截屏视频。这将使我们对"硒"的工作原理有个很好的了解。 IDE是一个firefox插件,基本上可以让我们随时进行快速的记录和播放测试。对于较大的测试套件或者编写真正可维护的测试,我建议使用Selenium Remote Control。 (如果我们只是一个入门,那么IDE很棒。)

Selenium远程控制使我们可以使用自己喜欢的语言和单元测试框架来驱动Web浏览器以执行测试。如果我们最熟悉C#/ NUnit,则可以用这种方式编写测试并使用我们喜欢的所有NUnit好东西。 (例如,Test-Driven.net插件)。同样,由于测试是用高级语言编写的,因此我们可以执行从特定测试类继承的操作,从而使实际测试方法代码更简洁。 (或者至少就是我编写测试的方式。它可以让我测试复杂的场景,从而使测试方法的行数保持在合理的数量。)

我们提到了分布式测试。不幸的是,我还没有找到在NUnit中使用Selenium Grid项目的方法。 Selenium Grid允许我们在许多不同的机器和浏览器实例上执行测试套件。因此,我们可以将负载分散到一台或者多台计算机上的四个Grid实例(即一次在四个不同的浏览器实例中运行)上,而不是一个接一个地运行200个测试方法。关于我们想要获得的分布。

如果我们使用Java或者PHP编写测试,则可能会更好。我希望NUnit2.5发行时可以通过NUnit提供此功能,其中包括用于并行测试的pNUnit。

如果我们对硒还有其他疑问,请澄清原始问题,我们很乐意为我们提供帮助。 (硒只是我每天使用的那些工具之一,因此我很乐于帮助新人们开始使用它。)

我从Selenium IDE和Selenium Core开始。这些绝对是入门的好工具。但是它们并不是很强大,因为我们只能使用Selenese(Selenium的基于HTML的逐个命令的语言)。

现在,我将Selenium Remote Control与Ruby驱动程序一起使用,这使我可以利用Ruby提供的功能。我测试了许多环境:Windows 2000,XP,Vista,Mac 10.4 / 10.5,以及适用于每种环境的Safari 2/3,Firefox 2/3,Internet Explorer 6/7.

Selenium声称与所有这些OS和浏览器兼容,尽管我目前在Internet Explorer中遇到问题(实际上我在StackOverflow上的第一个问题就是关于此的问题)。但是我不知道有什么其他强大的工具可以在如此众多的平台上使用。

我对Selenium遇到的最大问题是DOM解析。 JavaScript的childNodes不可靠,因为Safari / Firefox会忽略空格和注释节点,而Internet Explorer不会。 Internet Explorer中的XPath比SF / FF中的XPath慢10到20倍。在IE中,innerHTML并不总是可靠的。

硒是相当不错的工具,但有几件事情需要注意:

  • Selenium IDE和Selenium核心不共享100%相同的功能。例如,IDE支持右键单击,但当前的核心发行版不提供此功能。但是,使用其存储库中的较新版本可以解决此问题。
  • 如果是ext js,gwt等,请确保为显示元素具有正确的ID,而不是自动生成(随机)的ID。
  • 维护测试用例。我已经看到在硒测试和良好覆盖率方面进行了大量工作的情况。后来测试开始失败,因为创建它们的人忙于其他任务,没有其他人想要触摸它们。但这是管理问题,而不是硒问题。

我是硒的忠实粉丝。不过,最好提前知道一个主要的陷阱,那就是Selenium IDE在弹出窗口方面有很多麻烦。这些问题在Selenium RC中并不存在,但可能会使开发工作有些头疼。