在无头Chrome中针对Angular应用程序运行Selenium测试

时间:2018-08-29 19:40:20

标签: angular selenium spring-boot integration-testing google-chrome-headless

我正在尝试针对Angular应用程序创建Selenium测试。我希望这些测试能在我的连续集成版本中运行,因此有必要以无头模式运行它们。我正在尝试使用无头Chrome。

我创建了两个简单的Selenium测试。一个测试访问我的本地Angular应用程序,另一个测试访问Google。当我使用Chrome GUI运行它们时,它们都能完美运行,但是当我切换到无头Chrome时,Angular测试失败。

我在Angular测试中打印出页面源,并且在使用Chrome GUI时正确显示了所有HTML,但是当我切换为无头时,页面源仅显示空的headbody标签。

为什么会这样,我该如何解决?

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ExampleSeleniumTest {

    @LocalServerPort
    private int port;

    @Autowired
    private WebDriver driver;

    @Test // Always works
    public void testGoogle() {
        driver.get("http://www.google.com");
        WebElement element = driver.findElement(By.name("q"));
        element.sendKeys("Cheese!");
        element.submit();

        List<WebElement> findElements = driver.findElements(By.xpath("//*[@id='rso']//h3/a"));

        for (WebElement webElement : findElements) {
            System.out.println(webElement.getAttribute("href"));
        }
        Assert.assertTrue(findElements.size > 0);
    }


    @Test // Breaks in headless mode
    public void testLocalAngular() {
        driver.get("localhost:" + port);
        String pageSource = driver.getPageSource();
        // Page source empty in headless mode
        System.out.println(pageSource);
        String title = driver.findElement(By.className("mat-card-title")).getText();
        Assert.assertEquals("My Starter", title);
    }
} 

这些测试取决于以下配置

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@ComponentScan(basePackageClasses = MyStarterApplication.class)
public class SeleniumConfig {

    @Value("${selenium.headless:#{true}}")
    private boolean headless;   

    @EventListener(classes = ApplicationReadyEvent.class)
    public void prepareDriver() {
        // Using https://github.com/bonigarcia/webdrivermanager
        ChromeDriverManager.getInstance().setup();
    }

    @Bean(destroyMethod = "quit")
    public WebDriver webDriver() {
        ChromeOptions options = new ChromeOptions();
        if (headless) {
            options.addArguments("headless");
            options.addArguments("window-size=1200x600");
        }
        WebDriver driver = new ChromeDriver(options);
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        return driver;
    }

}

1 个答案:

答案 0 :(得分:0)

该问题是由以下原因引起的:

driver.get("localhost:" + port);

我需要指定协议。我的测试用例可以使用:

driver.get("http://localhost:" + port);