在测试运行期间,如何防止Selenium RC窃取窗口焦点?

时间:2011-04-11 18:56:39

标签: java firefox selenium focus acceptance-testing

我知道我可能只是少数,但我必须在我的测试运行的同时使用我的机器。我总是遇到的问题是,当我使用Selenium RC运行测试用例时,浏览器窗口总是在窃取焦点。这使我无法在我退出之前的一天结束时每天多次运行我的测试。我试过Selenium Grid,但是我不能让它只监听localhost上的请求,而不是0.0.0.0(来自我的网络管理员的要求)。

我已经挖掘了Selenium文档和大量的Selenium网站,但我还没有找到明确的答案。在我的测试运行时,我可以阻止Selenium RC测试窃取窗口焦点吗?

我正在使用Firefox 3.6.13。

8 个答案:

答案 0 :(得分:10)

在Linux上,您可以在不同的显示器上启动vncserver(例如:8或其他),然后让Selenium和您的Firefox实例使用该显示器。在我工作的地方工作得很好。

答案 1 :(得分:6)

VM中运行它。具有在不同操作系统和浏览器下测试能力的额外好处。

据我所知,你无法避免在同一台机器上偷走焦点。

答案 2 :(得分:5)

你在运行linux吗? FirefoxProfile类的设置文档很少,加载了一个特殊的库以避免在linux上集中窃取 - 将其设置为true:

http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/firefox/FirefoxProfile.html#setAlwaysLoadNoFocusLib(boolean)

答案 3 :(得分:2)

我们通过在测试之间共享selenium实例来解决这个问题。然后,selenium在整个测试运行期间只试图窃取一次焦点,这不是太糟糕。

如果您使用JUnit编写Selenium脚本,则可以使用Spring的SpringJUnit4ClassRunner将selenium实例注入bean。

为Spring selenium.xml定义一个测试上下文(如果您不熟悉如何设置Spring XML配置文件,请查看它)并包含一个selenium实例:

<bean class="com.thoughtworks.selenium.DefaultSelenium" name="selenium">
    <constructor-arg index="0">
        <value>localhost</value>
    </constructor-arg>
    <constructor-arg index="1">
        <value>4444</value>
    </constructor-arg>
    <constructor-arg index="2">
        <value>*firefox</value>
    </constructor-arg>
    <constructor-arg index="3">
        <value>http://localhost:8080/webapp/</value>
    </constructor-arg>
</bean>

然后在您的测试中,注入selenium实例而不是new':

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:selenium.xml")
public class WebappIT {

    @Resource
    private Selenium selenium;

    ... test code ...

}

我有点简化了这一点,在我们的实际代码中,我们将selenium实例包装在一个提供者类中,这样我们只能调用selenium.start()一次。

答案 4 :(得分:2)

<强>更新

我找到了解决Firefox窗口问题的解决方法。如果您像我一样运行Selenium作为独立服务器,那么您可以添加:

-browserSessionReuse

启动Selenium测试用例的ant任务。这样可以节省大量时间,因为在运行selenium测试时,我不必等待两个新的Firefox窗口打开。解决方法是,如果每个测试都是独立测试,则每次测试开始时都必须注销站点。我通过编辑登录方法来快速完成此操作以查找我的注销链接。如果存在注销链接,则我的测试会单击注销链接,并等待登录页面可用,然后继续测试。

答案 5 :(得分:1)

我们不能在同一台机器上做到这一点。要么我们需要VM,要么我们应该在控制器级别对它进行编程,这样我们的脚本就不会启动任何浏览器来运行脚本。

答案 6 :(得分:1)

使用chrome而不是firefox为我工作。只需在另一个工作区启动它就可以了。

答案 7 :(得分:0)

如果您在Linux上运行,则可以使用多个桌面并设置为浏览器以始终在特定桌面上打开,并在不同的桌面上打开IDE。 这就是我在Ubuntu中的表现,需要5分钟:https://askubuntu.com/a/90014