了解API
Selenium RC API使用命名约定,假定你理解Selenese,大量的接口是自解释的。在此,我们解释最关键以及可能不太明显的内容。
启动浏览器
setUp("http://www.google.com/", "*firefox");
这些示例中的每一个打开浏览器,并分配浏览器“浏览器实例”给一个程序变量以代表这个浏览器。这个程序变量被使用于调用来自于浏览器的方法。
创建浏览器实例需要的参数是:
host指定服务器位于的计算机的IP地址。通常,这是与客户端运行的相同的机器,在这种情况下,可以是localhost。在某些客户驱动程序中中,这是一个可选参数。port指定服务器侦听等待客户连接的TCP/IP socket端口。在某些客户驱动程序中这也是可选的。brower是你希望运行测试的浏览器。这时一个必须的参数。url测试中的应用程序的基url。这是所有的客户端库所必须的,这是用于启动browser-proxy-AUT通讯的地完整信息。
注意,某些客户端库要求,要启动浏览器必须显式地调用它的start()方法。
运行命令
一旦你有一个初始化的浏览器,并分配给一个变量(通常命名为“selenium”),你可以从浏览器变量,通过调用不同的方法让它运行Selenese命令。
selenium.type(“field-id”,”string to type”)
在后台,浏览器将实际执行一个键入操作,基本上与一个用户在浏览器中键入一样,但使用定位器和在调用中指定的字符串。
报告结果
Selenium RC没有它自己的、用于报告的机制,他允许你使用选择的编程语言按需构造一个报告。这很好,但如果你仅仅想要那些已经为你准备好的东西哪?时常一个现存的类库或测试框架可以满足你的需要,比你自己开发测试报告代码更快。
测试框架报告工具
对许多编程语言来说,测试框架是可得到的。这些,以及它们的主要功能,那个提供的一个灵活的测试引擎用来执行你的测试代码的,包括用于报告结果的库代码。例如,Java有两个常用的测试框架,JUnit和TestNG,.NET也有它自己的NUnit。
我们不会在此讲解框架本身;那个超出了本用户指南的范畴。我们仅仅介绍框架的特征,那些与Selenium有关的以及你应用的某些技术。在internet上,可以获得有关这些测试框架的很好的数据以及相关的信息。
测试报告库
用于使用你选择的编程语言报告测试结果的,特别创建的第三方库也是可得到的。这些时常支持各种各样的格式,包括HTML或PDF。
最好的方法是什么?
大部分测试框架的新手从使用框架内置的报告功能开始。从那里大多数人可以查看任何可得到的库,因为这比开发自己的要花更少的时间。当你开始使用Selenium时,毫无疑问你会为报告过程开始投入你自己的“打印语句”。那会逐步地引导你开发你自己的报告,或并行地使用一个库或测试框架。不管怎样,在一个初期的,但很短的学习曲线后,你会自然地开发适合你情况的效果最好的东西。
测试报告示例
为了演示,我们会引导你使用某些特定的、Selenium支持的某些语言的工具。在此列出的是由指南的作者常用的,以及得到广泛使用的工具。
测试报告为Java
- 如果Selenium测试案例的开发使用JUnit,则JUnit报告可以被使用于生成测试报告。详细说明参考JUnit Report
- 如果Selenium测试案例使用TestNG开发,则生成测试报告没有额外的工作需要做。TestNG框架生成一个HTML报告,列出测试结果的详细信息。更多的信息参见TestNG Report。
- ReportNG是TestNG框架的一个HTML报告插件。用于作为一个默认TestNG的HTML报告的替代。ReportNG提供一个简单、代码着色的测试结果视图。更多的信息参见ReportNG。
- 同样,如果需要一个很好的概要报告可试用一下TestNG-xslt。一个TestNG-xslt看起来像这样。
更多的信息参见TestNG-xslt。
日志Selenese命令
- Logging Selenium可以用于生成在你的测试中所有Selenese命令以及每个执行成功或失败的报告,Logging Selenium扩展Java客户端驱动程序以增加Selenese的日志能力。请参考Logging Selenium。
测试报告为Phython
- 当使用Python客户端驱动程序时,可以使用HTML TestRunner生成测试报告。参见HTML TestRunner。
测试报告为Ruby
- 使用Ruby,如果RSpec被使用于编写Selenium测试案例,那么它的HTML报告可以用于生成测试报告。参考RSpec Report以获得更多信息。
注释
如果你对一个语言无关的独立日志将做什么感兴趣,可以看看Selenium Server Logging。
增加某些调味瓶到你的测试
现在我们将接触到使用Selenium RC的全部理由,增加编程逻辑到你的测试。它与任何程序是相同的。程序流使用条件语句和迭代进行控制。此外,你可以报告进度信息使用I/O。在本节,我们将展示某些编程语言构造如何与Selenium结合解决公共的测试问题的示例。
你会发现,当你从简单的页面元素存在性的测试,到涉及多Web页的动态功能和变化的数据的测试转换时,你会需要编程逻辑来验证预期的结果。基本上,Selenium IDE不支持迭代和标准的条件语句。你可以使用嵌入在Selenese参数的javascript完成某些条件语句,然而迭代是不可能的,而且大多数的条件语句使用一个编程语言更容易完成。此外,你可能需要异常处理用于错误恢复。为这些以及其他的理由,我们编写了本节去演示公共编程技术的使用,以便给于你在自动化测试中一个极大的“验证能力”。
在本节的示例是使用C#和Java编写的,然而这代码是简单的,可以容易地改写到其他支持语言。如果你有有关面向对象编程语言的基础知识,你应该没有困难理解本节。
迭代
迭代是人们需要在他们的测试中完成的最普通的事情之一。例如,你可能希望执行一个搜索多次。或者,或许为了验证你的测试结果,你需要处理从一个数据库返回的“结果集”。
使用我们较早使用的相同的Google搜索示例,让我们检查Selenium搜索结果。这个测试可以使用Selenese:
open /
type q selenium rc
clickAndWait btnG
assertTextPresent Results * for selenium rc
type q selenium ide
clickAndWait btnG
assertTextPresent Results * for selenium ide
type q selenium grid
clickAndWait btnG
assertTextPresent Results * for selenium grid
这个代码已经被重复运行这相同的步骤3次。相同代码的多个拷贝不是一个好的编程实践,因为需要做更多的工作去维护。通过使用编程语言,我们可以迭代搜索结果,提供一个更灵活和可维护的解决方案。
用C#:
// 一个字符串的集合
String[] arr = {"ide", "rc", "grid"};
// 循环执行数组中的每隔字符串
foreach (String s in arr) {
sel.open("/");
sel.type("q", "selenium " +s);
sel.click("btnG");
sel.waitForPageToLoad("30000");
assertTrue("Expected text: " +s+ " is missing on page.", sel.isTextPresent("Results * for selenium " + s));
}
条件语句
为了演示在测试中使用条件语句,我们从一个示例开始。在运行Selenium测试时,一个公共的问题会出现,当在页面中某个预期的元素是不可得到时。例如,当运行下面的代码行时:
selenium.type("q", "selenium " +s);
如果元素“q”不在页面上,那么一个异常会抛出。
com.thoughtworks.selenium.SeleniumException: ERROR: Element q not found
这可能造成造成你的测试退出。对某些测试,那是你想要的。但当你的测试脚本有许多其他后面的测试的时候,这经常不是你想要。
一个更好的方法是首先验证元素是否真正地呈现,然后在没有的情况下采用替代的操作。让我们以Java为例。
// 如果元素是可得到的,则执行键入操作
if(selenium.isElementPresent("q")) {
selenium.type("q", "Selenium rc");
} else {
System.out.printf("Element: " +q+ " is not available on page.")
}
这个方法的好处是可以继续测试的执行,即使某些UI元素是不可得到的。
从你的测试执行JavaScript
执行JavaScript非常方便。Selenium API的getEval方法可以使用于从Selenium RC执行JavaScript。
考虑一个包含一个没有静态标识符的复选框的应用程序。在这种情况下,你可以从Selenium RC执行JavaScript获得所有复选框的id,然后检查它们。
public static String[] getAllCheckboxIds () {
String script = "var inputId = new Array();";// Create array in java script.
script += "var cnt = 0;"; // Counter for check box ids.
script += "var inputFields = new Array();"; // Create array in java script.
script += "inputFields = window.document.getElementsByTagName('input');"; // Collect input elements.
script += "for(var i=0; i<inputFields.length; i++) {"; // Loop through the collected elements.
script += "if(inputFields[i].id !=null " +
"&& inputFields[i].id !='undefined' " +
"&& inputFields[i].getAttribute('type') == 'checkbox') {"; // If input field is of type check box and input id is not null.
script += "inputId[cnt]=inputFields[i].id ;" + // Save check box id to inputId array.
"cnt++;" + // increment the counter.
"}" + // end of if.
"}"; // end of for.
script += "inputId.toString();" ;// Convert array in to string.
String[] checkboxIds = selenium.getEval(script).split(","); // Split the string.
return checkboxIds;
}
计算页面中图像的数量:
selenium.getEval("window.document.images.length;");
记住在DOM表达式中使用windows对象,因为默认引用window,而不是测试窗口。
© Copyright 2008-2012, Selenium Project. Last updated on Feb 02, 2012.