我的两条Selenium经验
作者:陶文
1. 使用Selenium测试NTLM的问题
- 使用Firefox浏览器
主要的问题是Firefox默认情况下是不会发送客户端验证给服务器的。它会弹出一个对话框让你输入用户名和密码。当你使用Selenium来测试网站的时候,当然需要自动化,不能手工输入了。所以你就需要修改Firefox的设置,让它能够自动发送验证信息。但是问题是,Selenium为了设置它的代理,它会创建一个自定义的设置文件,然后启动Firefox的时候使用这个设置文件而不是使用已经存在的设置。可以通过给FirefoxCustomProfileLauncher类打一个补丁,让它在输出的时候多写一行设置:
network.automatic-ntlm-auth.trusted-uris
设置这个值为true
- 使用IE浏览器
Selenium会在测试时给IE设置一个代理。这个代理不是设置给所有HTTP请求的。它会判断这个请求是不是发送给Selenium服务器的。所以它会设置一个PAC文件给IE,让其根据URL选择代理。我观察到的问题是,只要使用了这个PAC文件,IE在遇到了NTLM验证时,自动直接就失败了,连给你输入用户名密码的机会都没有。解决办法是给这个PAC文件添加一个ELSE分支,在没有代理的时候返回"DIRECT;"
2.在JUnit中运行Selenium
JUnit的一个问题是只有TestCase级别的SetUp和TearDown方法(可能JUnit4有了,我不大清楚)。所以要在JUnit中运行多于一个的TestCase,也就是组成一个TestSuite,就遇到了问题。只有一个TestCase的时候,我们可以在SetUp的时候启动要测的程序,启动Selenium服务器,然后启动Selenium客户端。在TearDown的时候在一个个的关掉。但是是TestSuite,就会在一组测试之间反复多次的启动和停止服务器,这是相当耗费时间的。解决办法就是提供一个TestSuite层面的SetUp和TearDown。在网络上搜索到了下面这个解决方案:
Simon Brown's Blog - Global setUp() and tearDown() in JUnit tests
利用静态初始化块做来SetUp,利用ShutDownHook来TearDown。这实际上是JVM级别的SetUp和TearDown了。我认为对于JUnit运行Selenium来说还是相当方便的:
public abstract class SomeTestCase extends TestCase {
static {
Runtime.getRuntime().addShutdownHook(new SomeTestCaseShutdownHook());
}
}
注:JUnit4有新增的两条annotation:BeforeClass和AfterClass可以正常的工作,可以不使用3.8上需要的这种trick。但是缺点在于JUnit4需要配合Ant 1.7beta才可以,因为Ant 1.7还没有正式发布,比较别扭。在测试需要登陆注销的网站来说,使用JUnit4还是划算的,这样可以复用这部分操作。具体相关经验请参照其它文章:D
IE在遇到了NTLM验证时,自动直接就失败了,连给你输入用户名密码的机会都没有。解决办法是给这个PAC文件添加一个ELSE分支,在没有代理的时候返回"DIRECT;"
你好,我正好也碰到这个问题,请问如果给这个pac文件加else分支呢?
另外,我还有两 个问题,
1。 请问你知道如何用selenium RC 来解决 showmodaldialog打开新窗口的问题吗?我很头大啊
2。 我在mac os x下用selenium Rc 通过safari来打开https网站,总是说验证不通过,即便用该公司提供的最新的certificates证书也不行,
我的QQ: 113529932
不胜感激!
林勇