有没有办法为需要很长时间的事情编写一个selenium脚本?

时间:2015-09-09 12:03:38

标签: java selenium testing automated-tests

背景

我有一个允许公司做广告的网站。部分程序是选择开始和完成广告的日期。这意味着广告应该在其日期出现之前处于非活动状态。

我正在使用Testng,Maven和Jenkins的selenium测试在我的服务器上运行无头测试。这些测试应涵盖网站的每个区域,我刚刚达到广告,但无法看到我将如何测试广告。

我的测试需要制作一些广告,看看它是否在第二天上线,但我不知道如何用硒测试。

我可以使用我的脚本创建广告没有问题但是看不到它是否明天上线而没有像一天长线程睡眠这样的愚蠢。

问题

这种测试是否可以通过解决方法实现?或者这是Selenium无法处理的事情?或许我会以错误的方式解决这个问题?

3 个答案:

答案 0 :(得分:3)

  

或者这是Selenium无法处理的事情吗?

Selenium可能会处理它。您必须定期轮询以确保Selenium的某些部分不会决定超时,因为它认为其他部分已经死亡。您可以通过执行空JavaScript脚本(executeScript(""))来完成此操作。但是,我根本不推荐这个,因为......

  

或者我可能以错误的方式解决这个问题?

是的,你是。您应该做的是设计您的测试,以便您必须等待一天才能看到逻辑是否正常运行。每当我测试将在截止日期前提供结果的流程时,我确保我有能力进行测试,不要求测试暂停的时间超过执行测试所需的时间。有很多方法可以做到这一点,最好的方法取决于您在问题中没有分享的应用程序的详细信息。有时覆盖配置选项效果很好。有时改变系统确定时间的方式很有效。有时你还需要别的东西。

在测试期间等待的时间是每次运行测试时都会重复的成本。在项目期间,这可能会导致数周的生产力损失。

答案 1 :(得分:2)

您可以将now的计算提取到服务

public interface DateSource {
    Date getNow();
}

在生产中,这可以获得当前日期

public class DefaultDateSource implements DateSource {
    public Date getNow() {
       return new Date();
    }
}

在测试中,您可以使用可配置的DateSource

public class TestDateSource implements DateSource {
    private Date now;

    public Date getNow() {
       if (now == null) throw new RuntimeException("TestDateSource not setup");
       return now;
    }

    public void setNow(Date now) {
       this.now = now;
    }
}

使用您选择的IOC容器,您可以在服务中配置@Inject DateSource。对于测试,您可以注入TestDateSource并根据需要调整值。

使用示例:

public class AdvertisingService {
    private final DateSource dateSource;

    public AdvertisingService(DateSource dateSource) {
       this.dateSource = dateSource;
    }

    public boolean isActive(Advert advert) {
       Date now = dateSource.getNow();
       return advert.startDate.before(now) && advert.endDate.after(now);
    }
}

答案 2 :(得分:0)

Selenium不会提供关于“何时测试”的开箱即用的东西,但你可以使用类似Quartz调度程序的东西,使用cron表达式在某些固定时间在套件中运行测试。文档here